컨테이너 이미지는 readonly
컨테이너에 추가되는 데이터들은 별도의 RW 레이어에 저장
고객 데이터, DB에 있는 데이터는 영구적으로 저장해야한다.
컨테이너가 만들어주는 데이터를 디스크에 보존하도록 해야한다.

# 볼륨 마운트해서 저장할 수 있다.
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
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 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

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

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% /