본문 바로가기

Docker

[Docker] Docker 데이터 저장 (볼륨 / 바인드 마운트 / tmpfs)

반응형

Docker Container의 데이터 저장

Docker Container 는 내부에서 데이터를 생성하면 기본적으로 Container 내부에 생성되어 Container 가 제거되면 저장된 데이터도 같이 삭제되게 된다. 하지만 서버를 운영하다보면 생성되는 데이터가 Container 의 제거 유무와는 별개로 남아있어야하는 데이터가 있을 수 밖에 없다. 

 

이런 경우 Dockerd에서는 두 가지의 선택을 제공한다.

하나는 Volume 다른 하나는 Bind Mount, 별개로 데이터가 유지되지는 않지만 host의 메모리에 저장할 수 있는 tmpfs도 있다.

 

볼륨

볼륨은 Docker Container에서 생성하고 사용하는 데이터를 유지하기 위한 Docker에서 관리되는 기본 메커니즘이다.

볼륨의 장점으로는

  • 바인드 마운트보다 백업 또는 마이그레이션이 쉽다.
  • CLI 명령이나 Docker API를 사용해 관리할 수 있다.
  • OS에 구애받지 않는다.
  • 여러 Container간에 데이터를 안전하게 공유할 수 있다.
  • 볼륨 드라이버를 사용하면 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있다.
  • Container의 용량을 늘리지 않고 데이터를 저장할 수 있다.

 

볼륨 생성

$ docker volume create my-vol

my-vol

볼륨 목록 확인

$ docker volume ls

DRIVER    VOLUME NAME
local     my-vol

볼륨 상태 확인

$docker volume inspect my-vol

[
    {
        "CreatedAt": "2021-11-23T05:00:05Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

볼륨을 마운트한 Container 생성

docker로 실행 시

$docker run -d\
 --name test\
 --mount source=my-vol,target=/app\  (= -v my-vol:/app)
 -e POSTGRES_PASSWORD=password\ 
 postgres  
 
400b7287f1fc7f675ad3120603cf41bd368ad88002342211c521a0e054e74fcf

docker-compose로 실행 시 yml파일

version: '3.8'
services:
  postgres:
    container_name: test
    image: postgres
    volumes:
     - my-vol:/etc/nginx

volumes:
  my-vol:
    external: true

* 기존에 존재하던 postgres image로 Container 마운트 하였음

Container 마운트 상태 확인

$docker inspect test

	"Mounts": [
            {
                "Type": "volume",
                "Name": "my-vol",
                "Source": "/var/lib/docker/volumes/myvol/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

test container의  마운트 항목에 방금 추가한 볼륨인 myvol이 마운트 된 것을 확인할 수 있다.

 

mac의 경우 Container에 파일을 생성해도 host의 /var/lib/docker 폴더가 생성되지 않는데

docker가 VM을 띄우고 그 위에 실행되기 때문이라고 한다. (참고)

해결방법으로 볼륨을 생성해서 마운트 시키는게 아닌 경로를 바로 지정해서 마운트 시켜야한다 = 바인드 마운트

 

볼륨 삭제

볼륨을 삭제하기 위해서는 해당 볼륨을 사용하는 Container가 모두 종료되어있어야 한다.

다음 명령어들을 통해 Container종료 및 제거, 볼륨 제거를 할 수 있다.

$docker container stop test

$docker container rm test

$docker volume rm my-vol

사용하지 않는 전체 볼륨을 제거하기위해선 다음 명령어를 입력하면 된다.

$ docker volume prune

 

반응형

바인드 마운트

바인드 마운트는 볼륨에 비해 기능이 제한적이다. 바인드 마운트를 사용하면 host시스템의 파일 또는 디렉토리가 컨테이너에 절대 경로로 마운트 된다. 마운트 되는 파일 또는 디렉토리는 이미 존재할 필요는 없으며 요청시 새로 생성된다. 바인드 마운트는 성능이 우수하지만 특정 디렉토리 구조를 사용할 수 있는 호스트 시스템에 의존하게 된다. 또한 Docker CLI명령을 사용하여 직접 관리할 수 없다.

Docker 공식문서에는 볼륨을 사용하는것을 권장한다.

$docker run -d \            
--name test2 \
--mount type=bind,source=/Users/burger/Desktop/Docker,target=/app\ 
(= -v /Users/burger/Desktop/Docker:/var/Docker)
-e POSTGRES_PASSWORD=password \
postgres

마운트의 type은 생략해도된다.

docker inspect test2

	"Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/burger/Desktop/Docker",
                "Destination": "/var/Docker",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

 

tmpfs 마운트

tmpfs 마운트는 임시 데이터이며 호스트의 메모리에서만 지속된다. 컨테이너가 중지되면 tmpfs 마운트가 제거되고 거기에 작성된 파일 또한 제거된다.

tmpfs 마운트는 Container간에 공유할 수 없고 Linux에서 Docker를 사용할 때만 사용할 수 있다.

 docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  -e POSTGRES_PASSWORD=password
 postgres

 

$ docker inspect tmptest

"HostConfig": {
			...
            "Tmpfs": {
                "/app": ""
            },
            ...
}

 

반응형