container 내부에 생성된 파일은 container 종료시 파일도 삭제됨
특정 application에 data를 쌓아야 하는 경우 등에서 volume 기능을 사용
$ vi host-volume.sh
#!/usr/bin/env sh
docker run \
-d \
-v $(pwd)/html:/usr/share/nginx/html \
-p 80:80 \
nginx
$ ls
docker-volume.sh host-volume.sh html readonly-volume.sh volume-container.sh
내부에 html 파일이 존재함
$ curl localhost
<h1>Hello fastcampus!!</h1>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93c326abd7a2 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp heuristic_maxwell
$ docker exec -it 93 bash
# cat > /usr/share/nginx/html/hello
hello world!
^C
html이 있는 directory에 hello란 파일을 생성
$ docker rm -f $(docker ps -a -q)
$ cat html/hello
hello world!
container 종료 후에도 파일이 존재하는 것을 확인
$ cat volume-container.sh
#!/usr/bin/env sh
docker run \
-d \
-it \
-v $(pwd)/html:/usr/share/nginx/html \
--name web-volume \
ubuntu:focal
docker run \
-d \
--name fastcampus-nginx \
--volumes-from web-volume \
-p 80:80 \
nginx
docker run \
-d \
--name fastcampus-nginx2 \
--volumes-from web-volume \
-p 8080:80 \
nginx
$ ./volume-container.sh
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89495732b4c2 nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp fastcampus-nginx2
f3a674adb9f1 nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp fastcampus-nginx
c7709e5acc7b ubuntu:focal "/bin/bash" 8 seconds ago Up 6 seconds
$ curl localhost:80
<h1>Hello fastcampus!!</h1>
$ curl localhost:8080
<h1>Hello fastcampus!!</h1>
volume-container.sh에서 binding한 포트로 값이 나오는 것 확인
$ docker exec -it 8949 bash
# ls /usr/share/nginx/html
hello index.html
새로운 container에서 접근시에도 기존의 파일이 그대로 존재하는 것을 확인
$ cat docker-volume.sh
#!/usr/bin/env sh
docker volume create --name db
docker volume ls
docker run \
-d \
--name fastcampus-mysql \
-e MYSQL_DATABASE=fastcampus \
-e MYSQL_ROOT_PASSWORD=fastcampus \
-v db:/var/lib/mysql \
-p 3306:3306 \
mysql:5.7
$ ./docker-volume.sh
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3372d0e4a087 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp fastcampus-mysql
$ docker volume inspect db
[
{
"CreatedAt": "2023-04-13T03:09:16Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/db/_data",
"Name": "db",
"Options": null,
"Scope": "local"
}
]
$ docker rm -f $(docker ps -a -q)
$ docker volume rm db
먼저 container를 종료해야 함.
$ cat readonly-volume.sh
#!/usr/bin/env sh
docker run \
-d \
-v $(pwd)/html:/usr/share/nginx/html:ro \
-p 80:80 \
--name ro-nginx \
nginx
docker exec ro-nginx touch /usr/share/nginx/html/hello
touch: 해당 directory에 bin 파일을 만듦.