
안녕하세요!
AWS에서도 Volume에 대해서 다뤄봤는데
Docker 환경(Private)에서도 다뤄볼 예정입니다.
크게 달라질 내용은 없지만, 운영자분들은 참고하시어 원활한 운영에 보탬이 되고자 합니다.

01. Docker에서 Volume 이란?
✅ Volume 이해
- Volume Mount를 했을때 컨테이너와 HostOS간 데이터를 공유할 수 있다.
- 컨테이너의 중요 데이터가 삭제되도, HostOS에서 데이터를 유지할 수 있다. (독립적 보존 메커니즘)
즉, HostOS에서 데이터를 마운트된 디렉토리에 집어 넣으면, 컨테이너에 리소스가 할당되며
컨테이너의 내부 데이터는 컨테이너의 Life Cycle과 관련되어 데이터를 지속적으로 보존하기 위해 Volume을 사용.
✅ Volume 방식
- bind mount : 실제 컨테이너의 어떤 경로와 HostOS의 디렉토리(file system)의 특정 경로를 맵핑.
- Container가 제거되어도 bind mount는 해제되지만 데이터는 Host 디렉토리에서 관리됨.
- Volume : 'docker volume create' 명령을 통해 직접 volume을 생성한다.
- 특정 경로에 맵핑하는 것이 아닌, '/var/lib/docker' 아래에 잡히기 때문에, Docker에서 관리
- vieus, sshfs plugin 같은 볼륨 드라이버를 통해 원격 호스팅, 볼륨 내용을 저장 & 암호화 가능.
- tmpfs mount : 컨테이너 내부에 기록되지 않아야 할 데이터 (중요 임시 데이터)를 보관하지 않게 사용하기 위함.
- Docker HostOS의 Memory에서만 지속되고, 컨테이너가 중지되면 마운트 해제와 데이터도 사라짐.
02. 각 방식별 Docker Volume 생성
📌 bind mount 생성
1) 컨테이너 내부에 공유할 디렉토리 및 파일 생성
mkdir ssung hwan
echo 'ssunghwan tech blog docker volume test-1' > ssung/test1.txt
echo 'ssunghwan tech blog docker volume test-2' > hwan/test2.txt
2) bind mount할 container 생성
docker run -itd --name bind-mount-container \
-v $(pwd)/ssung:/ssung \
-v $(pwd)/hwan:/hwan \
ubuntu:14.04
3) 컨테이너 생성 확인 & 접근

# container 접근 명령
docker exec -it [container name] bash
4) 마운트 확인
- 컨테이너 내부에서 모든 mount point 확인

- 컨테이너 내부에서 hostOS에서 작성한 디렉토리의 파일 확인

- Host에서 'docker inspect' 명령을 통해 mount 정보 확인

반대로, 컨테이너 내부에서 파일을 생성하였을 때 Host에서도 보일까?
# 컨테이너 내부에서 실행
echo 'ssunghwan tech blog docker volume test-3' > ssung/test3.txt
echo 'ssunghwan tech blog docker volume test-4' > hwan/test4.txt
- 하기와 같이 공유가 된 것을 확인할 수 있다.

이렇게 간단히 파일을 공유하는 실습을 해봤지만, 실제로 이 내용들을 응용하여
config 파일이나, 인증 파일들을 bind mount를 통하여 공유하는 방식도 실제로 많이 쓰입니다.
📌 docker volume 생성
1) docker volume 생성 & 연결
docker volume create ssunghwan-data
- 생성 한 후에 inspect 명령으로 Mountpoint를 확인할 수 있다.

2) docker volume 컨테이너 생성
docker run -d --name test-db -e MYSQL_ROOT_PASSWORD=p@ssw0rd -e MYSQL_DATABASE=ssunghwan \
-v ssunghwan-data:/var/lib/mysql mysql:8.0
3) 컨테이너 생성 확인 및 데이터 확인
- 하기와 같이 mysql:8.0 컨테이너가 잘 생성됬는지 확인

- mysql 컨테이너는 기본적인 정보를 포함하므로, 아까 생성된 Mountpoint를 확인해보자.

4) 마운트 확인
- 컨테이너 내부에서 마운트포인트 확인

5) 컨테이너 삭제 & Docker volume 확인
- 컨테이너를 삭제해도 데이터가 docker volume에 저장되어 보존된다.
