[따배도] Docker Container Storage

조앵·2024년 5월 13일

Docker

목록 보기
11/11
post-thumbnail

Docker Container Storage -이론

1. 컨테이너 볼륨

컨테이너 이미지는 readonly
컨테이너에 추가되는 데이터들은 별도의 RW 레이어에 저장
고객 데이터, DB에 있는 데이터는 영구적으로 저장해야한다.

2. 데이버 보존 방법

컨테이너가 만들어주는 데이터를 디스크에 보존하도록 해야한다.

# 볼륨 마운트해서 저장할 수 있다.
docker run -d --name db \
-v /dbdata:/var/lib/mysql \
-e MYSQL_ALLOW_EMPTY_PASSWORD=pass \
mysql:latest

컨테이너를 삭제해도 host이 /dbdata 안에 남아있다.

volume 옵션 사용

-v <host path>:<container mount path>
-v <host path>:<container mount path>:<read write mode>
-v <container mount path>
docker run -d -v /dbdate:/var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest
docekr run -d -v /webdata:/var/www/html:ro httpd:latest
docker run -d -v /var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest

3. 컨테이너끼리 데이터 공유

docker run -v /webdate:/webdata -d --name df youngbinjo/:df:latest

# /webdata/index.html을 가져다가 webserver에 service한다.
docker run -d -v /webdata:/usr/share/nginx/html:ro -d ubuntu:latest

Docker Container Storage -실습

1. mysql DB data 영구 보존하기


docker run -d -v /dbdata:/var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest

