도커 컨테이너에 사용된 파일들은 컨테이너가 삭제될 때 함께 삭제된다. 도커에서 많은 애플리케이션을 저장해서 계속적으로 사용할 수 있도록 해주는 옵션이 바로 볼륨(volume)과 바인드 마운트(bind mount)이다.
- 바인트 마운트
호스트의 특정 디렉터리를 직접 연결
호스트의 파일 시스템과 컨테이너 내부를 연결해 양쪽의 내용이 동시에 반영되는 방법 - 볼륨
볼륨 공간(에서 디렉터리를 마운트)을 만든 후 그 볼륨 공간을 연결
도커가 관리하는 볼륨을 컨테이너와 연결 → 공유 디렉터리에 생성
바인드 마운트
바인드 마운트로 호스트와 컨테이너를 연결하기 위해서는
연결 대상이 되는 컨테이너 내부의 디렉터리 구조를 먼저 알아야 한다.
예를 들어 nginx의 경우 수정해야 하는 파일의 경로 는 /etc/nginx/nginx.conf에 존재한다.
바인드 마운트 Nginx 컨테이너를 생성해보자
실행 환경은 동일하게 컨테이너를 rockylinux에서 진행한다.
mkdir -p /root/html
docker run -d -p 8081:80 \
-v /root/html:/usr/share/nginx/html --restart always --name nginx-bind-mounts nginx
//-p [로컬포트]:[컨테이너포트]
//-v [로컬경로]:[컨테이너경로]
docker ps -f name=nginx-bind-mounts //컨테이너 조회
컨테이너는 포트, 이름 등이 겹치면 생성이 안 되므로 주의한다.
바인트 마운트는 호스트 디렉터리의 내용을 그대로 컨테이너 디렉터리에 덮어쓴다는 특성이 있다.
따라서 컨테이너 디렉터리에 어떠한 내용이 있다라도 해당 내용은 삭제된다.
현재는 마인드 마운트 됐으나 해당 경로에 파일이 없는 상태이다.
로컬 경로인 /root/html 에 index.html을 생성해보면
마스터 경로인 /root/html 와 호스트 경로인 /usr/share/nginx/html 로 바인드마운트로 index.html이 호스트에서 컨테이너로 전달되는 것을 확인할 수 있다.
http://192.168.1.10:8081/ 로 접근했을 때 업로드한 파일이 렌더링 된 화면을 볼 수 있다.
docker exec [컨테이너ID] [명령어] [경로] 컨테이너의 경로 파일 조회하기
docker exec -it [컨테이너ID] /bin/bash 컨테이너의 콘솔로 접근하는 명령어(i : interactive, t : tty pseudo)
볼륨(volume)
볼륨은 도커가 직접 관리하며 컨테이너에 제공하는 호스트의 공간이다.
docker volume create nginx-volume
볼륨 생성하기
docker volume ls
생성된 볼륨을 확인할 수 있다.
docker volume inspect nginx-volume
볼륨에 적용된 드라이버 종류와 실제 호스트에 연결된 디렉터리, 볼륨 이름 등을 조회할 수 있다.
컨테이너 내부와 연결할 때 전체 디렉터리 경로를 사용하지 않고 볼륨 이름만으로 간편하게 연결할 수 있다.
"Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data" 라고 명시된 부분은 로컬에 연결된 볼륨의 위치를 말한다.
docker volume rm \[볼륨 이름\]
docker volume prune
연결되지 않은 도커 볼륨 삭제 가능
호스트와 컨테이너의 디렉터리를 연결할 컨테이너를 구동해보자!
기존 컨테이너는 설정을 바꿀 수 없기 때문에 새로운 컨테이너를 구동해야한다.
8082 포트 nginx 컨테이너 생성
docker run -d -v nginx_volume:/usr/share/nginx/html -p 8082:80 --restart always --name container1 nginx:latest
//-v [볼륨 이름]:[컨테이너 디렉터리]
/생성한 nginx_volume 과 컨테이너의 /usr/share/nginx/html 경로와 연결할 수 있는 볼륨인 nginx-volume을 생성한다.
/생성한 nginx_volume 과 컨테이너의 /usr/share/nginx/html 경로와 연결할 수 있는 볼륨인 nginx-volume을 생성한다.
8083 포트 nginx 컨테이너 생성, 단 볼륨은 앞과 똑같이 nginx_volumedocker run -d -v nginx\_volume:/usr/share/nginx/html -p 8083:80 --restart always --name container nginx:latest
ls /var/lib/docker/volumes/nginx\_volume/\_data
mount point로 지정된 로컬 디렉터리를 조회한다.
바인드 마운트와 달리 볼륨은 빈 디렉터리를 덮어 쓰지 않고 컨테이너 내부에 이는 파일을 보존하는 것을 확인할 수 있다.
양쪽 디렉터리를 서로 동기화 시키는 구조이기 때문에 비어있는 볼륨을 연결하는 경우에는 컨테이너 디렉터리에 있는 파일이 보존된다.
하지만 볼륨에 컨테이너 디렉터리와 동일한 파일이 존재한 상태로 연결하는 경우에는 덮어쓰기가 되니 이 점에 대해 유의할 필요가 있다.
docker inspect container1
컨테이너의 여러 요소에 대한 상세 정보를 보여준다.
컨테이너에는 여러개의 볼륨을 적용할 수 있는데 컨테이너에 volume을 설정하게 되면 나중에 세팅을 바꾸기가 어렵기 때문에 초기에 설정을 해야한다.
docker run -d -v volume1:/usr/share/nginx/html -v volume2:/var/lib/mysql -p 8083:80 --restart always --name iamcontainer nginx:latest
로컬에 볼륨과 관련된 디렉터리를 생성하고 컨테이너와 연결을 할 때, 볼륨은 로컬에 있는 파일을 복사해서 컨테이너에 업데이트 하는 방식이다.
그렇기 때문에 로컬의 볼륨 파일에 있는 내용과 컨테이너의 디렉터리에 있는 내용이 동기화 될 수 있다.
볼륨, 바인드 마운트 모두 컨테이너가 중지 되더라도 파일이 유지된다.
도커 컨테이너 생성 시 권장되는 방법은 volume이다.
도커 솔루션으로 관리되기 때문에 docker volume ls 로 조회할 수 있고 docker volume rm 으로 삭제할 수 있다.
볼륨을 컨테이너 끼리 공유할 수 있다.
**note
또한, 사용하려는 볼륨의 경로를 설정할 때 올바른 경로로 설정하기 위해서는 이미지 내의 폴더 구조를 알아야 한다.
https://hub.docker.com/_/nginx
docker hub에는 다음과 같이 이미지의 기본 정보를 명시해준다.
참고자료
[도서]컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커
https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/
'DevOps' 카테고리의 다른 글
Vagrant란? (0) | 2023.06.29 |
---|---|
[kubernetes] 컨테이너 인프라 환경이란? (0) | 2023.05.25 |
[docker] 간단한 사용 예제 (0) | 2023.05.24 |
[docker] docker 란? (0) | 2023.05.19 |