[Docker] mount

1. 호스트와 컨테이너의 파일시스템 연결

docker exec를 사용하는 것도 좋지만 그렇게 되면 몇 가지 문제가 생긴다.

컨테이너(container)에 쓰인 데이터는 기본적으로 컨테이너가 삭제될 때 함께 삭제된다.

컨테이너 변화와 관계없이 데이터는 변화하면 안 된다.

뿐만 아니라 여러 개의 Docker 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야 할 때도 있다.

이러한 기대에 Docker는 두 가지 방법을 제시한다.

  1. Docker volume : 별도의 volume을 생성해서 container에 마운트하기.
  2. Bind mount : 기존의 파일이나 디렉터리를 container에 바로 마운트하기.


2. Docker volume

새로운 volume을 생성해서 container의 파일시스템에 마운트해보자.

volume이란 도커의 컨테이너에 사용되고 또 생성되는 데이터를 보존하기 위해서 사용되는 메커니즘이다.

뒤에서 소개할 bind mounts와 비교해서 몇 가지 장점을 가진다.

bind mounts가 운영체제나 호스트 머신에 영향을 받는 반면에 volumes는 온전히 도커에 의해서만 관리된다.

그 외에도 몇 가지 장점이 더 있다.

  • 데이터의 이동과 백업이 더 쉽다.
  • 도커 API나 CLI 명령어로 관리할 수 있다.
  • 리눅스와 윈도우 컨테이너 모두에서 작동한다.
  • 더 안전하게 복수의 컨테이너에 공유할 수 있다.
  • Volume drivers는 원격 호스트나 클라우드 제공자들에 볼륨을 암호화하거나 별도의 기능을 추가해서 저장할 수 있게 한다.
  • 새 volume을 컨테이너의 내용으로 미리 채울 수 있다.
  • 맥이나 윈도우에서 bind mounts한 경우보다 더 성능이 잘 나온다.

추가적으로 볼륨은 컨테이너의 writable layer에 데이터를 보존하는 것보다 좋다.

이들 컨테이너의 용량을 증가시키지 않고도 컨테이너의 존폐와는 상관없이 내용물을 보관할 수 있다.

출처 : https://docs.docker.com/storage/volumes/


가. volume 생성 및 관리

docker volume

# docker volume COMMAND COMMAND
docker volume create 볼륨이름
docker volume inspect 볼륨이름
docker volume ls
docker volume prune
docker volume rm 볼륨이름
docker volume update
Code language: PHP (php)

만약 volume을 삭제하고 싶다면 docker volume rm을 사용한다.

단, 마운트한 컨테이너가 있을 때는 해당 볼륨은 제거할 수 없다.

마운트되어 있는 모든 컨테이너를 먼저 삭제하고, 볼륨을 삭제해야 한다.

docker volume prune는 아무것에도 마운트되어 있지 않은 모든 볼륨을 한 번에 제거할 수 있다.(위험한데;;;)


나. volume mount

이렇게 생성한 볼륨을 컨테이너에 마운트해보자.

docker run [option] [image]
Code language: CSS (css)

mounts에 사용할 수 있는 옵션은 두 가지다.

--volume--mount는 모두 Docker 컨테이너와 호스트 사이의 디렉터리를 공유하기 위한 옵션이다.

하지만 두 옵션에는 차이점이 있습니다.

간단히 말해서…

  • --volume은 호스트 파일 시스템의 경로를 직접 지정하고 간단한 공유를 할 때 사용한다.
  • --mount는 더욱 복잡한 설정과 추가적인 보안 기능이 필요할 때 사용한다.

보통 -v 옵션을 쓰는 게 좋다고 합니다.

docker volume create my-vol

# volume option
docker run -d \
    -p 8080:80 \
  --name devtest \
  -v my-vol:/app \
    httpd

# mount option
docker run -d \
    -p 8080:80 \
  --name devtest \
  --mount source=my-vol,target=/app \
    httpd

# --detach , -d    : Run container in background and print container ID.
Code language: PHP (php)

컨테이너 간의 데이터 공유를 원하는 경우가 있다.

이때는 여러 개의 컨테이너가 하나의 볼륨에 접근할 수 있도록 어떤 볼륨에 데이터를 저장해 두고, 여러 컨테이너에 마운트만 해주면 해당 데이터를 모든 컨테이너에서 접근할 수 있게 된다.


3. Bind mount

Bind mount는 volume과 달리 별도의 volume을 생성하지 않고 host의 파일이나 디렉터리에 바로 마운트 하는 것입니다.

docker run -d    -p 8080:80 --name devtest -v ~/Desktop/my-dir:/app httpd

대부분의 상황에서는 volume을 사용하면 된다.

몇 가지의 경우 빼고.

컨테이너화된 로컬 개발 환경을 구성할 때는 bind mount가 더 유리할 수 있다.

무슨 말이냐.

보통은 로컬에서 개발을 할 때 github를 사용한다.

작업 디렉터리를 bind mount하면 코드를 수정하거나 github에서 pull할 때마다 별도의 작업 없이 컨테이너에 자동으로 적용할 수 있다.

참고로 컨테이너의 디렉터리를 지정할 때는 절대주소를 사용해야 합니다.

(참고로 ubuntu image를 가져온 경우 home directory는 /root 다.)


4. 기존의 Container를 연결하는 법

기존의 컨테이너 그대로 호스트의 파일 시스템 혹은 volume과 연결하기 위해선 commit을 사용하자

docker commit old_container new_container 

docker run -d -p 8080:80 --name 컨테이너이름 -v 볼륨혹은파일과폴더:파일과폴더 이미지이름
Code language: CSS (css)

생활코딩 유튜브


출처 : https://youtu.be/AmSKD4p-jhw

출처 : https://docs.docker.com/engine/reference/commandline/run/

출처 : https://0902.tistory.com/6

출처 : https://docs.docker.com/engine/reference/commandline/volume/

출처 : https://www.daleseo.com/docker-volumes-bind-mounts/

출처 : https://docs.docker.com/storage/volumes/

 

댓글 남기기