10월 15일(화) 실습 내용
2024.10.16 - [분류 전체보기] - [DOCKER] Docker Volume - 데이터 영속성 관리를 위한 도커 볼륨
- 이전 글에서 언급한 것과 같이,
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
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
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
'DOCKER' 카테고리의 다른 글
[DOCKER] IaC와 Dockerfile (2) | 2024.10.21 |
---|---|
[DOCKER] Docker Volume 실습 - 데이터베이스 데이터 지속성 유지 (0) | 2024.10.17 |
[DOCKER] Docker Volume - 데이터 영속성 관리를 위한 도커 볼륨 (0) | 2024.10.16 |
[DOCKER] Docker 컨테이너 실습 - Python, Nodejs 파일 컨테이너로 실행 (2) | 2024.10.16 |
[DOCKER] Docker 컨테이너 생성 실습 - Nginx 생성 후 포트 수정 (0) | 2024.10.16 |