볼륨이 뭘까?? 볼륨은 공간을 이야기한다. 로컬 공간이다. 컨테이너가 있는 가상 공간이 아닌, HostOS 에 있는 공간이다.
왜 필요할까?? 결론 먼저 이야기하면 컨테이너 안에 있는 데이터를 보존하고 공유하는 등 로컬에서도 관리하기 위해서이다.
아래는 nginx, wordpress, mariadb 컨테이너가 생성되고 서로 상호작용하는 그림이다.
조금 더 확대해보면, volume 이 설정되어있는 걸 확인할 수 있다.
여러 컨테이너를 생성하고 컨테이너 안에서 여러 작업을 하며 많은 데이터를 쌓았다.
컨테이너를 통해 이미지를 계속 업데이트 하면서 레거시 이미지와 컨테이너가 쌓였다.
불필요한 걸 지우자.
❗️앗... 실수로 최근 생성한 이미지와 컨테이너를 지워버렸다. 컨테이너에서 작업한 내 데이터는 모두 어떻게 되는걸까...
백업하지 않았다면, 모두 사라졌을 것이다.
이러한 상황을 방지하기 위해 volumes 설정을 한다.
services:
nginx:
build: requirements/nginx
image: nginx
...
volumes:
- wp_volume:/var/www/html/wordpress
...
mariadb:
init: true
build: ./requirements/mariadb/
image: mariadb
...
volumes:
- db_volume:/var/lib/mysql/
...
wordpress:
build: requirements/wordpress
image: wordpress
...
volumes:
- wp_volume:/var/www/html/wordpress
...
volumes:
wp_volume:
name: wp_volume
driver: local
driver_opts:
type: none
device: /home/jaekim/data/wordpress
o: bind
db_volume:
name: db_volume
driver: local
driver_opts:
type: none
device: /home/jaekim/data/mariadb
o: bind
...
service 부분을 보면 nginx, mariadb, wordpress 이미지 생성부분이 있고, volumes 설정이 되어 있는 걸 확인할 수 있다.
wp_volume:/var/www/html/wordpress
db_volume:/var/lib/mysql/
[로컬에 설정한 공간] : [컨테이너에 설정한 공간]
로컬과 컨테이너의 공간을 연결해준다.
wp_volume 과 db_volume 이 로컬 공간이라는 의미인데, 어디서 정의가 되었는가??
하단에 volumes 을 보자
두 개의 볼륨이 로컬에 설정되어있다! 로컬에 어느 위치인지는 device 를 보면 알 수 있다.
/home/jaekim/data/wordpress
/home/jaekim/data/mariadb
다시 말하면
컨테이너의 /var/www/html/wordpress
와 로컬의 /home/jaekim/data/wordpress
가 같은 데이터를 공유하고
컨테이너의 /var/lib/mysql/
과 로컬의 /home/jaekim/data/mariadb
가 같은 데이터를 공유한다.
volumes을 통해 컨테이너가 삭제되어도, 로컬에 데이터가 보존되기 때문에 문제가 발생하지 않게 할 수 있다.