목차
Docker Volume
• container 안의 파일 변경 사항을 UnionFS을 통해 관리
• UnionFS은 이미지 layer와 write layer를 합쳐 container의 데이터 관리하는 데, container 삭제 시 write layer도 삭제
• write layer에는 이미지 layer의 데이터에서 변경된 사항 저장하므로 write layer 삭제 시 데이터 사라짐(데이터 휘발성)
• container의 데이터 휘발성 때문에 데이터를 container가 아닌 호스트에 저장
• 또는 container끼리 데이터 공유할 때 Volume 사용
=> 컨테이너가 삭제되어도 컨테이너의 DATA가 삭제되지 않도록 사용!
-> 영구적으로 data 저장
-> 데이터 공유 가능
-> 데이터 재사용성
cf) UnionFS - Aufs 는 Ubuntu 리눅스에서 지원하며 CentOS 는 기본적으로 지원하지 않는다. CentOS 는 Overlayfs 가 기본 Union Filesystem 으로 사용
사용방법
1. Bind Mount
2. Volumes
3. tmpfs -> 컨테이너의 data를 memory상 공간으로 이동 -> memory도 휘발성이므로 잘 사용 안함
Volumes
- Container는 Union FS에 data를 저장할 수 있고 /data에 data를 저장할 수 있음
- 그러나, 컨테이너가 삭제될때 UnionFS의 data는 삭제되나 /data는 삭제되지 않음
=> why? -> /var/lib/docker/volumes/_data라는 공간에 남아있기 때문
Bind Mount
- /root/data를 Container 상의 /data와 Mount
Docker Volume 직접 만들어보기
1. docker volume 생성 및 할당하기
# docker volume create 볼륨이름
# docker run --name nginx -d \
> -v http-volume:/usr/share/nginx/html -p 8080:80 nginx
만들어진 볼륨을 /usr/share/nginx/html과 마운트
/usr/share/nginx/html은 컨테이너상의 저장공간
-> 이를 http-volume과 마운트 하면 host에서의 /var/lib/docker/volumes/http-volume/_data에서 데이터 확인 가능
/var/lib/docker/volumes/http-volume/_data/index.html에서 컨테이너에서 작성한 index.html을 확인 가능
2. docker Volume 공유하기
docker run --name nginx2 -d \
> -v http-volume:/usr/share/nginx/html -p 8081:80 nginx
두번째 container 생성
이때 volume은 이전에 만들었던 http-volume과 mount
contianer 2개 생성된 것을 확인 할 수 있음
curl로 확인하면 똑같은 내용이 나타남 -> volume 공유하여 사용하는것을 확인가능
3. 컨테이너 삭제
컨테이너 삭제해도 host에서 컨테이너에서 저장한 data 확인 가능
물론 volume을 제거하면 확인 불가
Bind-mount 사용하기
Bind-mount 란 호스트의 특정 디렉토리(or 파일)을 container 와 매핑해서 사용하는 방법을 의미한다. 이를 위해 미리 마운트시킬 디렉토리를 준비해야 한다. Volume 의 위치를 사용자가 정할 수 있으므로 데이터를 찾기 쉬운 장점이 있다.
1. 호스트 디렉토리 생성 및 컨테이너에 할당 후 volume 사용하기
# mkdir /usr/local/mysql
# docker run --name mysql -d \
> -v /usr/local/mysql:/var/lib/mysql:Z -p 3306:3306 \
> -e MYSQL_USER=user1 -e MYSQL_PASSWORD=mypassword \
> -e MYSQL_DATABASE=sales \
> -e MYSQL_ROOT_PASSWORD=r00tpassword \
> mariadb
volume의 위치를 지정할 디렉터리를 만들고 그 디렉터리를 mount해준다
docker container exec -it mysql /bin/bash
container를 실행하여 container 내부에 데이터 만들기
경로로 가면 있다 와!
컨테이너 삭제 해도 남아있따 와!
2. Bind Mount 공유하기
첫번째 컨테이너에 마운트
두번째 컨테이너에 마운트
공유가 잘되는것을 확인할 수 있음
실시간 변경 또한 공유한다
index2.html파일을 만들고 이를 nginx-1에서 저장해도 nginx-2에서 확인 가능하다.
cf) bind mount로 volume을 mount할 경우 z라는게 있는것을 확인할 수 있다.
위 내용에서 selinux 를 사용하는 경우 z 또는 Z 옵션을 추가하여 컨테이너에 마운트되는 호스트 파일 또는 디렉토리의 selinux 레이블을 수정할 수 있다. 이는 호스트 시스템 자체의 파일 또는 디렉터리에 영향을 미치며 Docker 범위를 벗어나는 결과를 초래할 수 있다.
1) z 옵션: container내에서 접근할 수 있게 relable 한다. 다른 컨터이너에서 volume마운트할 경우에도 서로 접근가능(container 에서 공용접근이 가능하게 container_file_t 로 relabel)
2) Z 옵션: 바인드 마운트 콘텐츠가 비공개이고 공유되지 않음