Docker의 고급사용법 (Docker volume)
목표
- Docker volume의 구조에 대해서 이해합니다.
01. Docker Volume
- 데이터가 남아있게 하려고(데이터 영속성): 컨테이너는 쓰고 나면 사라지는데, 볼륨을 쓰면 컨테이너가 사라져도 데이터는 그대로 남아요.
- 같은 데이터를 여러 컨테이너가 쓸 수 있게: 볼륨 덕분에 여러 컨테이너가 같은 데이터를 함께 쓸 수 있어요. 이렇게 하면 데이터를 여기저기 복사할 필요가 없죠.
- 데이터 백업하고 옮기기 쉽게: 볼륨을 쓰면 데이터를 백업하거나 다른 컴퓨터로 옮기기가 편해져요.
- 더 빨리 돌아가게: 때로는 볼륨을 쓰는 게 데이터를 더 빠르게 처리할 수 있게 해줘요, 특히 많은 양의 데이터를 다룰 때 유용하죠.
- 데이터를 더 안전하게 보관하려고: 볼륨을 사용하면 중요한 데이터를 컨테이너 밖에 따로 안전하게 보관할 수 있어요. 이렇게 하면 보안도 더 좋아지죠.
- 코드와 데이터를 따로 두려고: 볼륨을 쓰면 코드를 바꿔도 데이터는 그대로 유지할 수 있어서, 개발이나 운영할 때 편리해요.
- Docker 공식 사이트에서는 volume, bind mount, tmpfs mount 중에 volume을 가장 추천해요

