안녕하세요 푸드 테크팀 백엔드 개발자 박형민입니다.
오늘은, 도커에서 데이터를 영속적으로 관리할 수 있는 방법인 Docker volume 에 대해 포스팅해보고자 합니다.
도커 컨테이너를 사용할 때, 데이터는 Writable Layer 에 Data 를 저장할 수 있지만, 기본적으로 컨테이너가 삭제될때 데이터가 함께 사라지게 됩니다.
Docker 에서는 다음과 같이 3가지 마운트 옵션을 제공합니다.
1. volume
2. bind mounts
3. tmpfs mount
volume 의 사용은, Docker 에서 Data 를 존속시킬 수 있는 Best 한 방법이라고 합니다.
volume 은 Docker(Linux 에서는 /var/lib/docker/volume/) 가 관리하는 Host File System 의 일부에 Data가 저장됩니다.
로컬에서의 볼륨위치를 찾고 싶다면 아래의 명령어로 확인할 수 있습니다.
docker volume inspect (volume명)
💡 단 OS 가 리눅스가 아닌, 윈도우 맥이라면, 저 경로로 찾을 수 없습니다.
그 이유는 Mac os, windows os 에서 직접 os를 점유하지 않고, 호스트 os 를 공유하는 도커의 특성입니다.
리눅스 os 가 아니라면, Docker 는 Host 의 Kernel Socket을 공유합니다.
즉, Host Linux kernel을 대신할 것이 필요하기 때문에, Host 가 리눅스라면 있는걸 그대로 사용하면 되지만, 다른 OS 라면 Linux Kernel이 아니기 때문에 OS 위에 VM 으로 Linux 를 게스트 os 로 구동하고, 그 위에 Docker Engine을 구동합니다.
volume은 고정된 위치에서 데이터를 관리해서 원하는 곳에 파일을 저장시킬 수 없습니다. Bind Mount 방법을 사용한다면, 로컬 폴더 원하는 곳에 자유롭게 마운트할 디렉토리를 선택할 수 있습니다.
tmpfs mount는 Host System의 Memory에만 Data가 저장되며, 절대로 Host의 File System에는 저장되지 않는다고 합니다.
그러면, Docker 에서 데이터를 영속적으로 관리하는 가장 Best한 방식이라고 소개하는 Volume 을 사용해 보겠습니다.
docker volume create 명령을 사용하여 명시적으로 volumes를 생성하거나, Container나 Service 생성 중에 volume을 생성할 수 있습니다
volume이 생성되면, Data는 Docker Host의 디렉토리에 저장됩니다.
해당 volume을 Container에 Mount하면, Host의 디렉토리가 Mount가 됩니다.
$ docker volume create test-vol
test-vol
$ docker volume ls
DRIVER VOLUME NAME
local test-vol
$ docker volume inspect test-vol
[
{
"CreatedAt": "2022-07-18T06:30:55Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
컨테이너가 볼륨을 사용하기 위해서는 볼륨을 컨테이너에 마운트(mount)해줘야 합니다.
docker run 커맨드로 컨테이너를 실행할 때 -v 옵션을 사용하면 되는데
콜론(:)을 구분자로 해서 앞에는 마운트할 볼륨명 뒤에는 컨테이너 내의 경로를 명시해주면 됩니다.
docker run -v test-vol:/app/dockerDir --name nginx-conatiner -p 8080:80 -d nginx
docker run -v test-vol:/app/dockerDir --name nginx-conatiner2 -p 8082:80 -d nginx
똑같이 연결할 컨테이너와 마운트할 볼륨을 선택해주면 됩니다.
✅ 이렇게 볼륨을 연결하면, 컨테이너에서 쓰여진 데이터들이 Volume에 저장됩니다.
참고 : Docker Docs - https://docs.docker.com/storage/volumes/
좋은 글 잘 봤습니다. Volume 을 활용하면 데이터를 유지 시키며 업데이트할 버전을 미리 테스트 하거나 다운그레이드가 쉽다는 장점도 있겠네요.