Docker - volume

우야·2021년 8월 12일
0

Docker Volume 사용하기

이슈

  • Container는 기본적으로 실행되고 있을때 새롭게 생성한 데이터는 Container의 라이프사이클과 같이 한다. Container가 kill되면 생성한 data도 사라지는것이다.
  • 의도한것이라면 상관 없지만, data(DB)를 유지하고 다시 container를 띄웠을때 저장된 data를 사용하고 싶다면 어떻게 해야 할까?

해결 방법

  • host의 disk에 data를 기록 하고 container는 host의 disk를 mount하고 있으면 된다.

방법 1. docker volume 사용하기

전제

  • getting-started라는 docker image가 존재한다.
  • getting-started image에는 /etc/todos폴더에 todo.db라는 db를 생성하여 데이터를 기록하는 비지니스로직이 있다.
  1. docker volume create 명령을 사용하여 볼륨을 생성
 $ docker volume create todo-db
  1. docker volume mount하여 실행
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
  1. 실행하여 데이터를 넣어 본다.
  1. docker ps | grep 3000을 하여 docker id를 확인
$ docker ps |grep 3000
a1a988b9ff77   getting-started                          "docker-entrypoint.s…"   11 minutes ago       Up 11 minutes       0.0.0.0:3000->3000/tcp   amazing_lederberg
  1. docker rm -f [containerId]로 docker container 삭제
  • 데이터가 저장되어 있고 다시 읽어 오는지 확인을 위함
  1. docker volume mount하여 다시 실행하여 확인
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

  1. 참고 삼아....
  • docker volume을 create하면 어디에 생성 될까?
$ docker volume inspect todo-db
[
    {
        "CreatedAt": "2021-08-12T17:15:17+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]
$ sudo ls /var/lib/docker/volumes/todo-db/_data
todo.db

방법 2. binding mount 사용하기
위의 방법은 데이터 베이스에 데이터를 유지하기 위해서 볼륨을 하나 만들어서 사용한것으로 데이터가 저장되는 위치에 대해서는 docker가 정해놓은것으로 신경쓸 필요가 없었다.

이슈
만약 host의 정확한 mount지점을 제어해야 한다면 어떻게 해야 할까?

해결
binding mount 사용

예)

 $ docker run -dp 3000:3000 \
     -w /app -v "$(pwd):/app" \
     node:12-alpine \
     sh -c "yarn install && yarn run dev"
  • -dp 3000:3000 : 분리(백그라운드) 모드에서 실행하고 포트 매핑 생성
  • -w /app : "작업 디렉토리" 또는 명령이 실행될 현재 디렉토리를 설정
  • -v "$(pwd):/app" : 바인드로 컨테이너에 호스트에서 현재 디렉토리를 컨테이너의 /app디렉토리로 마운트
  • node:12-alpine : Dockerfile의 앱에 대한 기본 이미지입니다.
  • sh -c "yarn install && yarn run dev" : sh(alpine에는 없음 bash)을 사용하여 셸을 시작하고 모든 종속성 yarn install을 설치하기 위해 실행

참고

binding mount 및 docker volume create 방법은 Docker 엔진과 함께 제공되는 volume 사용 형태이다.
만약 SFTP, Cept, NetApp, S3등을 지원하기 위해서는 추가 볼륨 드라이버를 사용할 수 있다.

docker volume create VS binding mount 비교

  • host disk 위치
    docker volume create : Docker에서 선택
    binding mount : 사용자가 직접 선택
  • mount 사용 예)
    docker volume create : myvolume(volume name):/user/local/data (container path)
    binding mount: /path/to/data(host path):/user/local/data(container path)
  • 컨테이너 내용을 새로운 볼륨에 채움
    docker volume create : yes
    binding mount: no
  • 볼륨 드라이버 지원
    docker volume create : yes
    binding mount: no
profile
Fullstack developer

0개의 댓글