본문 바로가기
개발

Docker volume, mount 알아보기

by 상5c 2022. 8. 21.

참고

컨테이너의 데이터는 컨테이너의 삭제와 함께 사라진다. 데이터를 영속성 있게 관리하기 위해서는 마운트를 통해 호스트 시스템에 데이터를 기록해야 한다.

이 방법은 bind mount, volume, tmpfs mount 세 가지로 나뉜다.

bind mount

볼륨 개념에 대해 잘 모를때부터 사용하게 됐던 방법이고, 사용이 편리하여 주로 사용하게 되는 방법이다. 개인적인 경험으로는 로컬 환경에서는 바인드 마운트로 충분했다.

공식 document에 나오는 그림인데, 모르고 볼땐 전혀 도움이 되지 않았고, 알고 보니 한번에 이해되는 그림이었다.

바인드 마운트는 호스트 시스템의 경로(파일 or 폴더)가 컨테이너에 마운트되는 형태이다. 경로가 존재하지 않으면 생성하여 마운트하고 호스트 시스템의 경로에 모두 접근 할 수 있기에 주의가 필요하다. 쓰기 기능이 필요 없는 경우 readonly로 마운트 가능하다.

사용 예

 docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

현재 경로(pwd) 하위의 target 폴더와 컨테이너의 /app 경로를 마운트한다.

inspect 명령어를 통해 마운트 정보를 확인할 수 있다.

$ docker inspect devtest

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

Type이 bind인 것을 알 수 있다.

docker compose에서는 아래와 같은 방식으로 사용할 수 있다.

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - type: bind
        source: ./static
        target: /opt/app/staticvolumes:
  myapp:

줄여쓰기도 가능하며, 다른 타입과 자동으로 구분된다.

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

상세 내용 참고: https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes

volume

volume은 bind mount보다 좀 더 좁은 범위의 마운트이며, 도커에 의해 관리되는 영역에 데이터가 저장된다.

격리된 별도의 저장공간을 만든 후, 필요할 때 마운트 하는 형식이다. (N개의 서비스에 1개의 NAS를 마운트 하는 느낌) 
mac os 기준으로, ls명령어를 통해 마운트 경로 직접 확인이 불가능하다.

volume 서브 커맨드로 사용 가능하다.

docker volume create my-vol

생성된 볼륨의 목록과 상세 정보는 ls 명령어와 inspect 명령어로 확인할 수 있다.

$ docker volume ls
local       my-vol

$ docker volume inspect my-vol
[
    {
        "CreatedAt": "2022-08-21T13:47:01Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

볼륨 연결 방법은 bind mount와 동일한 형식이며, 생성한 볼륨의 이름을 입력하면 된다.

docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

compose에서도 동일하게 사용 가능하여 설명을 생략한다.

bind mount와의 차이점은

  1. 백업과 마이그레이션이 편리하고
  2. 경로가 제한되어 안전하게 공유 가능하며
  3. 볼륨 드라이버를 사용하여 원격의 저장소를 사용할 수 있다.

tmpfs mount

호스트 메모리에 데이터를 저장한다. 따라서 컨테이너가 중지(stop)되면 마운트가 제거되고 파일이 삭제된다. document에 따르면 민감한 파일을 임시로 저장하는데 유용하다는데, 일반적인 데이터 저장은 start 시에 데이터를 다시 사용 가능한데 중지시에 데이터를 삭제하는 식으로 사용하는 것으로 추정된다.

개인적으로 사용해본 경험은 없으며, windows는 지원하지 않고 linux에서만 사용 가능하다.

다른 마운트 방식과는 약간 다르게 —tmpfs 플래그로 마운트 타입을 지정한다.

docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

inspect 명령어를 사용해 마운트 정보를 확인해보면 Tmpfs 키워드를 확인 가능하다.

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