클라우드 + DevOps/Docker

Docker :: 컨테이너 볼륨volume 개념과 실습

gamjadori 2024. 2. 26. 15:23
728x90

<볼륨이란?>

  • 볼륨: 도커 컨테이너 간에 데이터를 공유하고, 컨테이너의 파일 시스템이나 호스트 파일 시스템과 분리된 영역에 데이터를 저장하는 도커의 데이터 관리 기능
  • <특징>
  1. 영속성(Persistence): 볼륨은 컨테이너가 삭제되더라도 데이터를 보존하므로, 데이터의 영속성을 제공
  2. 컨테이너 간 데이터 공유: 여러 컨테이너에서 동일한 볼륨을 사용하여 데이터를 공유
  3. 백업과 복원: 볼륨은 백업 및 복원이 쉽고, 데이터를 관리하기 용이

 

<Docker 실습 :: 볼륨>

  • 볼륨 위치: /var/lib/docker/volumes

<볼륨 위치 확인> /var/lib/docker/volumes

ubuntu@host1:~/Labs/ch06$ sudo su -
[sudo] ubuntu 암호: 
root@host1:~# cd /var/lib/docker/volumes
root@host1:/var/lib/docker/volumes# ls
3c6934ae8b00c0075ee164b4adf4db3efd685465b23936fbe61323800a1d100a  backingFsBlockDev
5037ad84f479fac50914cb017c195a48592bb122348b30fc498e17b700b93526  metadata.db
7218ff99f0ef01950ab25d481f4e099e049adf6c750e5c76cd9bf9b797ed465c  portainer_data
8144d9495439098a90a41e9e592acba434b5da7463d42ff6908c487ac3a99805

>> mydb-data 볼륨 생성이 안 된 것을 볼 수 있음

 

<mydb-data 볼륨 생성 및 확인>

  • docker volume create (볼륨 이름)
root@host1:/var/lib/docker/volumes# docker volume create mydb-data
mydb-data

root@host1:/var/lib/docker/volumes# ls
3c6934ae8b00c0075ee164b4adf4db3efd685465b23936fbe61323800a1d100a  backingFsBlockDev
5037ad84f479fac50914cb017c195a48592bb122348b30fc498e17b700b93526  metadata.db
**7218ff99f0ef01950ab25d481f4e099e049adf6c750e5c76cd9bf9b797ed465c  mydb-data**
8144d9495439098a90a41e9e592acba434b5da7463d42ff6908c487ac3a99805  portainer_data
root@host1:/var/lib/docker/volumes# docker volume ls
DRIVER    VOLUME NAME
local     3c6934ae8b00c0075ee164b4adf4db3efd685465b23936fbe61323800a1d100a
local     5037ad84f479fac50914cb017c195a48592bb122348b30fc498e17b700b93526
local     7218ff99f0ef01950ab25d481f4e099e049adf6c750e5c76cd9bf9b797ed465c
local     8144d9495439098a90a41e9e592acba434b5da7463d42ff6908c487ac3a99805
**local     mydb-data**
local     portainer_data

 

<mydb-data의 정보 상세 확인>

root@host1:/var/lib/docker/volumes# docker volume inspect mydb-data
[
    {
        "CreatedAt": "2024-01-17T11:40:32+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mydb-data/_data",
        "Name": "mydb-data",
        "Options": null,
        "Scope": "local"
    }
]

 

<컨테이너 생성 및 확인>

  • -v mydb-data:/var/lib/mysql: 호스트 머신의 "mydb-data" 볼륨을 컨테이너 내의 "/var/lib/mysql" 경로에 마운트
  • -e MYSQL_DATABASE=hangaram: "hangaram"이라는 이름의 MySQL 데이터베이스를 생성
ubuntu@host1:~/Labs/ch06$ docker container run -d --name=mydb -e MYSQL_ROOT_PASSWORD=password -e
MYSQL_DATABASE=hangaram -v mydb-data:/var/lib/mysql mysql:5.7-debian
7ccc6e59c56fa1fc1aec4a25fbef4314f8bbfb272c68aac286ba8edab2afa2d9

 

<mydb 컨테이너 실행 및 볼륨 마운트 확인>

  • /dev/sdb2 47G 3.5G 43G 8% /var/lib/mysql 항목으로 마운트 확인 가능
