[Docker] 컨테이너 볼륨
컨테이너 볼륨이란?
- 컨테이너 이미지는 read-only(수정이 불가능한 상태)
- 컨테이너 또한 read-only
-
컨테이너에 추가되는 데이터들은 별도의 RW(Read-Write) 레이어에 저장됨
- 도커는 Union File System(Overlay) 구조로 작동하여 RO와 RW가 하나인 것처럼 동작(RO 위에 RW가 쌓이는 구조로 작동함)
- 예를 들어 mysql 컨테이너가 RO(Read-Only)로 작동하면 그 위에 데이터 들이 RW 레이어(
/var/lib/mysql
)에 쌓임 - 그러나 컨테이너를 삭제해 버리면 RO와 RW 전부 사라져 복원할 수 없다!!!
- “컨테이너에서 만든 데이터를 영구적 보존” : Docker Host에 특정 저장 공간을 만들어주는 방법?? -> 볼륨마운트
$ docker run -d --name db -v /dbdata:/var/lib/mysql \
-e MYSLQ_ALLOW_EMPTY_PASSWORD=pass mysql:latest
- 컨테이너를 삭제해도
/dbdata
는 남아 있기 때문에, 나중에 다시 컨테이너를 다시 실행해도 쌓아놨던 동일한 데이터를 가지고 service를 실행 가능
volume 옵션 사용
-v <host path>:<container mout path>
$ docker run -d -v /dbdata:/var/lib/mysql -e MYSQL...
- 해당 커멘드는 컨테이너가 docker host의 directory를 수정하게됌.
- 보안이슈 등으로 인해 권장되지는 않음 (default :
rw
)
-v <host path>:<container mout path>:<read write mode>
$ docker run -d -v /webdata:/var/www/html:ro httpd:latest
ro
: /webdata의 데이터를 이용해 service를 실행하나 apache는 host에 있는 데이터를 수정하지 못하도록 보호하면서 마운트
-v <container mount path>
$ docker run -d -v /var/lib/mysql -e MYSQL...
- 임의의 컨테이너 디렉토리를 넣어주어 자동마운트 시켜줌
- “컨테이너 끼리의 데이터 공유가 가능해짐”
- 컨테이너의 data를 host /webdata에 저장
- /webdata 데이터를 readonly형식으로 다른 웹 서버로 docker run하여 service
실습
__-v
: __
-
$ docker run -d --name db -v /dbdata:/var/lib/mysql -e \ MYSQL_ROOT_PASSWORD=pass mysql:latest
$ docker exec -it db /bin/bash
- db 컨테이너 안으로 들어감
-
root@d09da1f9a493:/# mysql -u root -ppass
-
root@d09da1f9a493:/#
: db 터미널 -
db에 접속함.
-
-
mysql> show databases;
- db list가 보여짐
-
mysql> create database docker;
- docker 라는 database를 생성
-
$ cd /dbdata/
-
만들어둔 dbdata로 들어감
-
ls
보면 아까 만들어둔 docker db 생성된 것 확인 가능
-
-
$ docker rm -f db
-
docker 컨테이너를 삭제해버림
-
RO, RW 전부 사라졌으니 volume mout 해준 data 남아 있나 확인해보자
-
-
ls /dbdata/
-
data 그대로 남아있음
-
컨테이너를 또 만들어도 이 데이터를 그대로 다시 사용 가능함
-
__-v
__
컨테이너 path만 써도 데이터가 영구보존이 될까?
어디에 저장이 되는것인지 알아보자
-
$ docker run -d --name db -v /var/lib/mysql -e \ MYSQL_ROOT_PASSWORD=pass mysql:latest
-
docker inspect
-
jungik@DESKTOP-J10OVLO:/$ docker inspect db | grep -E "Source|Destination"* "Source": "/var/lib/docker/volumes/d08d80221de3456e25ec13a762b55098a8ebf8f41fbdbf697b217c9c349faa84/_data", "Destination": "/var/lib/mysql", # Source : volume mount 되는 directory # Destination : container data가 저장되는 위치 # volume mount 된 것을 확인할 수 있음
-
-
docker volume ls
- volume 목록 확인
-
docker volume rm <해당UUID>
- 필요없는 volume 삭제
댓글남기기