[도커 기초 시리즈 포스팅]
[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유
[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치
[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처
[Docker] 기초 시리즈 (4) 도커 이미지의 구조
[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry)
[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성
[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어
[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음
[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법
[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리 (Now)
❑ 볼륨(Volume)을 관리하는 방법 3가지
- 도커 컨테이너는 삭제될 때 모든 변경사항이 삭제되므로 데이터를 보존하기 위해 볼륨 관리 방법을 알아야 한다.
- 현업에서는 1번과 2번 방식을 많이 사용하고, 최근 2번 방식을 많이 사용한다고 함
1. 도커 호스트 볼륨
$ docker run -v [host path]:[container mount path]:[readonly]
- 도커 호스트 내 디렉토리를 컨테이너의 특정 경로에 마운트하는 방식이다. 마운트 한다는 건 동기화 하는 것과 같다. 호스트 디렉토리에 파일을 생성해도 컨테이너 디렉토리에도 생기고, 반대로 컨테이너에서 생성해도 호스트에도 생성된다.
- 컨테이너 실행시 -v 옵션을 이용해 호스트 디렉토리와 컨테이너 디렉토리를 매칭시킨다.
- [readonly] 부분에 ro 또는 readonly라고 작성하면 컨테이너는 마운트 된 호스트 디렉토리를 조회만 가능하다. static 파일을 제공하기만 하는 웹 서버같은 서비스를 할 때 사용한다.
- [참고] [host path] 생략
container mount path만 입력하면 호스트 시스템의 컨테이너 uuid 디렉토리 내에 임의의 새로운 디렉토리를 만들고 그곳에 저장한다.
예제)
$ docker run -d -v $(pwd)/html:/usr/share/nginx/html -p 80:80 nginx
- [host path] : $(pwd)/html
호스트 OS의 현재 디렉토리(pwd) 안에 있는 html 디렉토리 (=호스트 OS의 현재 디렉토리는 nginx의 html 디렉토리가 있는 곳으로 가정) - [container mount path] : /usr/share/nginx/html
컨테이너의 nginx 디렉토리
[참고] 저장되는 디렉토리 확인
$ docker inspect [컨테이너 ID or 컨테이너 명]
- "Mounts" > "source" 확인 ("Destination"은 컨테이너의 디렉토리)
[참고] 컨테이너 간 데이터 공유는 어떻게 할까?
더보기
- 컨테이너 간 데이터 공유는 컨테이너끼리 직접 공유하는 것이 아닌, 각 컨테이너가 동일한 호스트 디렉토리를 마운트함으로써 해당 디렉토리를 통해 공유할 수 있다.
- 그림 해석
- 애플리케이션 컨테이너가 파일을 만들어서 호스트에 저장, Nginx 컨테이너가 파일을 클라이언트에게 제공한다.
- 컨테이너1과 컨테이너2는 각각 호스트 시스템의 /webdata 디렉토리를 통해 데이터를 공유하고 있다.
- 컨테이너1이 파일을 생성해 /webdata에 저장하고, 컨테이너2가 /webdata에 접근해 클라이언트에게 파일을 제공한다.
- [참고] 컨테이너 생성 명령어
- 호스트 디렉토리: /webdata
- 컨테이너1(애플리케이션 컨테이너) 생성: $ docker run -v /webdata:/webdata -d myApp:latest
- 컨테이너2(Nginx 컨테이너) 생성: $ docker run -v /webdata:/usr/share/nginx/html:ro -d myApp:latest
2. 도커 볼륨
1) 도커 볼륨 생성
$ docker volume create --name [도커 볼륨 이름]
- 도커가 제공하는 볼륨 관리 기능을 활용해 데이터를 보존한다
- volume create 명령어를 이용해 도커 볼륨을 생성할 수 있다
- 기본적으로 도커 호스트 OS의 /var/lib/docker/volumes/${volume-name}/_data 에 데이터가 저장됨
- 도커 볼륨과 도커 컨테이너의 디렉토리 마운트 역시 -v 옵션을 사용한다.
예제)
#!/usr/bin/env sh
# 'db'라는 이름의 도커 볼륨 생성
docker volume create --name db
# 도커 볼륨 목록 출력 (도커 호스트 OS에서 출력됨)
docker volume ls
# 도커 볼륨과 마운트 하는 컨테이너(mysql) 생성
docker run \
-d \
--name fastcampus-mysql \
-e MYSQL_DATABASE=fastcampus \
-e MYSQL_ROOT_PASSWORD=fastcampus \
-v db:/var/lib/mysql \ # 'db'라는 도커 볼륨과 컨테이너의 /var/lib/mysql 디렉토리를 마운트 함
-p 3306:3306 \
mysql:5.7
- 쉘 스크립트(.sh 파일)로 작성된 예제
- 도커 호스트에서 'docker volume' 이라고 입력하면 docker volume과 관련된 명령어를 확인할 수 있음
2) 도커 볼륨 설정정보 확인
$ docker volume inspect [도커 볼륨 이름]
- volume inspect 명령어를 통해 도커 볼륨의 설정 정보를 확인할 수 있다
예제)
- "Mountpoint"를 통해 도커 호스트 내 데이터가 쌓이는 경로를 확인할 수 있다
- 'sudo ls -l /var/lib/docker/volumes/db/_data' 를 입력하면 mysql 데이터가 쌓이는 것을 확인할 수 있다
3) 도커 볼륨 삭제
$ docker volume rm [도커 볼륨 이름]
- volume rm 명령어를 통해 도커 볼륨을 삭제할 수 있다
- 만약 volume is in use - ... 와 같이 에러가 뜬다면 현재 도커 볼륨이 사용중이기 때문에 삭제하지 못하는 것이다. 이럴 땐 도커 볼륨을 사용하는 컨테이너를 먼저 삭제 후 도커 볼륨을 삭제해야 한다.
3. 볼륨 컨테이너
1) 볼륨 컨테이너의 개념
- 볼륨 컨테이너는 데이터만 관리할 목적의 볼륨 컨테이너를 만들어 관리하는 것이다.
- 볼륨 컨테이너는 특별한 타입의 컨테이너가 아니라 일반 컨테이너처럼 생성해서 데이터만 쌓는 것이다.
- 그림에서 Data-only Container가 볼륨 컨테이너, 좌측의 Containter는 볼륨 컨테이너를 참조하는 어플리케이션 등의 컨테이너다.
- 데이터가 필요한 컨테이너는 볼륨 컨테이너를 참조한다
2) 볼륨 컨테이너를 참조하는 컨테이너 생성
$ docker run --volumes-from [컨테이너 ID or 컨테이너 명]
- --volumes-from [컨테이너 ID or 컨테이너 명] 옵션을 사용해 참조할 컨테이너를 지정한다
예제)
#!/usr/bin/env sh
# Step1. 볼륨 컨테이너 생성: web-volume
docker run \
-d \
-it \
-v $(pwd)/html:/usr/share/nginx/html \. # 도커 호스트 디렉토리와 볼륨 마운트
--name web-volume \
ubuntu:focal # 데이터 관리 목적이므로 단순 우분투 이미지 사용
# Step2. 볼륨 컨테이너를 참조하는 컨테이너 생성: my-nginx
docker run \
-d \
--name my-nginx \
--volumes-from web-volume \. # 볼륨 컨테이너 web-volume을 참조하도록 설정
-p 80:80 \
nginx
- 쉘 스크립트(.sh 파일)로 작성된 예제
- 스크립트가 실행된 후 도커 호스트에서 docker ps 명령어를 통해 두 개의 컨테이너가 생성된 것을 확인한다.
- 도커 호스트에서 curl localhost:80를 입력해 정상적으로 연결되는지 확인한다
- docker inspect my-nginx 명령어를 입력해 컨테이너의 마운트 설정 정보를 확인해보자
- "Mounts" 부분을 통해 마운트 정보를 확인할 수 있다
- "Source" : 도커 호스트의 디렉토리
- "Destination" : 볼륨 마운트 된 컨테이너의 디렉토리
'DevOps > Docker' 카테고리의 다른 글
[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법 (0) | 2022.06.07 |
---|---|
[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry) (0) | 2022.06.07 |
[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음 (0) | 2022.05.14 |
[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어 (0) | 2022.05.08 |
[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성 (0) | 2022.04.30 |