본문 바로가기
DOCKER

[DOCKER] Docker Volume, bind mount, tmpfs 비교

by sum_mit45 2024. 10. 17.
728x90
반응형
10월 15일(화) 실습 내용

 

2024.10.16 - [분류 전체보기] - [DOCKER] Docker Volume - 데이터 영속성 관리를 위한 도커 볼륨

 

[DOCKER] Docker Volume - 데이터 영속성 관리를 위한 도커 볼륨

🧐 컨테이너의 데이터는 어디에 저장될까?컨테이너 기반의 애플리케이션을 구축하다 보면, "데이터는 어디에 저장하지?"라는 질문이 떠오른다. Docker 컨테이너는 가볍고, 빠르게 생성되고 삭제

sum-mit45.tistory.com

- 이전 글에서 언급한 것과 같이,

   Docker Volume은 데이터를 컨테이너 외부에 저장컨테이너가 중지/삭제되어도 데이터가 유지되도록 하는 방법이다.

- 이번에는 Docker Volume을 생성하고 컨테이너와 연결, 볼륨을 삭제하는 실습을 진행했다. 

1. Docker Volume 

1) 도커 볼륨 생성

기본 명령어는 docker volume create 이름 형태이다.

실습에서는 아래와 같이 진행하였다. 

  • 볼륨 생성: docker volume create my-appvol-1
  • 볼륨 조회: docker volume ls
  • 상세 보기: docker volume inspect my-appvol-1

docker voulem 생성하기

2)  Docker Volume 연결

컨테이너와 볼륨을 연결할 떄 (1) --mount 옵션과 (2) -v 옵션이 있다.

 

(1) --mount 옵션을 사용하여 Docker 볼륨을 컨테이너에 마운트할 때 사용

docker run -d --name <컨테이너 이름> --mount source=<볼륨 이름>,target=<컨테이너 디렉토리> <이미지 이름>

 

(2) -v 옵션으로 직접 매핑할 때 사용

docker run -d --name <컨테이너 이름> -v <볼륨이름>:<컨테이너 내부에 볼륨 경로> <이미지 이름>

 

위와 같은 형식으로 사용할 수 있다. 

 

나는 아래와 같은 명령어로 각각의 옵션을 사용해서 컨테이너를 실행시켰다. 

  • --mount 옵션 사용: docker run -d --name vol-test1 --mount source=my-appvol-1,target=/app ubuntu:20.04
  • -v 옵션 사용: docker run -d --name vol-test2 -v my-appvol-1:/var/log ubuntu:20.04
  • 없는 볼륨 이름으로 생성한다면: docker run -d --name vol-test3 -v my-appvol-2:/var/log ubuntu:20.04
  • --mount된 경로 확인: docker inspect --format ="{{ .Mounts }}" vol-test1

docker 볼륨과 컨테이너 연결
docker insepct 로 mount된 경로 확인

3) 볼륨 삭제

기본 명령어는 docker volume rm 볼륨이름 형태이다. 

  • 컨테이너에 연결되어 있으면 삭제가 안된다.

실행 중인 컨테이너는 삭제가 안된다.

 

도커 볼륨 삭제

docker volume rm my-appvol-1

 

- 이 실습에서와 같이 컨테이너가 실행중인 상태에서, 볼륨을 삭제하려고 하면 아래와 같은 에러 메시지가 출력된다.

- 따라서 컨테이너를 멈추고, 삭제하는 걸 먼저 해주어야 한다.

  • 컨테이너 중지: docker stop vol-test1 vol-test2 vol-test3
  • 컨테이너 삭제: docker rm vol-test1 vol-test2 vol-test3
  • 볼륨 삭제: docker volume rm my-appvol-1 my-appvol-2

2. bind mount

이 방법은 호스트 컴퓨터의 디렉터리와 컨테이너의 디렉터리를 직접 매핑하는 방식이다. 마찬가지로 --mount와 -v옵션을 사용할 수 있다.

 

(1) --mount 옵션을 사용하여 Docker 볼륨을 컨테이너에 마운트할 때 사용

--mount type=bind,source=호스트컴퓨터디렉토리,target=컨테이너디렉토리

 

(2) -v 옵션으로 직접 매핑할 때 사용