ubuntu@host1:~/Labs/ch06$ docker container exec -it mydb bash
root@7ccc6e59c56f:/# df -ha
Filesystem      Size  Used Avail Use% Mounted on
overlay          47G  3.5G   43G   8% /
proc               0     0     0    - /proc
tmpfs            64M     0   64M   0% /dev
devpts             0     0     0    - /dev/pts
sysfs              0     0     0    - /sys
cgroup             0     0     0    - /sys/fs/cgroup
mqueue             0     0     0    - /dev/mqueue
shm              64M     0   64M   0% /dev/shm
/dev/sdb2        47G  3.5G   43G   8% /etc/resolv.conf
/dev/sdb2        47G  3.5G   43G   8% /etc/hostname
/dev/sdb2        47G  3.5G   43G   8% /etc/hosts
**/dev/sdb2        47G  3.5G   43G   8% /var/lib/mysql**
proc               0     0     0    - /proc/bus
proc               0     0     0    - /proc/fs
proc               0     0     0    - /proc/irq
proc               0     0     0    - /proc/sys
proc               0     0     0    - /proc/sysrq-trigger
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs            64M     0   64M   0% /proc/kcore
tmpfs            64M     0   64M   0% /proc/keys
tmpfs            64M     0   64M   0% /proc/timer_list
tmpfs           2.0G     0  2.0G   0% /proc/scsi
tmpfs           2.0G     0  2.0G   0% /sys/firmware

 

<MYSQL로 hangaram 데이터베이스 생성 확인>

root@7ccc6e59c56f:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 4
Server version: 5.7.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, 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.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| **hangaram**           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

 

<컨테이너 재 구동 후 진입>

ubuntu@host1:~/Labs/ch06$ docker container run -d --name=mydb -e MYSQL_ROOT_PASSWORD=password -v mydb-data:/var/lib/mysql mysql:5.7-debian
da61b58cd4a8a3bd768ef4fe7f0777d5c49853dcd7242560a539e6ef00190294
ubuntu@host1:~/Labs/ch06$ docker container exec -t mydb bash
>> root@da61b58cd4a8:/# df -ha 과 show databases; 명령 사용시,
마운트 확인 가능 및 전에 생성한 데이터베이스 hangaram이 있는 것을 확인할 수 있음

>> 데이터의 영속성(데이터 보존) 확인 가능

 

<데이터의 영속성 확인2>

<컨테이너 생성 및 가동>

ubuntu@host1:~/Labs/ch06$ docker pull mysql:8.0.35-debian
8.0.35-debian: Pulling from library/mysql
0e0969fcaa82: Pull complete 
2509e99ccd90: Pull complete 
18449158c192: Pull complete 
4838008371a5: Pull complete 
555a500de9e6: Pull complete 
7788a0cfe39d: Pull complete 
4d82554e9050: Pull complete 
473684d155cf: Pull complete 
a2eabb9f2adb: Pull complete 
80382a09301f: Pull complete 
b929280da2d3: Pull complete 
241a1df60142: Pull complete 
Digest: sha256:1d9f393d115c41a382a1f7d8dad5c073f0809739525ce501c7bbe45b0d2740c4
Status: Downloaded newer image for mysql:8.0.35-debian
docker.io/library/mysql:8.0.35-debian
ubuntu@host1:~/Labs/ch06$ docker container run -d --name=mydb -e MYSQL_ROOT_PASSWORD=password -v mydb-data:/var/lib/mysql mysql:8.0.35-debian
0184f485b0e5880095046472f622d4bd1d2e6d1964648bbfccb2092f3ce92b64

 

<컨테이너 생성 확인>

ubuntu@host1:~/Labs/ch06$ docker container ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED         STATUS                 PORTS                                       NAMES
**0184f485b0e5   mysql:8.0.35-debian               "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds           3306/tcp, 33060/tcp                         mydb**
69db6bdc9620   nginx:1.25.0-alpine               "/docker-entrypoint.…"   3 hours ago     Up 3 hours             80/tcp                                      mginx_mem_1g
fa7bcf3a232b   nginx                             "/docker-entrypoint.…"   3 hours ago     Up 3 hours             80/tcp                                      nginx_mem_1g
20fa045c6714   gcr.io/cadvisor/cadvisor:latest   "/usr/bin/cadvisor -…"   20 hours ago    Up 3 hours (healthy)   0.0.0.0:9559->8080/tcp, :::9559->8080/tcp   cadvisor

 

<hangaram 데이터 베이스 보존 확인 가능>

ubuntu@host1:~/Labs/ch06$ docker container exec -it mydb bash
root@0184f485b0e5:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 11
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, 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.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| **hangaram**           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)