1. 호스트와 컨테이너의 파일시스템 연결
docker exec를 사용하는 것도 좋지만 그렇게 되면 몇 가지 문제가 생긴다.

컨테이너(container)에 쓰인 데이터는 기본적으로 컨테이너가 삭제될 때 함께 삭제된다.
컨테이너 변화와 관계없이 데이터는 변화하면 안 된다.
뿐만 아니라 여러 개의 Docker 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야 할 때도 있다.
이러한 기대에 Docker는 두 가지 방법을 제시한다.
- Docker volume : 별도의 volume을 생성해서 container에 마운트하기.
- 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 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/
