
Docker ์ปจํ ์ด๋(container)์ ์ฐ์ฌ์ง ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์ญ์ ๋ ๋ ํจ๊ป ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. Docker์์ ๋์๊ฐ๋ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅ์ ํด์ผํ๋๋ฐ์. ๋ฟ๋ง ์๋๋ผ ๋ง์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ Docker ์ปจํ ์ด๋๊ฐ ํ๋์ ์ ์ฅ ๊ณต๊ฐ์ ๊ณต์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์จ์ผํฉ๋๋ค.
์ด๋ ๊ฒ Docker ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ๊ด๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํ ์ ์๋๋ก Docker๋ ๋๊ฐ์ง ์ต์ ์ ์ ๊ณตํ๋๋ฐ์. ์ฒซ๋ฒ์งธ๋ Docker ๋ณผ๋ฅจ(volume), ๋๋ฒ์งธ๋ ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)์ ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Docker ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ ์ด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.

1. ๋ณผ๋ฅจ ์์ฑ ๋ฐ ์กฐํ
๋จผ์ , Docker์์ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ธ ๋ณผ๋ฅจ(volume)์ ๋ํด์ ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
docker volume create ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ๋ณผ๋ฅจ์ ํ๋ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<bash />$ docker volume create our-vol our-vol
๊ทธ ๋ค์, docker volume ls ์ปค๋งจ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ง ์์ฑํ ๋ณผ๋ฅจ์ ํ์ธํ ์ ์์ต๋๋ค.
<bash />
$ docker volume ls
DRIVER VOLUME NAME
local our-vol
docker volume inspect ์ปค๋งจ๋๋ฅผ ํตํด ํด๋น ๋ณผ๋ฅจ์ ์ข ๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํด๋ณผ ์ ์์ต๋๋ค.
<bash />
$ docker volume inspect our-vol
[
{
"CreatedAt": "2020-05-09T17:03:46Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/our-vol/_data",
"Name": "our-vol",
"Options": {},
"Scope": "local"
}
]
Mountpoint ํญ๋ชฉ์ ๋ณด๋ฉด ํด๋น ๋ณผ๋ฅจ์ด ์ปดํจํฐ์ ์ด๋ ๊ฒฝ๋ก์ ์์ฑ๋์๋์ง๋ฅผ ์ ์ ์์ต๋๋ค.
2. ๋ณผ๋ฅจ์ ์ปจํ ์ด๋์ ๋ง์ดํธํ๊ธฐ
์ปจํ ์ด๋๊ฐ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ณผ๋ฅจ์ ์ปจํ ์ด๋์ ๋ง์ดํธ(mount)ํด์ค์ผ ํฉ๋๋ค. docker run ์ปค๋งจ๋๋ก ์ปจํ ์ด๋๋ฅผ ์คํํ ๋ -v ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ์. ์ฝ๋ก (:)์ ๊ตฌ๋ถ์๋ก ํด์ ์์๋ ๋ง์ดํธํ ๋ณผ๋ฅจ๋ช ๋ค์๋ ์ปจํ ์ด๋ ๋ด์ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, our-vol ๋ณผ๋ฅจ์ one ์ปจํ ์ด๋์ /app ๊ฒฝ๋ก์ ๋ง์ดํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
<bash />$ docker run -v our-vol:/app --name one busybox touch /app/test.txt
touch /app/test.txt ์ปค๋งจ๋๋ฅผ ์คํํ์๊ธฐ ๋๋ฌธ์, test.txt ํ์ผ์ด our-vol ๋ณผ๋ฅจ์ ๊ฒฝ๋ก์๋ ๋จ์์์ ๊ฒ์ ๋๋ค.
<bash />$ ls /var/lib/docker/volumes/our-vol/_data test.txt
docker inspect ์ปค๋งจ๋๋ก ์ปจํ ์ด๋์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํด๋ณด๋ฉด our-vol ๋ณผ๋ฅจ์ด volume ํ์ ์ผ๋ก ๋ง์ดํธ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
<bash />
$ docker inspect one
(...์๋ต...)
"Mounts": [
{
"Type": "volume",
"Name": "our-vol",
"Source": "/var/lib/docker/volumes/our-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
(...์๋ต...)
3. ๋ณผ๋ฅจ์ ๋ค๋ฅธ ์ปจํ ์ด๋์๋ ๋ง์ดํธํ๊ธฐ
์ด ๋ฒ์๋ ๊ฐ์ our-vol ๋ณผ๋ฅจ์ two ์ปจํ ์ด๋์ /app ๊ฒฝ๋ก์ ๋ง์ดํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค. ls /app ์ปค๋งจ๋๋ฅผ ์คํํด๋ณด๋, one ์ปจํ ์ด๋๊ฐ ๋ณผ๋ฅจ์ ์์ฑํด๋์ ํ์ผ์ด ๊ทธ๋๋ก ๋ณด์ด๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
<bash />$ docker run -v our-vol:/app --name two busybox ls /app test.txt
์ด๋ ๊ฒ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๊ฐ ํ๋์ ๋ณผ๋ฅจ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ๋ค์ ๋งํด, ์ด๋ค ๋ณผ๋ฅจ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๊ณ , ์ฌ๋ฌ ์ปจํ ์ด๋์ ๋ง์ดํธ๋ง ํด์ฃผ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ปจํ ์ด๋์์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
4. ๋ณผ๋ฅจ ์ญ์
๋ง์ง๋ง์ผ๋ก docker volume rm ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ our-vol ๋ณผ๋ฅจ์ ์ ๊ฑฐํด๋ณด๊ฒ ์ต๋๋ค.
<bash />
$ docker volume rm our-vol
Error response from daemon: remove our-vol: volume is in use - [f73130c9dad14644ac46b89fe4018e561a7bcbfa4118d637949642d0d5d742e4, 666dda54f6be8ca852f3150b9741a9cab5a4659fa2e83fe6ca339550072c861ex]
์์ ๊ฐ์ด ์ ๊ฑฐํ๋ ค๋ ๋ณผ๋ฅจ์ด ๋ง์ดํธ๋์ด ์๋ ์ปจํ ์ด๋๊ฐ ์์ ๋๋ ํด๋น ๋ณผ๋ฅจ์ด ์ ๊ฑฐ๊ฐ ๋์ง๊ฐ ์์ต๋๋ค.
๊ทธ๋ด ๋๋ ํด๋น ๋ณผ๋ฅจ์ด ๋ง์ดํธ๋์ด ์๋ ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ๋จผ์ ์ญ์ ํ๊ณ , ๋ณผ๋ฅจ์ ์ญ์ ํด์ผ ํฉ๋๋ค.
<bash />$ docker rm -f one two one two $ docker volume rm our-vol our-vol
5. ๋ณผ๋ฅจ ์ฒญ์
docker volume prune ์ปค๋งจ๋๋ฅผ ์ด์ฉํด์ ๋ง์ดํธ๋์ด ์์ง ์์ ๋ชจ๋ ๋ณผ๋ฅจ์ ํ๋ฒ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
<bash />
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
6. ๋ฐ์ธ๋ ๋ง์ดํธ
Docker ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)๋ผ๋ ๊ฒ๋ ์์ต๋๋ค. ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์คํธ ํ์ผ ์์คํ ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋๋ก ๋ฐ๋ก ๋ง์ดํธํ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ docker run ์ปค๋งจ๋๋ฅผ ์คํํ ๋, -v ์ต์ ์ ์ฝ๋ก (:) ์ ๋ถ๋ถ์ ๋ง์ดํธ๋ช ๋์ ์ ํธ์คํธ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ฌ ๊ฒฝ๋ก์ test.txt ํ์ผ์ ์์ฑํ๊ณ , ํด๋น ํธ์คํธ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋์ /app ๊ฒฝ๋ก์ ๋ง์ดํธํด๋ณด๊ฒ ์ต๋๋ค. ์ปจํ ์ด๋์ ํฐ๋ฏธ๋์ ๋ถ์ฌ์ ls /app ์ปค๋งจ๋๋ฅผ ์คํํด๋ณด๋ฉด test.txt ํ์ผ์ด ์ปจํ ์ด๋์ /app ๊ฒฝ๋ก์๋ ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
<bash />
$ touch test.txt
$ docker run -v `pwd`:/app -it --name one busybox /bin/sh
/ # ls /app
test.txt
๋ฐ๋๋ก ์ปจํ ์ด๋์ /app ๊ฒฝ๋ก ์์์ test2.txt ํ์ผ์ ์คํํด๋ณด๋ฉด ํธ์คํธ์ ํ์ฌ ๊ฒฝ๋ก์๋ ํด๋น ํ์ผ์ด ๋ณด์ด๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
<bash />
/ # touch /app/test2.txt
/ # exit
[node1] (local) root@192.168.0.18 ~
$ ls
test.txt test2.txt
docker inspect ์ปค๋งจ๋๋ก ํด๋น ์ปจํ ์ด๋์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํด๋ณด๋ฉด ํ์ฌ ๊ฒฝ๋ก(/root)๊ฐ bind ํ์ ์ผ๋ก ๋ง์ดํธ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
<bash />
$ docker inspect one
(...์๋ต...)
"Mounts": [
{
"Type": "bind",
"Source": "/root",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
(...์๋ต...)
6.0.1.
6.1. * ๋ฐ์ธ๋ ๋ง์ดํธ์ Permission denied ์๋ฌ ๋ฐ์์(+์ถ๊ฐ)
- ํ์ : docker run --volume='root_dir:docker_dir' docker_image ์ดํ docker shell์ ์ ๊ทผํ์ฌ ls ์ํ ์ 'ls: cannot open directory '.': Permission denied' ์ถ๋ ฅ
- ์์ธ : docker ๋ด๋ถ์์ root directory์ ์ ๊ทผํ ๊ถํ์ด ์์
- ํด๊ฒฐ : ์๋น์๋ --privileged=true ์ต์ ์ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๋์๋ค๊ณ ๋ ํ์ง๋ง, ๋ณด์ ๋ฌธ์ ๊ฐ ์์ ์ ์๋ค๊ณ ํ์ฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ชจ์ํด์ผํ์ต๋๋ค.
์ฐพ์๋ณธ ๊ฒฐ๊ณผ, docker run์ ์ํํ ๋, --volume="root_dir:docker_dir:z" ์ฒ๋ผ z๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
<bash />
$ docker run -v $PWD:/var:z -it --name one nginx /bin/bash
7. ๋ณผ๋ฅจ vs ๋ฐ์ธ๋ ๋ง์ดํธ
๋ณผ๋ฅจ(volume)๊ณผ ๋ฐ์ธ๋ ๋ง์ดํธ(bind mount)์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ Docker๊ฐ ํด๋น ๋ง์ดํธ ํฌ์ธํธ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋๋ ์ ํด์ฃผ๋๋ ์ ๋๋ค. ๋ณผ๋ฅจ์ ์ฌ์ฉํ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ค์ค๋ก ๋ณผ๋ฅจ์ ์์ฑํ๊ฑฐ๋ ์ญ์ ํด์ผํ๋ ๋ถํธํจ์ด ์์ง๋ง, ํด๋น ๋ณผ๋ฅจ์ Docker ์์์ ์ด๋ฏธ์ง(image)๋ ์ปจํ ์ด๋(container), ๋คํธ์ํฌ(network)์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ๊ฐ ๋๋ ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋๋ถ๋ถ์ ์ํฉ์์๋ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋์ง๋ง ์ปจํ ์ด๋ํ๋ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ ๋๋ ๋ฐ์ธ๋ ๋ง์ดํธ๊ฐ ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
๋ก์ปฌ์์ ๊ฐ๋ฐ์ ํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ์ ํ๋ก์ ํธ ์ ์ฅ์๋ฅผ git clone ๋ฐ์๋๊ณ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ด์ฉํด์ ํด๋น ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ ์ด๋์ ํน์ ๊ฒฝ๋ก์ ๋ง์ดํธํด์ฃผ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ง๋ค ๋ณ๊ฒฝ ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋๋ก ์ปจํ ์ด๋๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ ํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ์๋ ๋ฐ์์ด ๋๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ ๊ฒ์ ๋๋ค.
๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ์ค์ ํ๋ก์ ํธ์์ ํ์ฉํ๋ ์์ ๋ ๊ด๋ จ ํฌ์คํ ๋ฅผ ์ฐธ๊ณ ๋ฐ๋ผ๊ฒ ์ต๋๋ค.
8. ๋ง์น๋ฉด์
์ด์์ผ๋ก Docker ๋ณผ๋ฅจ๊ณผ ๋ฐ์ธํธ ๋ง์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ดํด๋ณด์์ต๋๋ค. ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉํ๋ ๊ฐ ์ปค๋งจ๋์ ๋ํ ์ข ๋ ์์ธํ ๋ด์ฉ์ ์๋ Docekr CLI ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ๋ฐ๋ผ๊ฒ ์ต๋๋ค.
Docker ์ปจํ ์ด๋์ ๋ฐ์ดํฐ ์ ์ฅ (๋ณผ๋ฅจ/๋ฐ์ธ๋ ๋ง์ดํธ)
Engineering Blog by Dale Seo
www.daleseo.com
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] MySQL ๊ถํ (0) | 2021.10.22 |
---|---|
[Docker] Configuring MySQL NDB Cluster by using Docker and pointing with WSO2 APIM (0) | 2021.10.22 |
[Linux] sed ์๋ฌ (sed: -e expression #1, char 12: unknown option to `s`) (0) | 2021.10.19 |
[AWS] S3 ๋ฒํท ์ ์ฑ ์์ (0) | 2021.10.13 |
[Network]์์ด์ด ์คํฌ๋ฅผ ์ด์ฉํ SSL ํธ๋์์ดํฌ(handhake)์ ์ดํด (0) | 2021.10.12 |