[Docker] Docker Volume
- -
Docker Volumes
도커는 각 컨테이너마다 독자적인 저장소(Volume)을 가진다.
컨테이너 내부에 저장되는 데이터는 컨테이너가 삭제되었을 경우 함께 사라진다.
이를 보완하기 위해 도커는 데이터의 영속성을 보장하기 위한 여러 방법을 지원하는데, 그 중 하나가 도커 볼륨이다.
볼륨의 종류에는 크게 세 가지가 있다.
Bind Mount
- 호스트 환경의 특정 경로를 컨테이너 내부 볼륨과 연결하여 마운트한다.
- 디렉토리 경로를 본인의 환경에 맞게 사용할 수 있는 장점이 있으나, 디렉토리 경로가 분산되어 관리가 어려워질 수 있다.
- 지정한 호스트 디렉토리나 컨테이너 디렉토리가 없으면 자동으로 생성된다.
-v [host-directory-path]:[container-mount-path]
Volume
- Docker에서 관리하는 볼륨을 사용한다.
- 볼륨은 호스트 디렉토리의
/var/lib/docker/volumes
경로에 저장되며, 관리가 용이하다. -v [volume-name]:[container-mount-path]
tmpfs Mount
- 호스트 시스템의 메모리에 저장된다.
--tmpfs [container-mount-path]
Docker Volume 관련 명령어
# 도커 볼륨 생성
$ docker volume create [volume-name]
# 도커 볼륨 조회
$ docker volume ls
# 도커 볼륨 정보 확인
$ docker volume inspect [volume-name]
# 도커 볼륨 삭제
$ docker volume rm [volume-name]
# 도커 볼륨 전체 삭제
$ docker volume prune
Volume을 통한 컨테이너 데이터 백업
Bind Mount
와 Docker volume
방식을 이용하면 데이터를 쉽게 백업할 수 있다.
컨테이너의 애플리케이션 구동에 필요한 설정 파일들이 담긴 디렉토리를 호스트 디렉토리와 연결했기 때문에 컨테이너를 삭제해도 호스트 디렉토리에는 해당 디렉토리와 연결된 컨테이너의 디렉토리 파일들이 남아있다.
호스트 디렉토리만 잘 관리해주면 컨테이너의 설정 및 데이터를 그대로 백업하여 새로운 컨테이너에서 사용할 수 있다.
mysql
컨테이너로 확인 해보도록 하겠다.
나는 docker-compose
를 통해 mysql-container
를 생성했다.
이 때, Docker Volume
방식을 사용했고, todo_mysql
이라는 볼륨 이름을 가진 볼륨을 마운트했다.
아래는 사용한 docker-compose.yml
파일 내부이다.
# docker-compose.yml 파일
version: '3'
volumes:
todo_mysql:
external: true
name: todo_mysql
services:
db:
container_name: mysql-container
image: mysql
ports:
- 3306:3306
volumes:
- todo_mysql:/var/lib/mysql
env_file: .env
environment:
- TZ=Asia/Seoul
restart: always
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --character-set-client-handshake=FALSE
컨테이너를 삭제하기 전, 데이터를 확인하고 새로운 데이터를 추가하였다.
# 기존 데이터베이스 목록 확인
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todo_kotlin |
+--------------------+
5 rows in set (0.00 sec)
mysql> use todo_kotlin;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
# 기존 데이터 확인
Database changed
mysql> select * from test_table;
+----+------+
| id | name |
+----+------+
| 1 | test |
+----+------+
1 row in set (0.00 sec)
# 데이터 추가
mysql> insert into test_table(name) values('test2');
Query OK, 1 row affected (0.01 sec)
# 추가한 데이터 확인
mysql> select * from test_table;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
+----+-------+
2 rows in set (0.00 sec)
mysql> exit
Bye
그런 다음, 컨테이너를 중지하고 삭제한다.
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12b834875c95 mysql "docker-entrypoint.s…" 45 minutes ago Up 45 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-container
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker stop 12b83
12b83
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker rm 12b83
12b83
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
다시 컨테이너를 띄운다. 나는 위에서 작성한 docker-compose.yml
파일을 그대로 사용했다.
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker-compose up -d
[+] Running 1/1
⠿ Container mysql-container Started 1.7s
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f75dcde5e01a mysql "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-container
이제 컨테이너 내부의 mysql 데이터를 다시 확인해보자.
# docker exec 명령으로 컨테이너 접근
root@ubuntu:/home/ubuntu/yoo_dev/todo_mysql# docker exec -it mysql-container bash
# 컨테이너에서 mysql 접근
bash-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.30 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
# database 목록
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| todo_kotlin |
+--------------------+
5 rows in set (0.01 sec)
# database 사용
mysql> use todo_kotlin;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
# 테이블 내용 표시
mysql> select * from test_table;
+----+-------+
| id | name |
+----+-------+
| 1 | test |
| 2 | test2 |
+----+-------+
2 rows in set (0.01 sec)
mysql> exit
Bye
컨테이너를 내리기 전에 작성한 데이터가 들어있는 것을 확인할 수 있다.
컨테이너의 데이터를 백업하려면, 컨테이너에 마운트된 호스트 디렉토리(볼륨)를 압축해서 백업하면 된다.
'docker' 카테고리의 다른 글
[Docker] MySQL 컨테이너 띄우고 원격 접속 허용하기 (0) | 2023.01.15 |
---|---|
[Docker] Docker-Compose (0) | 2022.12.09 |
[Docker] MySQL 컨테이너에 초기 데이터 삽입 (0) | 2022.12.09 |
소중한 공감 감사합니다