docker volume

이상민·2023년 4월 13일
0

docker

목록 보기
2/19

volume 1

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 종료 후에도 파일이 존재하는 것을 확인

volume 2

$ 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에서 접근시에도 기존의 파일이 그대로 존재하는 것을 확인

docker volume

$ 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

db 위치 확인

$ 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"
    }
]

db 제거

$ docker rm -f $(docker ps -a -q)
$ docker volume rm db

먼저 container를 종료해야 함.

Read-Only volume

$ 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 파일을 만듦.

0개의 댓글