퍼시스턴스 데이터를 다루는 방법
도커 컨테이너가 실행 중에 작성 혹은 수정된 파일은 호스트 쪽 파일 시스템에 마운트하지 않으면 컨테이너가 파기될 때 호스트에서 함께 삭제된다.
즉, 상태를 갖는 애플리케이션을 운영하려면 새로운 버전의 컨테이너가 배포돼도 이전 버전의 컨테이너에서 사용하던 파일 및 디렉터리를 그대로 이어받아 사용할 수 있어야 한다. 이런 경우에 데이터 볼륨(data volumne) 이 사용된다.
데이터 볼륨
데이터 볼륨은 도커 컨테이너 안의 디렉터리를 디스크에 퍼시스턴스 데이터로 남기기 위한 메커니즘이다. (호스트와 컨테이너 사이의 디렉터리 공유 및 재사용 기능을 제공)
데이터 볼륨을 사용하는 방법은 아래와 같다.
$ docker container run [options] -v 호스트_디렉터리:컨테이너_디렉터리 레퍼지토리명[:태그] [명령] [명령인자]
$ docker container run -v ${PWD}:/workspace 레파지토리명
컨테이너의 /workspace 디렉터리는 호스트의 현재 디렉터리(${PWD})에 마운트된다.
데이터 볼륨 컨테이너
데이터 볼륨은 컨테이너와 호스트 사이의 디렉터리를 공유하는 것이었으나, 데이터 볼륨 컨테이너는 컨테이너 간에 디렉터리를 공유한다.
데이터 볼륨 컨테이너는 이름 그대로 데이터를 저장하는 것만이 목적인 컨테이너다. 디스크에 저장된 컨테이너가 갖는 퍼시스턴스 데이터를 볼륨으로 만들어 다른 컨테이너에 공유하는 컨테이너가 볼륨 컨테이너다.
※ 데이터 볼륨 컨테이너가 공유한 디렉터리 역시 호스트 머신의 스토리지에 저장된다는 점에서 데이터 볼륨과 똑같다.
※ 데이터 볼륨 컨테이너가 직접 볼륨을 다뤄주므로 볼륨을 필요로 하는 컨테이너가 사용할 호스트 디렉터리를 알 필요가 없고 디렉터리를 제공하는 데이터 볼륨 컨테이너만 지정 하면된다. (데이터 볼륨이 데이터 볼륨 컨테이너 안에 캡슐화되므로 호스트에 대해 아는 것이 없어도 데이터 볼륨을 사용할 수 있다.)
데이터 볼륨에 MySQL 데이터 저장하기
FROM busybox
VOLUME /var/lib/mysql
CMD ["bin/true"]
- busybox : 최소한의 운영 체제 기능만 제공하는 경령 운영 체제. 도커 이미지 기반 이미지로 많이 사용된다.
- /var/lib/mysql 디렉토리에 대한 볼륨이 생성되어 호스트의 /var/lib/docker/volumnes 하위에 위치한다.
# 이미지 빌드
$ docker image build -t example/mysql-data:latest .
# 컨테이너 실행
$ docker container run -d --name mysql-data example/mysql-data:latest
볼륨 컨테이너를 띄우면 바로 종료되는데, 종료된 컨테이너를 사용해도 상관없다.
MySQL을 동작시킬 컨테이너를 실행한다.
$ docker container run -d --rm --name mysql \
-e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \
-e "MYSQL_DATABASE=volume_test" \
-e "MYSQL_USER=example" \
-e "MYSQL_PASSWORD=example" \
--volumes-from mysql-data \
mysql:5.7
데이터를 생성한 후 컨테이너를 삭제했다가 올려도 그대로 데이터가 존재하는지 확인해보자.
$ docker container exec -it mysql mysql -u root -p volume_test
(비밀번호는 enter)
create table user(id int primary key auto_increment, name varchar(255));
insert into user (name) values ('corn'), ('docker'), ('monkey');
+----+--------+
| id | name |
+----+--------+
| 1 | corn |
| 2 | docker |
| 3 | monkey |
+----+--------+
볼륨을 설정하지 않으면, 컨테이너를 중지시키면 해당 데이터(user)는 날아가게 된다.
하지만 우리는 볼륨 컨테이너를 설정하였으니, 과감하게 정지시킨 후 가동해보자.
$ docker container stop mysql
$ docker container run -d --rm --name mysql \
-e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \
-e "MYSQL_DATABASE=volume_test" \
-e "MYSQL_USER=example" \
-e "MYSQL_PASSWORD=example" \
--volumes-from mysql-data \
mysql:5.7
$ docker container exec -it mysql mysql -u root -p volume_test
select * from user;
+----+--------+
| id | name |
+----+--------+
| 1 | corn |
| 2 | docker |
| 3 | monkey |
+----+--------+
컨테이너를 삭제했다가 올려도, 데이터가 그대로 존재하는 것을 확인할 수 있다.
데이터 익스포트 및 복원
데이터 볼륨 컨테이너에서 사용하던 데이터를 다른 도커 호스트로 이전해야할 경우 볼륨 컨테이너에서 원하는 데이터 파일을 호스트로 꺼내야한다.
볼륨에 담긴 데이터를 호스트로 익스포트를 해보자.
busybox 컨테이너를 새로 실행한다. 그 다음 데이터 볼륨 컨테이너를 mysql-data로 지정한다. 컨테이너 안에서 tar로 압축한 다음, 압축된 파일이 위치한 /tmp 디렉터리를 현재 작업 디렉터리에 마운트한다.
$ docker container run -v ${PWD}:/tmp \
--volumes-from mysql-data \
busybox \
tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql
현재디렉토리에 mysql-backup.tar.gz 파일이 생성된 것을 볼 수 있다.
'프로그래밍 노트 > 도커' 카테고리의 다른 글
도커살펴보기_이미지 다루기 (0) | 2021.01.15 |
---|---|
도커살펴보기_컨테이너로 애플리케이션 실행하기 (0) | 2021.01.15 |
[docker] 안쓰는 도커 이미지 및 컨테이너 삭제 (0) | 2020.12.29 |
[docker] COPY failed: Forbidden path outside the build context 오류 해결법 (0) | 2020.12.09 |
[docker] Dockerfile 작성하기_1(이미지 만들고 배포하기) (0) | 2020.10.19 |