CONTAINER:db [ /#mysql -> mysqld(/var/lib/mysql/dbdata ]

totoro@docker-ubuntu:~$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=totoro mysql:latest
1a0cb5bc79c191d26d4bdc1973b566ed6884b16f76f50e3c19fd9f5a5164c605

totoro@docker-ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                 NAMES
1a0cb5bc79c1   mysql:latest   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   3306/tcp, 33060/tcp   db

# exec 명령어로 db의 /bin/bash에 접속
totoro@docker-ubuntu:~$ docker exec -it db /bin/bash

# 아까 설정해준 totoro라는 패스워드와 사용자를 넣고 접속
bash-5.1# mysql -u root -ptotoro
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL

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

# show databases로 db안 확인
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

mysql> create database totoro;
Query OK, 1 row affected (0.03 sec)

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

dbdata 확인하기

root@docker-ubuntu:~# cd /dbdata/
root@docker-ubuntu:/dbdata# ls
'#ib_16384_0.dblwr'  '#innodb_temp'   binlog.000002   ca.pem            ib_buffer_pool   mysql        mysql_upgrade_history   public_key.pem    sys        undo_002
'#ib_16384_1.dblwr'   auto.cnf        binlog.index    client-cert.pem   ibdata1          mysql.ibd    performance_schema      server-cert.pem   totoro
'#innodb_redo'        binlog.000001   ca-key.pem      client-key.pem    ibtmp1           mysql.sock   private_key.pem         server-key.pem    undo_001

db 컨테이너 삭제 후 dbdata 확인

root@docker-ubuntu:/dbdata# docker rm -f db
db

root@docker-ubuntu:/dbdata# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 삭제를 해도 totoro는 dbdata안에 남아있다.
root@docker-ubuntu:/dbdata# ls /dbdata/
'#ib_16384_0.dblwr'  '#innodb_temp'   binlog.000002   ca.pem            ib_buffer_pool   mysql        mysql_upgrade_history   public_key.pem    sys        undo_002
'#ib_16384_1.dblwr'   auto.cnf        binlog.index    client-cert.pem   ibdata1          mysql.ibd    performance_schema      server-cert.pem   totoro
'#innodb_redo'        binlog.000001   ca-key.pem      client-key.pem    ibtmp1           mysql.sock   private_key.pem         server-key.pem    undo_001

docker run -d -v /var/lib/mysql -e MYSQL..PASSWORD=pass mysql:latest
# 컨테이너 디렉터리만 명시했을때는 docker volume에 /var/lib/docker/volume/UUID/_data 영구적 볼륨 마운트
totoro@docker-ubuntu:~$ docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=totoro mysql:latest
2bcab272caf99c8baf5f027733a500e5e92a3b123a477e6e56b5a3fcec44435a
totoro@docker-ubuntu:~$ docker inspect db
        "Mounts": [
            {
                "Type": "volume",
                "Name": "308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729",
                "Source": "/var/lib/docker/volumes/308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""

영구적 볼륨 마운트 확인

root@docker-ubuntu:~# cd /var/lib/docker/volumes/308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729/_data/
root@docker-ubuntu:/var/lib/docker/volumes/308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729/_data# ls
'#ib_16384_0.dblwr'  '#innodb_temp'   binlog.000002   ca.pem            ib_buffer_pool   mysql        mysql_upgrade_history   public_key.pem    sys
'#ib_16384_1.dblwr'   auto.cnf        binlog.index    client-cert.pem   ibdata1          mysql.ibd    performance_schema      server-cert.pem   undo_001
'#innodb_redo'        binlog.000001   ca-key.pem      client-key.pem    ibtmp1           mysql.sock   private_key.pem         server-key.pem    undo_002

불필요한 볼륨 마운트 삭제

root@docker-ubuntu:~# docker volume ls
DRIVER    VOLUME NAME
local     308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729
local     fcc7eabd6ca485bd38f85759a5223caf4d3ca567a18ede9ef726bc301abdc783

root@docker-ubuntu:~# docker volume rm 308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729 
308c19abc58b9824f7eca44f2ba8f61340e602d23dfa93aba32dc84814040729

root@docker-ubuntu:~# docker volume rm fcc7eabd6ca485bd38f85759a5223caf4d3ca567a18ede9ef726bc301abdc783 
fcc7eabd6ca485bd38f85759a5223caf4d3ca567a18ede9ef726bc301abdc783

root@docker-ubuntu:~# docker volume ls
DRIVER    VOLUME NAME

2. 웹데이터 readonly 서비스로 지원하기

docker run -d -v /webdata:/var/share/nginx/html:ro -p 80:80 nginx:latest
totoro@docker-ubuntu:~/webdata$ echo "<h1>totoro velog.io<h1>" > index.html
totoro@docker-ubuntu:~/webdata$ cat index.html
<h1>totoro velog.io<h1>
totoro@docker-ubuntu:~/webdata$ cd
totoro@docker-ubuntu:~$ docker run -d --name web -p 80:80 -v /webdata:/usr/share/nginx/html:ro nginx:1.14
Unable to find image 'nginx:1.14' locally
1.14: Pulling from library/nginx
27833a3ba0a5: Pull complete 
0f23e58bd0b7: Pull complete 
8ca774778e85: Pull complete 
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14
0931aef1e1094e1bd9971fc7a471cb9f3832f1a7b5358fdb08a86fc02956be84
totoro@docker-ubuntu:~$ docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS                               NAMES
0931aef1e109   nginx:1.14   "nginx -g 'daemon of…"   4 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

3. 컨테이너간 데이터 공유하기

totoro@docker-ubuntu:~/lab$ cat df.sh 
#!/bin/bash 
mkdir -p /webdata
while true
do
	df -h / > /webdata/index.html
	sleep 10
done

totoro@docker-ubuntu:~/lab$ vim dockerfile
totoro@docker-ubuntu:~/lab$ cat dockerfile 
FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]
totoro@docker-ubuntu:~/lab$ docker build -t youngbinjo/df:latest .
[+] Building 2.9s (9/9) FINISHED                                                                                                                         docker:default
 => [internal] load build definition from dockerfile                                                                                                               0.0s
 => => transferring dockerfile: 126B                                                                                                                               0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                    1.6s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                                    0.0s
 => [internal] load build context                                                                                                                                  0.0s
 => => transferring context: 123B                                                                                                                                  0.0s
 => CACHED [1/3] FROM docker.io/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                                       0.0s
 => [2/3] ADD df.sh /bin/df.sh                                                                                                                                     0.2s
 => [3/3] RUN chmod +x /bin/df.sh                                                                                                                                  0.7s
 => exporting to image                                                                                                                                             0.2s
 => => exporting layers                                                                                                                                            0.1s
 => => writing image sha256:9ce521915fbff7065d7d55f3d3cd04c53e0330ab22b3d87973936a79707f960b                                                                       0.0s
 => => naming to docker.io/youngbinjo/df:latest                                                                                                                    0.0s
totoro@docker-ubuntu:~/lab$ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
youngbinjo/df              latest    9ce521915fbf   6 seconds ago   63.2MB

totoro@docker-ubuntu:~/lab$ docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
totoro@docker-ubuntu:~/lab$ docker run -d -v /webdata:/webdata --name df youngbinjo/df:latest
955375cadb4b3569d64c2e17b41dc7d84e7bbbbf26496967f38894b970f6222c
totoro@docker-ubuntu:~/lab$ cat /webdata/index.html 
Filesystem      Size  Used Avail Use% Mounted on
overlay          20G   13G  5.2G  72% /

totoro@docker-ubuntu:~/lab$ docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:1.14
53ebec9a01618263ee422a828b28a25bbd6ba815615d03567af29187dbffca04
totoro@docker-ubuntu:~/lab$ docker ps -a
CONTAINER ID   IMAGE                  COMMAND                   CREATED         STATUS         PORTS                               NAMES
53ebec9a0161   nginx:1.14             "nginx -g 'daemon of…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   web
955375cadb4b   youngbinjo/df:latest   "/bin/df.sh"              9 minutes ago   Up 9 minutes
totoro@docker-ubuntu:~/lab$ curl 127.0.0.1
Filesystem      Size  Used Avail Use% Mounted on
overlay          20G   13G  5.2G  72% /
profile
Viva La Vida

0개의 댓글