도커 볼륨
도커 이미지로 컨테이너를 생성하면, 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 파일시스템에 저장한다. 이외의 정보(워드프레스 블로그를 데이터베이스 정보 등)는 컨테이너가 갖는다.
이때 컨테이너를 삭제하면 컨테이너 계층에 저장돼있던 데이터베이스 정보도 삭제되는 단점이 있다. 이를 방지하기 위해 컨테이너의 데이터를 영속적으로 활용하기 위한 방법으로 볼륨을 활용할 수 있다.
볼륨을 활용하는 방법
1. 호스트와 볼륨 공유 2. 볼륨 컨테이너 활용 3. 도커가 관리하는 볼륨 생성
호스트와 볼륨 공유
호스트의 볼륨을 공유하는 mysql 데이터베이스 컨테이너와 워드프레스 웹 서버를 생성한다.
$ docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
$ docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress_hostvolume \
--link wordpressdb_hostvolume:mysql \
-p 80 \
wordpress
-v 옵션: [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리] 형태로 두 디렉터리를 공유한다. 파일 단위 공유도 가능하고, 동시에 여러 개의 -v 옵션을 쓸 수도 있다.
위 명령어는 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리를 공유한다. /var/var/lib/mysql 디렉터리는 MySQL이 데이터베이스를 저장하는 기본 디렉터리로, /home/wordpress_db 디렉터리와 동기화되는 것이 아니라 완전히 같은 디렉터리다.
/home/wordpress_db 디렉터리를 호스트에 생성하지 않았어도 도커는 자동으로 이를 생성한다. 해당 디렉터리에는 mysql을 구동하는 데 필요한 각종 파일이 공유된다.
$ ls /home/wordpress_db
auto.cnf client-cert.pem ib_logfile0 ibtmp1 performance_schema server-cert.pem wordpress
ca-key.pem client-key.pem ib_logfile1 mysql private_key.pem server-key.pem
ca.pem ib_buffer_pool ibdata1 mysql.sock public_key.pem sys
컨테이너를 삭제해 데이터베이스의 데이터가 보존되는지 확인한다.
$ docker stop wordpress_hostvolume wordpressdb_hostvolume
$ docker rm wordpress_hostvolume wordpressdb_hostvolume
/home/wordpress_db 디렉터리에는 mysql 컨테이너가 사용한 데이터가 그대로 남아있다.
$ ls /home/wordpress_db
auto.cnf client-cert.pem ib_logfile0 ibtmp1 performance_schema server-cert.pem wordpress
ca-key.pem client-key.pem ib_logfile1 mysql private_key.pem server-key.pem
ca.pem ib_buffer_pool ibdata1 mysql.sock public_key.pem sys
호스트에 이미 디렉터리와 파일이 존재하고, 컨테이너에도 존재할 때 두 디렉터리를 공유하면 컨테이너 디렉터리 자체가 덮어씌어진다. 즉, -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너 디렉터리에 마운트한다.
볼륨 컨테이너
컨테이너를 생성할 때 --volumes-from 옵션을 설정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있다.
앞서 생성한 wordpressdb_hostvolume 컨테이너의 볼륨을 공유받아 컨테이너를 생성하자.
$ docker run -i -t \
--name volumes_from_container \
--volumes-from wordpressdb_hostvolume \
ubuntu:14.04
wordpressdb_hostvolume 컨테이너는 /var/lib/mysql 디렉터리를 호스트와 공유하고, 해당 컨테이너를 볼륨 컨테이너로서 volumes_from_container 컨테이너에 공유한다.
생성 후 /var/lib/mysql/을 확인하면 wordpressdb_hostvolume 컨테이너 볼륨에 존재하던 파일들이 똑같이 존재한다.
root@798f9c887f15:/# ls /var/lib/mysql/
auto.cnf client-cert.pem ib_logfile0 ibtmp1 performance_schema server-cert.pem wordpress
ca-key.pem client-key.pem ib_logfile1 mysql private_key.pem server-key.pem
ca.pem ib_buffer_pool ibdata1 mysql.sock public_key.pem sys
여러 컨테이너가 동일한 컨테이너에 --volumes-from 옵션을 사용해 볼륨을 공유하여 사용할 수도 있다. 이를 통해 별도의 역할 없이 볼륨만 공유하는 볼륨컨테이너로 활용 할 수도 있다.
도커 볼륨
docker volume 명령어로 도커 자체에서 제공하는 볼륨 기능을 활용해 데이터를 보존할 수 있다.
· 볼륨 생성: docker volume create
$ docker volume create --name myvolume
위 명령어는 myvolume이라는 볼륨을 생성한다. 해당 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해 성성되고 삭제된다.
· 볼륨 확인: docker volume ls
$ docker volume ls
DRIVER VOLUME NAME
local myvolume
- 볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류의 스토리지 백엔드를 쓸 수 있다. local은 기본적으로 제공되는 드라이버다.
· 볼륨 공유하기: -v [볼륨 이름]:[컨테이너 공유 디렉터리]
다음 명령어는 myvolume이라는 볼륨을 사용하는 컨테이너를 생성한다.
$ docker run -i -t --name myvolume_1 \
-v myvolume:/root/ \
ubuntu:14.04
root@82fead046025:/#
컨테이너 볼륨이 마운트된 컨테이너의 /root/ 디렉터리에 파일을 쓴다.
root@82fead046025:/# echo hello, volume! >> /root/volume
myvolume 볼륨을 사용하는 새로운 컨테이너를 생성하고, 앞서 /root/ 디렉터리에 쓴 파일이 존재하는지 확인한다.
$ docker run -i -t --name myvolume_2 \
-v myvolume:/root/ \
ubuntu:14.04
root@82fead046025:/# cat /root/volume
hello, volume!
docker volume 명령어로 생성한 볼륨은 아래 구조로 활용된다.
· 볼륨 저장 위치 확인: docker inspect
docker inspect 명령어는 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보를 확인할 때 사용된다.
$ docker inspect --type volume myvolume
[
{
"CreatedAt": "2022-10-10T12:25:21Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
- Driver: 볼륨이 쓰는 드라이버
- Label: 볼륨을 구분하는 라벨
- Mountpoint: 호스트 내부 볼륨 저장 위치
(맥의 경우 도커 구동시 리눅스 가상 머신이 생성되고, 가상머신 안에서 도커가 구동되어 /var/lib/docker 파일을 못찾을 수 있다)
· 볼륨 모두 삭제: docker volume prune
· stateless: 이처럼 컨테이너가 아닌 외부에 데이터를 저장하고 컨테이너는 그 데이터로 동작하도록 설계를 의미한다. 컨테이너 자체는 상태가 없고 상태를 결정하는 데이터는 외부로부터 제공받는다. 권장되는 설계 방식이다.
· stateful: 컨테이너 자체에 데이터를 보관하는 방식이다. 지양되는 설계 상식이다.
출처
시작하세요! 도커/쿠버네티스
댓글