본문 바로가기
메가IT아카데미 국기과정/도커와 쿠버네틱스

[1-7] Docker 볼륨 관리

by 한님폐하 2022. 9. 14.

1. Docker 볼륨 관리

  • 컨테이너를 실행하면 이미지는 읽기 전용으로 동작하며 컨테이너는 읽기/쓰기로 동작한다.
  • 그렇기 때문에 컨테이너에서 작업한 데이터는 이미지에 기록되는 것이 아니라 이미지 위에 컨테이너 레이어라는 곳에 기록된다.
  • 대신, 컨테이너 레이어에 기록된 데이터는 컨테이너가 삭제되면 사라지기 때문에 다시 사용할 수 없다.
  • 이런 문제점을 해결하기 위한 방법 중에 하나가 바로 볼륨을 구성하는 것이다.
  • 볼륨을 구성하면 호스트와 컨테이너 간에 데이터를 공유하기 때문에 컨테이너 레이어에 기록된 데이터를 복원할 수 있다.
  • 즉, 볼륨은 컨테이너의 데이터를 호스트에 저장하는 기능이며, 다음과 같이 2가지 방식이 있다.

 

1-1. volume

  • 호스트 Docker 루트 디렉토리에 volumes이라는 디렉토리를 이용하야 컨테이너 데이터를 저장하는 방식이며 권장 사항이다.
docker info | grep -i "docker root dir"

 

  • 다음은 호스트의 testvol 볼륨과 컨테이너의 '/usr/share/nginx/html' 디렉토리를 volume 방식으로 구성하는 명령어이다.
docker run -d --name web -v testvol:/usr/share/nginx/html -p 8080:80 nginx

 

1-2. bind mounts

  • 호스트 특정 디렉토리를 마운트하여 컨테이너 데이터를 저장하는 방식이며 오래전부터 사용하였지만 권장 사항은 아니다.
  • 다음은 호스트의 '/www' 디렉토리와 컨테이너의 '/usr/share/nginx/html' 디렉토리를 bind mounts 방식으로 구성하는 명령어이다.
  • 만약 '/www' 디렉토리를 지정하지 않으면 랜덤하게 생성되지만 권장 사항은 아니다.
docker run -d --name web –v /www:/usr/share/nginx/html -p 8080:80 nginx

 

 

2. Volume 방식 구성

docker volume

 

2-1. 컨테이너를 위한 볼륨 생성

  • 'docker container run' 명령으로 컨테이너를 구동할때 볼륨 이름을 지정하면 자동으로 그 이름으로 볼륨이 생성된다.
docker volume create testvol

 

2-2. 컨테이너 구동시 볼륨 연결

  • 'mynginx' 컨테이너가 생성 및 시작되면서 'testvol' 볼륨과 연결되도록 한다.
  • 만약, 볼륨을 지정하지 않으면 '/var/lib/docker/volumes' 디렉토리에 자동으로 생성된다.
docker container run --name mynginx -d -p 8080:80 -v testvol:/usr/share/nginx/html nginx

 

2-3. 웹 서비스 소스 코드 수정

  •  '/var/lib/docker/volumes/testvol/_data'에 'index.html' 파일을 다음과 같이 수정한다.
  • 'curl'를 이용하여 웹 서비스 요청을 실시한다.
cd /var/lib/docker/volumes/testvol/_data
echo 'volume test' > index.html
curl http://192.168.2.10:8080

 

2-4. 컨테이너 중지 및 삭제

'mynginx' 컨테이너는 삭제되었지만, 볼륨은 유지되어 있다.

 

2-5. 다시 'mynginx' 컨테이너를 시작하여 'testvol' 볼륨과 연결되는지 확인한다.

docker container run -d --name mynginx -p 8080:80 -v testvol:/usr/share/nginx/html nginx

 

2-6. 'mynginx' 컨테이너를 중지하고 볼륨이 삭제되는지 확인한다.

docker container stop mynginx
docker volume rm testvol

 

[참고] 도커 루트 디렉토리 변경

vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --date-root=/test/docker
systemctl daemon-reload
systemctl stop docker
systemctl start docker

 

 

3. Bind Mount 방식

3-1. 컨테이너 구동시 호스트 디렉토리 마운트 

docker container run --name mynginx1 -d -p 8080:80 -v /www:/usr/share/nginx/html nginx

 

3-2. 웹 서비스 소스 코드 제작

echo 'bind mount test1' > /www/index.html

 

3-3. 'mynginx' 컨테이너 안에 들어가서 'index.html' 파일 내용을 확인한다.

docker container exec -it mynginx1 /bin/bash

 

3-4. 컨테이너 다시 시작 후 'index.html' 내용 유지 확인

 

 

4. Overlay 파일시스템 

  • 컨테이너에서 'df -h'를 실시하면 overlay 파일 시스템의 마운트 위치가 루트 디렉토리(/)로 출력된다.
  • 'exit' 종료하면 컨테이너가 Exited 상태가 되면서 컨테이너는 중지되기 때문에 (Ctrl+p+q)를 실시하여 호스트 시스템으로 나간다.
  • 호스트 시스템에서는 'df -h'를 실시하면 overlay 파일 시스템의 마운트 위치가 '/var/lib/docker/overlay2/컨테이너 ID/merged' 디렉토리로 출력된다.
  • '/var/lib/docker/overlay2/컨테이너 ID/merged' 디렉토리를 확인하면 컨테이너의 루트 디렉토리(/) 내용을 출력된다.
  • 볼륨으로 연결된 컨테이너 /test1, /test2 디렉토리의 file1.txt, file2.txt 파일은 출력되지 않는다.
  • 컨테이너 /test1, /test2 디렉토리의 file1.txt, file2.txt 파일은 '/var/lib/docker/volumes' 디렉토리에 각각의 볼륨에 저장된다.

 

5. 볼륨 이름

  • 볼륨을 생성하지 않고 이름만 지정할 경우, 볼륨이 지정한 이름으로 자동으로 생성된다.
docker container run --name mynginx1 -d -p 8080:80 -v testvol:/usr/share/nginx/html nginx

 

  • 볼륨을 생성하지 않고 이름도 지정하지 않을 경우, 볼륨 이름이 컨테이너 이름으로 자동으로 생성된다.
docker container run --name mynginx2 -d -p 8081:80 -v /usr/share/nginx/html nginx

 

6. 볼륨 활용 예제

6-1. 웹서버, DB 서버를 운영하는 경우

  • 웹서버 : 웹 관련 소스 디렉토리 및 로그 디렉토리
  • DB 서버 : 데이터베이스 관련 디렉토리

 

6-2. 개발 환경과 서비스 환경을 동시에 운영하는 경우

  • 개발 서버 : 개발자가 필요한 각종 프로그램 설치하여 개발 용도로 사용하는 서버
  • 서비스 서버 : 사용자에게 서비스에 필요한 실행 파일 및 데이터만 유지하는 서버
docker run --name devweb -d -p 8080:80 -v testvol:/usr/share/nginx/html nginx	# rw 기본값
docker run --name prodweb -d -p 8080:80 -v testvol:/usr/share/nginx/html:ro nginx

 

6-3.  동일한 서비스를 제공하는 다수의 서버와 로드밸랜서를 운영하는 경우

docker run --name web1 -d -p 8080:80 -v myvol:/usr/share/nginx/html nginx
docker run --name web2 -d -p 8081:80 -v myvol:/usr/share/nginx/html nginx
docker run --name web3 -d -p 8082:80 -v myvol:/usr/share/nginx/html nginx

'메가IT아카데미 국기과정 > 도커와 쿠버네틱스' 카테고리의 다른 글

[1-6] Docker 컨테이너 관리  (0) 2022.09.13
[1-5] Docker 이미지 업로드  (0) 2022.09.13
[1-4] Docker 이미지 관리  (0) 2022.09.13
[1-3] Docker 구동  (0) 2022.09.13
[1-2] Docker 설치  (0) 2022.09.13