Cloud Architect/Docker

Chapter 6. Docker Volume

"Everything about infra" 2025. 11. 25. 01:43

안녕하세요!

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에 저장되어 보존된다.