volume
- 볼륨이 뭔가요? 볼륨은 컴퓨터에 따로 만들어진 폴더 같은 거예요. Docker가 이 폴더를 관리해서 우리가 쓰는 데이터를 여기에 저장해요.
- 어디에 만들어지나요? Docker는 보통 볼륨을 컴퓨터의 특정 폴더 (대부분 **/var/lib/docker/volumes/**라는 곳) 에 만들어요.
- 볼륨의 좋은 점은 뭐가 있나요?
- 백업하고 옮기기 쉬워요: 볼륨은 데이터를 다른 곳으로 옮기거나 백업하기가 편해요.
- Docker 명령어로 관리해요: 컴퓨터에 있는 Docker 프로그램 명령어나 인터넷으로 연결된 API를 써서 볼륨을 관리할 수 있어요.
- 어디서나 잘 돌아가요: 볼륨은 리눅스나 윈도우, 어떤 컨테이너에서도 잘 작동해요.
- 여러 컨테이너에서 안전하게 쓸 수 있어요: 볼륨은 여러 컨테이너가 같이 쓰기에도 안전하게 만들어져 있어요.
- 볼륨 드라이버로 더 많은 기능을 추가할 수 있어요: 볼륨 드라이버를 쓰면 데이터를 다른 곳에 저장하거나 보안을 강화하는 등 여러 기능을 추가할 수 있어요.
- Mac이나 Windows에서 더 빠르게 돌아가요: Mac이나 Windows 컴퓨터에서 Docker를 쓸 때 볼륨이 기본 저장 방식보다 훨씬 빠르게 돌아가요.
- → 이렇게 볼륨을 쓰면 데이터를 더 잘 다루고, 여러 컨테이너에서 공유하거나, 데이터를 안전하게 관리하는데 도움이 돼요.
bind mount
- 바인드 마운트는 뭐예요? 바인드 마운트는 컴퓨터의 특정 폴더나 파일을 Docker 컨테이너 안에서 직접 쓸 수 있게 해주는 거예요. 볼륨보다 기능이 좀 덜하지만, 특정 상황에서 유용해요.
- 어떻게 사용하나요? 컴퓨터에서 어떤 폴더나 파일을 골라서 Docker 컨테이너에 '붙여넣는' 것과 비슷해요. 그러면 컨테이너 안에서도 그 파일이나 폴더를 마치 자기 것처럼 쓸 수 있어요.
- 어디에 있는 파일이나 폴더를 쓸 수 있나요? 바인드 마운트는 컴퓨터 안의 정확한 위치(절대 경로)에 있는 파일이나 폴더를 사용해요. 그래서 컨테이너가 어디에 있든, 그 파일이나 폴더를 똑같이 쓸 수 있죠.
- → 바인드 마운트를 사용하면 컨테이너에서 컴퓨터의 특정 파일이나 폴더를 쉽게 접근하고 사용할 수 있어요. 이런 방식은 특정 개발 작업이나 데이터를 다룰 때 도움이 될 수 있어요.
tmpfs mount
- tmpfs 마운트는 뭔가요? tmpfs 마운트는 컴퓨터 메모리를 사용해서 일시적인 데이터를 저장하는 방법이에요. 이 방법은 컨테이너 안에서 잠깐 필요한 데이터를 다룰 때 유용해요.
- 왜 사용하나요?
- 일시적인 데이터 저장: 컨테이너가 임시 데이터를 만들 때, 이걸 영구적으로 저장하지 않고 메모리에만 잠시 두고 싶을 때 써요.
- 컴퓨터의 파일 시스템 안 씀: tmpfs 마운트는 컴퓨터의 일반 파일 시스템 대신 메모리를 사용해서 데이터를 저장해요.
- 성능 향상: 메모리를 사용하므로 데이터를 빠르게 읽고 쓸 수 있어서 컨테이너의 성능이 좋아져요.
- 컨테이너끼리 공유 안 됨: 이 방식으로 저장된 데이터는 해당 컨테이너에서만 사용할 수 있고, 다른 컨테이너와 공유는 안 돼요.
- → tmpfs 마운트는 컨테이너가 잠깐 필요한 데이터를 메모리에 저장하고 싶을 때 사용하면 좋아요. 이렇게 하면 데이터를 빠르게 처리할 수 있고, 컨테이너가 끝나면 자동으로 데이터도 사라져서 편리해요.
docker volume create datavol
docker volume ls docker container run -ti --rm -v datavol:/data alpine
# docker container 내에서
echo "볼륨 데모" > /data/demo.txt
exit
# Host Machine에서 alpine을 이용한 컨테이너 삭제 확인
docker container ls # 새로운 이미지와 새로운 컨테이너에서 demo.txt 파일 확인
docker container run --rm -v datavol:/data ubuntu cat /data/demo.txt
host machine 의 디렉토리 확인
sudo apt update; sudo apt install -y tree;
sudo tree -a /var/lib/docker/volumes/datavol
docker volume inspect datavol
[
{
"CreatedAt": "2023-11-25T14:33:11+09:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/datavol/_data",
"Name": "datavol",
"Options": null,
"Scope": "local"
}
]
실습: bind mount를 사용해서 디렉토리 mount #1
cd ~
mkdir test-app
cd test-app
touch run.sh
chmod +x ./run.sh
docker run -ti --rm -v .:/app alpine
# docker container 내부에서
cd /app
ls -ahlvF
# run.sh 존재 확인
실습: readonly와 readwrite(default) 디렉토리 마운트
cd ~
mkdir readonly
mkdir readwrite
docker run -ti -v ~/readonly:/readonly:ro -v ~/readwrite:/readwrite:rw ubuntu
# Docker Machine 내부에서
echo "test" > /readonly/readonly.txt # 파일을 쓸 수 없음
echo "test" > /readwrite/readwrite.txt # 파일 쓰기 가능
exit
# Host Machine에서
cat ~/readwrite/readwrite.txt
실습: mysql 데이터를 보존해서 실행하기
docker run -ti --rm -d --name mysqltest -e MYSQL_ROOT_PASSWORD=123! -e MYSQL_DATABASE=mysqltest -v ~/mysqldata:/var/lib/mysql mysql:latest
mysql 서버에 ssh 접속 및 mysql 접속
docker exec -ti mysqltest /bin/bash
mysql -h localhost -u root -p
mysql 서버의 ssh 접속 상태에서
ls -ahlvF /var/lib/mysql/mysqltest
exit
docker stop mysqltest
docker run -ti --rm -d --name mysqltest2 -e MYSQL_ROOT_PASSWORD=123! -e MYSQL_DATABASE=mysqltest -v ~/mysqldata:/var/lib/mysql mysql:latest
docker logs -f mysqltest2
docker exec -ti mysqltest2 /bin/sh
mysql -h localhost -u root -p
use mysqltest;
select * from mysqltest;
docker 실행 시 환경 변수 리스트를 어디에서 확인하는지?
https://hub.docker.com/_/mysql