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