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 |