-v 호스트컴퓨터디렉토리:컨테이너디렉토리
  • 사용자가 파일 또는 디렉토리를 생성하면 해당 호스트 파일 시스템의 소유자 권한으로 만들어지고 존재하지 않는 경우 자동 생성되는데 이 때 생성되는 디렉토리를 루트 사용자 소유가 됨
  • 컨테이너 실행 시 지정하여 사용하고 컨테이너 제거 시 바인드 마운트는 해제되지만 호스트 디렉토리는 유지가 됨.

 

다음은 CentOS 8의 /var/log 디렉터리를 연결하기 위한 실습이다. 

실습 예제

1) 실습을 위한 디렉터리 생성

mkdir /home/brandy/target

 

- 로그 파일을 저장할 디렉터리를 생성한다.

- mkdir은 디렉터리를 생성하는 명령어이고, 뒤에는 새로 생성될 디렉터리의 경로를 입력하면 된다.

2) --mount 옵션으로 CentOS 8의 /var/log 디렉토리와 연결

docker run -dit --name bind-test1 --mount type=bind,source=/home/brandy/target,target=/var/log centos:8

 

- 새로운 컨테이너를 -d(백그라운드에서 실행), -i(표준 입력 활성화), -t(TTY를 할당하여 터미널 사용할 수 있도록) 설정해준다.

- --name옵션을 활용하여 생성될 컨테이너 이름은 bind-test1 으로 설정한다.

- --mount 옵션을 활용하여 바인드 마운트를 사용하여 호스트 디렉토리를 컨테이너에 연결한다. 

  • source: 호스트의 소스 디렉토리
  • target: 컨테이너에서 마운트될 디렉토리

3) -v 옵션으로 CentOS 8의 /var/log 디렉토리와 연결

docker run -dit --name bind-test2 -v /home/brandy/target:/var/log centos:8

 

- -v: 볼륨 마운트를 사용하여 호스트와 컨테이너 디렉토리를 연결한다. 먼저 나오는 부분이 호스트의 디렉토리이고, 오른쪽이 컨테이너의 디렉토리이다. 

4) 없는 디렉토리와 연결

docker run -dit --name bind-test3 -v /home/brandy/target1:/var/log centos:8

 

- 이 명령어는 존재하지 않는 호스트 디렉터리와 연결을 시도한다.

- 이 디렉토리는 컨테이너가 실행될 때 자동으로 생성되지 않는다. 따라서 CentOS 8 컨테이너의 /var/log 는 /home/brandy/target1의 내용을 포함하지 않는다.

5) 없는 디렉토리에 권한 부여 후 연결

docker run -dit --name bind-test4 -v /home/brandy/target_ro:/app1:ro -v /home/brandy/target_rw:/app2:rw centos:8

 

- 이 명령어는 읽기 전용 및 읽기/쓰기 모드로 두 개의 서로 다른 디렉토리를 연결한다.

- - v /home/brandy/target_ro:/app1:ro: /home/brandy/target_ro 디렉토리를 컨테이너의 /app1에 읽기 전용(ro)으로 마운트한다.

- -v /home/brandy/target_rw:/app2:rw: /home/brandy/target_rw 디렉토리를 컨테이너의 /app2에 읽기/쓰기(rw) 모드로 마운트한다.

- 이 경우, 각각의 디렉토리에 대해 다른 접근 권한을 설정할 수 있다. 읽기 전용 디렉토리에서는 데이터를 수정할 수 없고, 읽기/쓰기 디렉토리에서는 수정할 수 있다.

3. tmpfs mount

 이 방법은 임시적으로 연결하여, 컨테이너가 중지되면 마운트가 제거되고 내부에 기록된 파일도 유지되지 않는다. 중요한 파일을 임시로 저장하고자 할 때 사용하며, 컨테이너 실행 시 지정하여 사용하고 컨테이너 해제 시 자동 해제된다. 

 

 tmpfs를 이용하여 httpd:2의 /var/www/html 디렉터리를 임시로 연결하는 실습을 진행했다. 아래 명령어들을 통해 Apache HTTP 서버의 /var/www/html 디렉토리에 임시 파일 시스템을 연결하여 웹 서버에 데이터를 저장할 수 있는 환경을 설정할 수 있다. 

1) mount 옵션 사용

mount 옵션을 이용해서 tmpfs 연결을 수행하는데 httpd:2 의 /var/www/html 파일을 임시로 연결

docker run -dit --name tmpfs-test1 --mount type=tmpfs,destination=/var/www/html httpd:2

2) tmpfs 옵션 사용

docker run -dit --name tmpfs-test2 --tmpfs /var/www/html httpd:2

 

728x90
반응형