[Docker] mount

2023. 2. 27. 01:45Tools/Docker

 

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: Manage volumes. You can use subcommands to create, inspect, list, remove, or prune volumes.

docs.docker.com

# docker volume COMMAND COMMAND
docker volume create 볼륨이름
docker volume inspect 볼륨이름
docker volume ls
docker volume prune
docker volume rm 볼륨이름
docker volume update

 

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

 

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

 

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

 

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

 


나. volume mount

 

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

 

docker run [option] [image]

 

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.

 

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

 

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

 


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 볼륨혹은파일과폴더:파일과폴더 이미지이름

 


 

생활코딩 유튜브

 


출처 : 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/

'Tools > Docker' 카테고리의 다른 글

[Docker] 이미지 배포  (0) 2023.02.27
[Docker] Commit & Dockerfile  (2) 2023.02.27
[Docker] 컨테이너 안에서 터미널 쓰기!  (0) 2023.02.27
[Docker] 포트포워딩  (0) 2023.02.27
[Docker] 시작하기  (1) 2023.02.27