컨테이너를 생성 후 서비스를 운영하다보면 컨테이너 안에는 설정정보, 데이터 등 여러가지 데이터가 쌓이게 된다. 컨테이너가 삭제되면 그동안 운영되면서 쌓인 정보들 역시 같이 삭제된다. 이전 포스팅을 보면 rm 명령어로 간단하게 컨테이너가 삭제되는 것을 확인할 수 있었으며 삭제된 정보들은 복구가 불가능하다.
이를 해결하기 위해서는 Docker 볼륨이라는 개념이 중요하게 작용한다.
Docker 볼륨은 디렉터리간의 동기화가 가능하게 하고 컨테이너 내부에 있는 데이터를 외부에 공유하여 동시에 관리할 수 있도록 해준다.
1. 호스트와 볼륨 공유
sudo docker run -d \
--name wordpressSql \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lin/mysql \
mysql:5.7
sudo docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress_hostvolume \
--link wordpressSql:mysql \
-p 80:80 \
wordpress
-v 옵션을 통해 볼륨을 생성하였고 그 뒤에 /home/wordpress_db:/var/lin/mysql이 사용된 것을 확인할 수 있다.
앞에 있는 /home/wordpress_db는 호스트 디렉터리이며, /var/lin/mysql은 컨테이너 내부의 디렉터리이다.
cd /home/wordpress_db
호스트 디렉터리를 미리 생성하지 않아도 자동으로 생성되어 있음을 확인할 수 있으며 해당 디렉터리에 진입하면 mysql관련 파일들이 있는 것을 확인할 수 있다.
sudo docker rm wordpress_hostvolume wordpressSql
해당 명령어를 통해 컨테이너를 지우고 난 후 디렉터리에 접근하면 파일은 그대로 남아있다.
이와 반대로 기존에 있는 디렉토리에 볼륨을 사용하면 디렉터리 내부에 있던 기존 데이터들은 그대로 덮어씌어진다.
2. 볼륨 컨테이너
--volumes-from을 통해 -v 옵션을 사용한 컨테이너의 볼륨 디렉터리를 공유할 수 있다.
sudo docker run -i -t \
--name volume_overide \
-v /home/wordpress_db:/home/testdir_2
alicek106/volume_test
sudo docker run -i -t \
--name volumes_from_container \
--volumes-from volume_overide \
ubuntu:14.04
volume-from을 통해 여러 컨테이너와 볼륨을 공유할 수 있으며 별도의 기능이 없으며 볼륨만 공유받는 '볼륨 컨테이너' 역할만 수행하는 컨테이너 역시 존재한다.
3. 도커 볼륨
지금까지 활용한 방식은 호스트와 볼륨을 공유하거나 볼륨 컨테이너를 이용하는 방법이다. 마지막은 도커 자체에서 제공하는 볼륨 기능을 활용한 방식이다.
sudo docker volume create --name myvolume
sudo docker volume ls
해당 명령어로 도커 볼륨을 생성할 수 있으며 ls를 통해 볼륨 목록을 확인할 수 있다.
sudo docker run -i -t \
--name myvolume_1 \
-v myvolume:/root/ \
ubuntu:14.04
호스트와 볼륨을 공유할 때는 '호스트디렉터리':'컨테이너 디렉터리' 형식이였지만,
도커 볼륨을 이용할 때는 '볼륨이름':컨테이너 디렉터리' 형식으로 작성해야 한다.
echo hello, world >> /root/volume
컨테이너 내부에 들어와 파일을 생성하고
sudo docker run -i -t \
--name myvolume_2 \
-v myvolume:/root/ \
ubuntu:14.04
cat /root/volume
볼륨을 공유하는 새로운 컨테이너를 생성 후 파일을 켜보면 hello, world가 출력되는 것을 확인할 수 있다.
도커 볼륨인 myvolume이 저장되는 위치를 알 필요는 없지만 inspect 명령어를 통해 그 위치를 알 수 있다.
inspect 명령어는 위치 뿐만 아니라 도커의 모든 구성 단위의 정보를 확인할 때 사용되며 --type 옵션을 통해 보고자하는 정보를 찾아볼 수 있다.
sudo docker inspect --type volume myvolume
스테레이트리스(stateless)하게 설계하는 방식이 이처럼 외부에 데이터를 저장하고 관리하는 것을 의미하며,
스테이트풀(stateful)하게 설계하는 방식은 컨테이너가 데이터를 직접 저장하고 있는 방식을 의미한다.
따라서 stateless하게 설계하는 방식이 삭제돼더라도 데이터는 보존되기 때문에 관리하기에 용이하다.
'Docker' 카테고리의 다른 글
6. Docker 컨테이너 로깅 (0) | 2024.07.16 |
---|---|
5. Docker 네트워크 (0) | 2024.07.09 |
3. Docker 컨테이너 애플리케이션 (1) | 2024.07.02 |
2. Docker 엔진 (0) | 2024.07.02 |
1. Docker (1) | 2024.07.01 |