새소식

docker

[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 MountDocker 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 Volume

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.