Docker - Volume

2024. 8. 10. 18:30ใ†CICD PipeLine

Docker - Volume

 

 

์‚ฌ๋‚ด ํ”„๋กœ์ ํŠธ์— ELK์Šคํƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Docker-compose๋ฅผ ์ ์šฉํ•ด๋ณด๊ณ ์ž Docker์˜ ๊ธฐ๋ณธ์ด์ž ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ Volume์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธ€. [- Docker.docs ์ฐธ๊ณ ]

 

 

Volume์€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์˜๊ตฌ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ์„ ํ˜ธ๋˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค. bind mount๋Š” ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์œ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์— ์˜์กดํ•˜๋Š” ๋ฐ˜๋ฉด์— volume์€ ์ „์ ์œผ๋กœ Docker์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค. Bind mount๋Š” OS์™€ ์ง์ ‘ ์—ฐ๊ฒฐ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— Docker API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ๋ฐฑ์—…์ด ๋” ์–ด๋ ต๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— volume ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

volume์€ ํ˜ธ์ŠคํŠธ OS ๋‚ด์˜ ํŠน์ •๋„์ปค๊ฒฝ๋กœ์— ์œ„์น˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๋‹ค. 

 

 

๋งŒ์•ฝ ๋น„์˜๊ตฌ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 'tmpfs mount'๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ writable layer์— ์“ฐ๋Š” ๊ฒƒ์„ ํ”ผํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ณผ๋ฅจ ์ƒ์„ฑ/๊ด€๋ฆฌ

 

๋ณผ๋ฅจ ์ƒ์„ฑ: docker volume create {๋ณผ๋ฅจ์ด๋ฆ„}

 

๋ณผ๋ฅจ์ƒ์„ฑํ›„ ํ™•์ธ๋œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด docker volume inspect {๋ณผ๋ฅจ์ด๋ฆ„}

 

 

 


์ด๋ฒˆ์—๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ŠคํŠธ์— ์ƒ์„ฑ๋œ ๋ณผ๋ฅจ๊ณผ ์—ฐ๊ฒฐํ•ด๋ณด์ž. 

 

๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ณผ๋ฅจ์ด ๋ช…์‹œ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋„์ปค๋Š” ๋ณผ๋ฅจ์„ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค. my-vol์„ ์ปจํ…Œ์ด๋„ˆ์˜ /app๊ฒฝ๋กœ์— mount๋ฅผ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

docker run -d \
 --name devtest \
 --mount source=myvol2,target=/app \
 ngnix:latest

 

 

๋‚ด๋ถ€ ๋™์ž‘๋˜๋Š” ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

์ปจํ…Œ์ด๋„ˆ inspect๋ฅผ ํ†ตํ•ด ์„ธ๋ถ€์ ์ธ ์„ค์ •์„ ๋ณด๋ฉด Mount๋œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ณผ๋ฅจ์„ ์ง€์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ -> ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ -> ๋ณผ๋ฅจ ์‚ญ์ œ์˜ ์ ˆ์ฐจ๋ฅผ ๋ฐŸ์•„์•ผ ํ•œ๋‹ค.

 

docker container stop devtest

docker container rm devtest

docker volume rm myvol2

 

 

 

 

docker-compose volume ์‚ฌ์šฉ

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:

 

Docker๋Š” myapp์ด๋ผ๋Š” ๋ณผ๋ฅจ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†๋‹ค๋ฉด ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•œ๋’ค์˜ ์ปจํ…Œ์ด๋„ˆ์˜ /home/node/app ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธ ์‹œํ‚จ๋‹ค. 

 

docker-compose.yaml ์™ธ๋ถ€์— volume์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด external์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true

 

 

 

Volume ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰.

 

์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณผ๋ฅจ์„ ์ •์˜ํ•  ๋•Œ ๊ฐ ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๊ฐ์ž ์†Œ์œ ์˜ ๋กœ์ปฌ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ local volume ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡๊ฐœ์˜ ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„๋“ค์€ ๊ณต์œ  ์ €์žฅ์†Œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

 

 

๋จผ์ € nginx 4๊ฐœ๋ฅผ ๋„์šฐ๊ณ  ๋กœ์ปฌ ๋ณผ๋ฅจ ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

 

๋งŒ์•ฝ swarm manager๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์—๋Ÿฌ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด docker swarm init์„ ํ†ตํ•ด ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ manager๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. (ํ•ด๋‹น ๊ฐœ๋…์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ๊ฐœ๋…์ด๋‹ค.)

 

 

docker service ps devtest-service

 

 

 

์ปดํ“จํ„ฐ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ 

 

๊ฒฐํ•จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ๊ฐ™์€ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” replica๋ฅผ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

 

 

๋ณดํ†ต AWS S3๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ NFS ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ์ผํ•˜๋Š”๋ฐ, Volume Driver๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ์ €์žฅ ์‹œ์Šคํ…œ์„ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. NFS ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ๋ณ€๊ฒฝ์—†์ด ์ €์žฅ ์‹œ์Šคํ…œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

Volume Driver ์‚ฌ์šฉ

 

vieux/sshfs ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

๋จผ์ € docker host์—์„œ vieux/sshfs ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•œ๋‹ค.

docker plugin install --grant-all-permissions vieux/sshfs

 

๋‹ค์Œ volume์„ ์ƒ์„ฑํ•  ๋•Œ ssh๋ฅผ ์‚ฌ์šฉํ•˜๋Š” driver๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งˆ์šดํŠธ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค. 

 

docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ์•ž์—์„œ ์ƒ์„ฑํ•œ ์™ธ๋ถ€ ์›๊ฒฉ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งˆ์šดํŠธํ•œ๋‹ค.

docker run -d \
  --name sshfs-container \
  --mount type=volume,volume-driver=vieux/sshfs,src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

 

 

 

 

NFS Volume์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

NFS ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋Š” 10.0.0.10์„ ์‚ฌ์šฉํ•˜๊ณ , /var/docker-nfs๋ฅผ ์™ธ๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์„ค์ •ํ•ด๋†“์€ ์ƒํƒœ๋กœ ๊ฐ€์ •ํ•ด๋ณด์ž.

 

docker service create -d \
  --name nfs-service \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
  nginx:latest

 

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด NFS์‹œ์Šคํ…œ์— ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งˆ์šดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฑ์—…, ๋ณต์›, ๋ณผ๋ฅจ ์ด๋™๊ณผ ๊ด€๋ จ๋œ ๊ธ€์€ ๋‹ค์Œ url์„ ์ฐธ๊ณ ํ•˜์ž. 

https://docs.docker.com/storage/volumes/#create-and-manage-volumes

 

Volumes

Learn how to create, manage, and use volumes instead of bind mounts for persisting data generated and used by Docker.

docs.docker.com