0. ์ปจํ
์ด๋
๋ฌด์ธ๊ฐ์ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ค. ์ด๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ฒฉ๋ฆฌ!
์ปจํ
์ด๋ ๋ด๋ถ์ ๋์์ ์ปจํ
์ด๋๊ฐ ์ธ์์ ์ ๋ถ๋ผ๊ณ ์๊ฐํ๋ค. (๊ฒฉ๋ฆฌ๋์ด์์ผ๋๊น)
์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
์ปจํ
์ด๋ ๋ด๋ถ์ ๋ฌด์์ด ์๋ ์ง ๊ฐ์ ์ปจํ
์ด๋ ๋จ์๋ก ์ฌ๊ณ ํ ์ ์๊ฒ ๋๋ค.
์ปจํ
์ด๋๋ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๊ณ ์ด์๋๊ณ ์ ๊ฑฐ๋๊ธฐ๊น์ง์ ์์ ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ์ด๋ ์ค์ํ ๊ฒ์ ๊ฒฉ๋ฆฌ์ด๋ค.
์ปจํ
์ด๋์ ํ๋ก์ธ์ค๋ ์ ํ๋ ์์ ๋ด์์ ์ ํ๋ ์ฌ์ฉ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
1. ์ปจํ
์ด๋๋ฅผ ํ์ตํด์ผํ๋ ์ด์
์ดํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋๋ ํ๊ฒฝ์ ์๋ฒ์ ์ง์ ์ค์นํ์ฌ ๊ตฌ์ฑํ ๊ฒฝ์ฐ, snowflake server ์ด์ ์ ์ง๋ฉดํ๋ค.
์๋น์ค๋ ์ ์ฐจ ํ์ฅ๋๊ณ , ๊ธฐ์กด์ ์ฌ์ฉํ๋ ์๋ฒ์ ์๋ก ๊ตฌ์ถํ ์๋ฒ ๊ฐ์ ์ค์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ , ๊ด๋ฆฌ์์ ์ธ์ ์์์๋ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค.
๊ธฐ์กด์๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์๋ํ ๋ฐฉ์, kickstart ๋ฑ์ ๊ฑฐ์ณ์ OS ๊ฐ์ํ ๋ฐฉ์๊น์ง ๋ค์ํ ํํ๋ก ์๋ฒ๋ฅผ ๊ด๋ฆฌํด์๋ค.
1-1. ๊ธฐ์กด์ OS ๊ฐ์ํ ๋ฐฉ์
๊ธฐ์กด์ OS ๊ฐ์ํ ๊ธฐ์ ์ ํ์ดํผ๋ฐ์ด์ ๊ธฐ์ ์ ์ด์ฉํด์ ์ฌ๋ฌ๊ฐ์ ์ด์์ฒด์ ๋ฅผ ํ๋์ ํธ์คํธ์์ ์์ฑํด ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
ํ์ด๋ฒ๋ฐ์ด์ : ํธ์คํธ ์ปดํจํฐ์์ ๋ค์์ ์ด์์ฒด์ ๋ฅผ ๋์์ ์คํํ๊ธฐ ์ํ ๋
ผ๋ฆฌ์ ํ๋ซํผ
๊ฐ์ข
์์คํ
์์์ ๊ฐ์ํํ๊ณ , ๋
๋ฆฝ๋ ๊ณต๊ฐ์ ์์ฑํ๋ ์์
์ ๋ฐ๋์ ํ์ดํผ๋ฐ์ด์ ๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ํธ์คํธ์ ๋นํด์ ์ฑ๋ฅ ์์ค์ด ๋ฐ์ํ๊ฒ ๋๋ค.
๊ฐ์๋จธ์ ์ guest OS ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ปค๋ ๋ฑ์ ์ ๋ถ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๊ฐ์๋จธ์ ์ ๋ฐฐํฌํ๊ธฐ ์ํ ์ด๋ฏธ์ง๋ก ๋ง๋ค์์ ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ง๊ฒ ๋์ด์ ์ด๋ฏธ์ง๋ฅผ ์ดํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ฐฐํฌํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์์๋ค.
1-2. ์ปจํ
์ด๋์ ๋ฑ์ฅ
๋จ์ํ ์ดํ๋ฆฌ์ผ์ด์
์ ๋์ฐ๊ณ ์ถ์๋ ๊ฒ ๋ฟ์ธ๋ฐ, OS ๊น์ง ๋์์ผํ๋ ๊ฒ์ ๋๋ฌด ๋ญ๋น์ด๋ค.
๊ฒฉ๋ฆฌ๋ CPU, memory, disk, network ๋ฅผ ๊ฐ์ง ๊ณต๊ฐ์ ๋ง๋ค๊ณ , ์ด ๊ณต๊ฐ์์ ํ๋ก์ธ์ค๋ฅผ ์คํํด์ ์ ์ ์๊ฒ ์๋น์ค ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ ๋ํ ๊ณ ๋ฏผ๋ถํฐ ์์
์ปจํ
์ด๋์ ํ์ํ ์ปค๋์ ํธ์คํธ์ ์ปค๋์ ๊ณต์ ํด์ ์ฌ์ฉํ๊ณ , ์ปจํ
์ด๋ ์์๋ ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๋๋ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์คํํ์ผ๋ง ์กด์ฌํ๋๋ก ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด, ์ด๋ฏธ์ง๋ก ๋ง๋ค์์ ๋, ์ด๋ฏธ์ง์ ์ฉ๋์ ๊ฐ์๋จธ์ ์ ๋นํด ํจ์ฌ ์ค์ด๋ค๊ฒ ๋๋ค.
์ปจํ
์ด๋์ ๋ด์ฉ์ ์์ ํด๋ ํธ์คํธ OS ์ ์ํฅ์ ์ ํ ๋ฏธ์น์ง ์๋๋ค.
์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ๊ฐ ํธํด์ง๋ค.
์ฌ๋ฌ ์ดํ๋ฆฌ์ผ์ด์
์ ๋
๋ฆฝ์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋์์ง๋ค.
2. ์ปจํ
์ด๋์ ํ๋ก์ธ์ค ์ถ์ํ
2-1. ๋์ปค ์ค์น
Copy $ sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $( lsb_release -cs ) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$( uname -s )-$( uname -m )" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2-2. ๋์ปค ๋ฐ๋ชฌ
์ฌ์ฉ์๊ฐ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด, docker.sock ์ ํตํด์ ๋์ปค ๋ฐ๋ชฌ์ API ๋ฅผ ํธ์ถํ๋ค.
๋์ปค ๋ฐ๋ชฌ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ docker events
๋ฅผ ํตํด์ ํ์ธ ๊ฐ๋ฅํ๋ค.
์ถ๊ฐ์ ์ผ๋ก, docker stats
์ docker system df
๋ช
๋ น์ด๋ฅผ ํตํด์ ๋์ปค๊ฐ ํ์ฌ host ์ ์์์ ์ผ๋ง๋ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
Copy ## docker ๋ช
๋ น์ด๊ฐ dockerd๋ผ๋ ๋์ปค ๋ฐ๋ชฌ๊ณผ docker.sock์ ์ฐธ์กฐํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
$ sudo lsof -c docker
dockerd 880 root txt REG 202,1 102066512 55737 /usr/bin/dockerd
dockerd 880 root 6u unix 0xffff953085804400 0t0 18324 /var/run/docker.sock type=STREAM
$ sudo docker run -it ubuntu:latest bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
3ff22d22a855: Pull complete
e7cb79d19722: Pull complete
323d0d660b6a: Pull complete
b7f616834fd0: Pull complete
Digest: sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d
Status: Downloaded newer image for ubuntu:latest
root@b7345bbb0ec1:/#
$ sudo docker events
2020-08-16T05:47:10.885807752Z image pull ubuntu:latest (name=ubuntu)
2020-08-16T05:47:11.247030355Z container create b7345bbb0ec1fae4b183c0fe1947a70a3045ba8d75f74876a812a37c40921707 (image=ubuntu:latest, name=awesome_ishizaka )
2020-08-16T05:47:11.249065810Z container attach b7345bbb0ec1fae4b183c0fe1947a70a3045ba8d75f74876a812a37c40921707 (image=ubuntu:latest, name=awesome_ishizaka )
2020-08-16T05:47:11.278151263Z network connect 6b6ce553a425c9392c5a65b8dcd2a57e1665289354b97f430758b745b1dc86a7 (container=b7345bbb0ec1fae4b183c0fe1947a70a3045ba8d75f74876a812a37c40921707, name=bridge, type=bridge )
2020-08-16T05:47:11.529841638Z container start b7345bbb0ec1fae4b183c0fe1947a70a3045ba8d75f74876a812a37c40921707 (image=ubuntu:latest, name=awesome_ishizaka )
2020-08-16T05:47:11.531931004Z container resize b7345bbb0ec1fae4b183c0fe1947a70a3045ba8d75f74876a812a37c40921707 (height=25, image=ubuntu:latest, name=awesome_ishizaka, width= 167 )
2-3. ๋์ปค ์ปจํ
์ด๋
๋์ปค ์ปจํ
์ด๋๋ ํธ์คํธ ์์คํ
์ ์ปค๋์ ๊ณต์ ํ๋ค.
Copy $ docker run -it ubuntu:latest bash
root@03d7ffae4c3c:/# uname -a
Linux 03d7ffae4c3c 5.3.0-1032-aws #34~18.04.2-Ubuntu SMP Fri Jul 24 10:06:28 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ docker run -it centos:latest bash
[root@6ec49524540c /]# uname -a
Linux 6ec49524540c 5.3.0-1032-aws #34~18.04.2-Ubuntu SMP Fri Jul 24 10:06:28 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# ๋งฅOS๋ ๋ฆฌ๋
์ค๊ฐ ์๋๋ฏ๋ก ๋ค์ดํฐ๋ธํ๊ฒ ๋์ปค๋ฅผ ์ฌ์ฉํ ์ ์์ด, linuxkit ๊ธฐ๋ฐ ๊ฒฝ๋ ๊ฐ์๋จธ์ ์์์ ๋์ปค๋ฅผ ์คํํฉ๋๋ค.
# ์ดํ์ ์ค์ต์ ๋ฆฌ๋
์ค์์ ์คํํ๊ธธ ๊ถ์ฅํฉ๋๋ค.
โฏ docker run -it centos:latest bash
[root@c3fdb0cda9ac /]# uname -a
Linux c3fdb0cda9ac 4.19.76-linuxkit #1 SMP Tue May 26 11:42:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
์ปจํ
์ด๋๋ ์ด๋ฏธ์ง์ ๋ฐ๋ผ์ ์คํ๋๋ ํ๊ฒฝ(ํ์ผ ์์คํ
)์ด ๋ฌ๋ผ์ง๋ค.
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ chroot ๋ฅผ ํ์ฉํ์ฌ ์ด๋ฏธ์ง(ํ์ผ์ ์งํฉ)๋ฅผ ๋ฃจํธ ํ์ผ ์์คํ
์ผ๋ก ๊ฐ์ ๋ก ์ธ์์์ผ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ ํธ์คํธ์ ์ปค๋์ ์ฐ๊ณ ์์ง๋ง, ์ด๋ฏธ์ง๋ง๋ค ๋ฃจํธ๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ์ฌ ์๋ก ๋ค๋ฅธ ํ์ผ ์์คํ
์ ๊ฒฝํํ ์ ์๋ค.
Copy # ๋์ ํ์ผ์์คํ
์ด ๋ค๋ฅธ ๊ฒ์ ๋ณผ ์ ์๋ค.
$ docker run -it ubuntu:latest bash
root@03d7ffae4c3c:/# cat /etc/*-release
DISTRIB_ID = Ubuntu
$ docker run -it centos:latest bash
[root@6ec49524540c /]# cat /etc/ * -release
CentOS Linux release 8.2.2004 (Core)
์ปจํ
์ด๋๋ ๊ฒฐ๊ตญ์ ํ๋ก์ธ์ค์ด๋ค.
Copy ## ์ฐ์ , ํฐ๋ฏธ๋์ PID๋ฅผ ํ์ธํด๋ด
๋๋ค.
$ echo $$
3441
$ sudo ps -ef | grep 3441
ubuntu 3441 3440 0 05:46 pts/2 00:00:00 -bash
## ๊ทธ๋ผ, PID 1์ Command๋ฅผ ํ์ธํด๋ด
๋๋ค.
$ cat /proc/1/comm
systemd
$ pstree -p
systemd(1 )โโฌโaccounts-daemon( 849 )โโฌโ{ accounts-daemon}(859 )
...
## ์ด์ nginx ์ปจํ
์ด๋๋ฅผ ์คํํด๋ด
๋๋ค.
$ docker run --name nginx -d -p 80:80 nginx:latest
$ docker exec -it nginx bash
root@acaf67af191e:/# echo $$
324
## nginx ์ปจํ
์ด๋์ PID 1 ์ Command๋ nginx์์ ํ์ธํ ์ ์์ต๋๋ค.
$ sudo docker exec -it acaf67af191e cat /proc/1/comm
nginx
root@acaf67af191e:/# apt-get update
root@acaf67af191e:/# apt-get install psmisc
root@acaf67af191e:/# pstree -p
nginx(1 )--nginx( 28 )
## ํ์ง๋ง ์ฌ์ค์ PID 4453 ํ๋ก์ธ์ค์์ ํ์ธํ ์ ์์ต๋๋ค.
## ์๋ฒ์์ ๊ทธ์ nginx ํ๋ก์ธ์ค๊ฐ ํ๋ ๋์์ ธ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
$ cat /var/run/docker/runtime-runc/moby/acaf67af191e5165b98b427b851f9b29a1450d20abd4e2e5287463ccc02c24a0/state.json | jq '.init_process_pid'
4453
$ cat /var/run/docker/runtime-runc/moby/acaf67af191e5165b98b427b851f9b29a1450d20abd4e2e5287463ccc02c24a0/state.json | jq '.namespace_paths'
{
"NEWCGROUP" : "/proc/4453/ns/cgroup" ,
"NEWIPC" : "/proc/4453/ns/ipc" ,
"NEWNET" : "/proc/4453/ns/net" ,
"NEWNS" : "/proc/4453/ns/mnt" ,
"NEWPID" : "/proc/4453/ns/pid" ,
"NEWUSER" : "/proc/4453/ns/user" ,
"NEWUTS" : "/proc/4453/ns/uts"
}
$ ls -Al /proc/1/ns | awk '{ print $9 $10 $11 }'
$ ps -ef | grep 4453
$ ps -auxfg
์ปจํ
์ด๋์ ์คํํ๊ฒฝ์ ์ดํดํ๋ฉด ์ต์
์ ์ฌ์ฉํ๊ธฐ๋ ํจ์ฌ ์์ํด์ง๋ค.
-i : ํ์ค ์
๋ ฅ์ ๋ฐ๋๋ก ์ค์ ํ๋ ๊ฒ. ํ์ดํ๋ผ์ด๋์ด๋ ํค๋ณด๋ ์
๋ ฅ ๋ฑ์ ๋งํ๋ค.
-t : ๊ฐ์ ํฐ๋ฏธ๋ ์ค์ ์ด๋ค.
-it ๊ฐ ์กฐํฉ๋๋ฉด, ๊ฐ์ ํฐ๋ฏธ๋๋ก ํ์ค์
๋ ฅ์ ํ ์ ์์ผ๋ฉฐ, -t ํ๋๋ง ์ฐ์ฌ์๋ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์๋ค.
ํฐ๋ฏธ๋์ ์๋๋ฐ ์
๋ ฅ์ ์๋๋ ์ํฉ์ด ๋๋ฏ๋ก!
-i๋ ํ๋ก ์ฐ์ฌ๋ ํฐ๋ฏธ๋ ์์ด ๋์ํ๋ ํ์ดํ๋ผ์ด๋ ๋ฑ์ผ๋ก ์
๋ ฅ์ ํ๋ ๊ธฐ๋ฅ์ ์ฐ์ผ ์ ์๋ค.
-d : -i, -t ์ ํจ๊ป ์ฐ์ผ ์ ์๋ค. background ์์ ๋์๊ฐ๊ธฐ ๋๋ฌธ์ -i ๋ก ์
๋ ฅ์ ๋๊ธฐํ ์๋, -t ๋ก ๊ฐ์ํฐ๋ฏธ๋์ ์ ๊ณตํ ์๋ ์๊ธฐ ๋๋ฌธ!
๋์ปค ๋ฐ๋ชฌ์ ํฌ๊ฒ ์ปจํ
์ด๋, ์ด๋ฏธ์ง ๋น๋, ๊ด๋ฆฌ, ๊ณต์ , ์คํ, ๋ฐ ์ปจํ
์ด๋ ์ธ์คํด์ค ๊ด๋ฆฌ ๋ฑ์ ๊ธฐ๋ฅ์ ํ๋ค.
๋ชจ๋ ์ปจํ
์ด๋๋ฅผ ์์ ํ๋ก์ธ์ค๋ก ์์ ํ๋ค.
3. ๋์ปค ์ด๋ฏธ์ง
์ด๋ฏธ์ง : ํ์ผ๋ค์ ์งํฉ. ์ปจํ
์ด๋๋ ์ด ํ์ผ๋ค์ ์งํฉ ์์์ ์คํ๋ ํน๋ณํ ํ๋ก์ธ์ค
ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์๋ณธ ํ๋ก๊ทธ๋จ ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ฏ์ด, ์ปจํ
์ด๋์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ปจํ
์ด๋ ์ด๋ฏธ์ง์ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋์ปค ์ด๋ฏธ์ง๋ [์ ์ฅ์ ์ด๋ฆ]/[์ด๋ฏธ์ง ์ด๋ฆ]:[ํ๊ทธ] ์ ํํ๋ก ๊ตฌ์ฑ๋๋ค.
Copy ## Official ์ด๋ฏธ์ง๋ [์ ์ฅ์ ์ด๋ฆ]์ ๋ถ์ฌ์ฃผ์ง ์์๋ ๋ฉ๋๋ค.
$ docker pull ubuntu:latest
๋์ปค๋ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ํฉ์ณ์ ํ์ผ ์์คํ
์ ์ด๋ฃฌ๋ค.
๋์ปค๊ฐ ๋ช
๋ น์ด๋ก commit, pull, push ๋ฑ์ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ๋ค์ ํ ๋ฒ ์๊ฐํด๋ณธ๋ค.
Copy ## ubuntu ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋, ์ด๋ค ์์๋ก ์งํํ๋์ง ํ์ธํด๋ด
๋๋ค.
$ docker history ubuntu
## ubuntu ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ์ฌ commit_test๋ผ๋ ํ๊ทธ๋ฅผ ๋ถ์ธ ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค.
$ docker run -i -t --name commit_test ubuntu:latest
## ์ปจํ
์ด๋ ๋ด๋ถ์ ํ์ผ์ ํ๋ ์์ฑํฉ๋๋ค.
root@d7c8c6bf4aa4:/# echo test_first! >> first
## ์ปจํ
์ด๋์ ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค.
$ docker commit \
-a "woowahancu" -m "my first commit " \
commit_test \
commit_test:first
## ์ปค๋ฐํ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
$ docker images
## ๋ณ๊ฒฝ์ฌํญ์ ํ๋๋ ์ถ๊ฐํ ํ ์ปค๋ฐํฉ๋๋ค
$ docker run -i -t --name commit_test2 commit_test:first
root@07640650696a:/# echo test_second! >> second
$ docker commit \
-a "woowahancu" -m "my second commit " \
commit_test2 \
commit_test:second
## ๊ฐ ์ด๋ฏธ์ง๋ค์ฌ์ด์ ์ถ๊ฐ๋ Layer๋ฅผ ํ์ธํฉ๋๋ค.
$ docker inspect ubuntu:latest | jq '.[].RootFS.Layers'
$ docker inspect commit_test:first | jq '.[].RootFS.Layers'
$ docker inspect commit_test:second | jq '.[].RootFS.Layers'
$ docker inspect commit_test:first | jq '.[].GraphDriver'
$ docker inspect commit_test:second | jq '.[].GraphDriver'
## ์ปค๋ฐ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํด๋ด
๋๋ค.
$ cat /var/lib/docker/overlay2/[์ปจํ
์ด๋ID]/diff/second
4. ๋์ปค ๋คํธ์ํฌ
veth interface
๋์นด๋์ ์ฐ๊ฒฐ๋ ์ค์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๊ฐ ์๋๋ผ ๊ฐ์์ผ๋ก ์์ฑํ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ด๋ค.
์ผ๋ฐ์ ์ธ ๋คํธ์ํฌ์๋ ๋ค๋ฅด๊ฒ ํจํท์ ์ ๋ฌ๋ฐ์ผ๋ฉด, ์์ ์๊ฒ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ก ํจํท์ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ํญ์ ์์ผ๋ก ์์ฑํด์ผํ๋ค.
NET namespace
๋ฆฌ๋
์ค์ ๊ฒฉ๋ฆฌ ๊ธฐ์ ์ธ namespace ์ค ๋คํธ์ํฌ์ ๊ด๋ จ๋ ๋ถ๋ถ์ ๋งํ๋ค.
๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ namespace ์ ํ ๋นํจ์ผ๋ก์จ ์๋ก๊ฐ ์๋ก๋ฅผ ๋ชจ๋ฅด๊ฒ๋ ์ค์ ํ ์ ์๋ค.
๋์ปค ๋คํธ์ํฌ ๊ตฌ์กฐ
์์ ๋ ๊ฐ์ง ๊ฐ๋
์ ์ด์ฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋ค.
mac ์ด๋ window ๋ veth interface ๊ฐ VM ์์ ๊ฐ์ถฐ์ ธ์์ด์ ํ์ธํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
์ปจํ
์ด๋๋ namespace ๋ก ๊ฒฉ๋ฆฌ๋๊ณ , ํต์ ์ ์ํ ๋คํธ์ํฌ ์ธํฐํ์ด์ค eth0์ ํ ๋น๋ฐ๋๋ค. (ํ๋๋ถ๋ถ)
ํธ์คํธOS ์ veth interface๊ฐ ์์ฑ๋๊ณ , ์ปจํ
์ด๋ ๋ด์ eth0 ๊ณผ ์ฐ๊ฒฐ๋๋ค.
host ์ veth interface ๋ docker0๋ผ๋ ๋ค๋ฅธ veth interface ์ ์ฐ๊ฒฐ๋๋ค.
docker 0 ๋ ๋์ปค ์คํ์์ ์๋์ผ๋ก ์์ฑ๋๋ ๊ฐ์์ ๋ธ๋ฆฟ์ง์ด๋ค.
๋ชจ๋ ์ปจํ
์ด๋๋ ์ด ๋ธ๋ฆฟ์ง๋ฅผ ํตํด์ ์๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค.
Copy ## ๋์ปค๋ฅผ ์์ฑํ๋ฉด 3๊ฐ์ง ํํ์ network๊ฐ ์๊น์ ํ์ธํ ์ ์์ต๋๋ค.
$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
6b6ce553a425 bridge bridge local
81a18bc9cc40 host host local
576b0223f9cf none null local
## bridge ๋คํธ์ํฌ๋ฅผ ํ์ธํด๋ณด๋ฉด 172.17.0.0/16 ๋์ญ์ ํ ๋นํ์์ ํ์ธํ ์ ์์ต๋๋ค.
$ docker network inspect bridge
[
{
"Name" : "bridge" ,
"Id" : "6b6ce553a425c9392c5a65b8dcd2a57e1665289354b97f430758b745b1dc86a7" ,
...
"Subnet" : "172.17.0.0/16" ,
"Gateway" : "172.17.0.1"
## ๊ทธ๋ฆฌ๊ณ 172.17.0.0/16 ๋์ญ์ docker0๋ก ๋งคํ๋์ด ์์ต๋๋ค.
$ ip route
default via 192.168.0.193 dev eth0 proto dhcp src 192.168.0.207 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
## docker0๋ veth interface์ ๋งคํ๋ ๋ธ๋ฆฟ์ง์์ ํ์ธํ ์ ์์ต๋๋ค.
$ brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.024238d4b0f5 no vethc8e309f
$ ip link ls
3: docker0: < BROADCAST,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc noqueue state UP mode DEFAULT group default
66: vethc8e309f@if65: < BROADCAST,MULTICAST,UP,LOWER_UP > mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
docker-compose ๋ก ๋์ฐ๋ฉด, ๋ค๋ฅธ ๋คํธ์ํฌ ๋์ญ์ ๊ฐ์ง๋ค. compose ๋ก ๋ฌถ์ ๋ฒ์์ ๋ง์ถฐ์ ๋ธ๋ฆฟ์ง๋ฅผ ํ๋ ๋ ์์ฑํ๊ธฐ ๋๋ฌธ!
์๋ก ๊ณต์ ํ๋ ๋ธ๋ฆฟ์ง๊ฐ ๋ค๋ฅด๋ฏ๋ก, docker-compose ๋ก ๋์ด ์ปจํ
์ด๋์ ์ผ๋ฐ ์ปจํ
์ด๋๋ ์๋ก ํต์ ํ ์ ์๋ค.
Copy $ git clone https://github.com/woowacourse/service-practice.git
$ cd lb
$ docker build -t node-server .
$ docker-compose -p practice up -d
$ sudo docker container inspect practice_lb_1 | jq '.[].NetworkSettings.Networks.practice_default.Gateway'
"172.18.0.1"
$ ip route
172.18.0.0/16 dev br-754310d33f5c proto kernel scope link src 172.18.0.1
$ ip link ls
4: br-754310d33f5c: < NO-CARRIER,BROADCAST,MULTICAST,U P > mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:cd:76:d1:f1 brd ff:ff:ff:ff:ff:ff
๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋๋ ์ธ๋ถ์ ํต์ ์ด ๋ถ๊ฐํ๋ค. ํฌํธํฌ์๋ฉ์ ์ค์ ํ์ฌ ์ธ๋ถ์ ์ปจํ
์ด๋๋ฅผ ๊ณต๊ฐํ ์ ์๋ค.
Copy # ํฌํธํฌ์๋ฉ ์ค์ ๊ณผ ํจ๊ป ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค.
$ docker container run -d -p 8081:80 nginx
16cd67c48e5721a6b666192b8960875c720168bf6c5e3ed2138fb04c492447c6
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16cd67c48e57 nginx "/docker-entrypoint.โฆ" 4 seconds ago Up 3 seconds 0.0.0.0:8081 - > 80/tcp trusting_bhabha
# Host์ 8081ํฌํธ๊ฐ listen ์์ ํ์ธํฉ๋๋ค.
$ sudo netstat -nlp | grep 8081
tcp6 0 0 :::8081 :::* LISTEN 10009/docker-proxy
# docker-proxy ๋ผ๋ ํ๋ก์ธ์ค๊ฐ ํด๋น ํฌํธ๋ฅผ listen ํ๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค.
# docker-proxy๋ ๋ค์ด์จ ์์ฒญ์ ํด๋นํ๋ ์ปจํ
์ด๋๋ก ๋๊ธฐ๋ ์ญํ ๋ง์ ์ํํ๋ ํ๋ก์ธ์ค์
๋๋ค.
# ์ปจํ
์ด๋์ ํฌํธํฌ์๋ฉ์ด๋ expose๋ฅผ ์ค์ ํ์ ๊ฒฝ์ฐ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
$ iptables -t nat -L -n
Chain DOCKER (2 references )
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8081 to:172.17.0.2:80
# ๋ณด์๋ค์ํผ ๋ชจ๋ ์์ฒญ์ DOCKER Chain ์ผ๋ก ๋๊ธฐ๊ณ , DOCKER Chain ์์๋ DNAT๋ฅผ ํตํด ํฌํธํฌ์๋ฉ์ ํด์ฃผ๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค.
# ์ด iptables ๋ฃฐ์ docker daemon์ด ์๋์ผ๋ก ์ค์ ํฉ๋๋ค.
docker container ์ ๋คํธ์ํฌ ๋ชจ๋๋ bridge, host, container, none ๋ฑ ์ด 4๊ฐ๊ฐ ์กด์ฌํ๋ค.
5. ๋์ปค ๋ณผ๋ฅจ
๋์ปค ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ๋ฉด, ์ด๋ฏธ์ง๋ ์ฝ๊ธฐ ์ ์ฉ์ด ๋๋ค.
์ปจํ
์ด๋์ ๋ณ๊ฒฝ์ฌํญ๋ง ๋ณ๋ ์ ์ฅํด์ ๊ฐ ์ปจํ
์ด๋์ ์ ๋ณด๋ฅผ ๋ณด์กดํ๋ค.
ํ์ง๋ง mysql ๊ณผ ๊ฐ์ด ์ปจํ
์ด๋ ๊ณ์ธต์ ์ ์ฅ๋์ด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ญ์ ํด์๋ ์๋๋ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค. ์ปจํ
์ด๋ ๋ฐ์ดํฐ๋ฅผ ์์์ ์ธ ๋ฐ์ดํฐ๋ก ํ์ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค, ๋ณผ๋ฅจ์ ํ์ฉํ๋ ๋ฐฉ์์ด ์๋ค.
-v ์ต์
: ํธ์คํธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋์ ๋๋ ํฐ๋ฆฌ์ ๋ง์ดํธํ๋. ๋ฐ๋ผ์ ์ปจํ
์ด๋์ ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ด ์์๋ค๋ฉด, ํธ์คํธ์ ๋ณผ๋ฅจ์ผ๋ก ๋ฎ์ด ์์์ง๋ค.
Copy $ docker run -d \
--name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABAS=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
$ docker run -d \
--name wordpress_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
--link wordpressdb_hostvolume:mysql \
-p 80 \
wordpress
$ ls /home/wordpress_db
$ docker stop wordpressdb_hostvolume wordpress_hostvolume
$ docker rm wordpressdb_hostvolume wordpress_hostvolume
์ด๋ ๊ฒ ์ปจํ
์ด๋๊ฐ ์๋ ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ปจํ
์ด๋๋ ๊ทธ ๋ฐ์ดํฐ๋ก ๋์ํ๋๋ก stateless ํ๊ฒ ์ค๊ณํ์ฌ์ผ ํ๋ค. ์ปจํ
์ด๋ ์์ฒด๋ ์ํ๊ฐ ์๊ณ , ์ํ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ์ดํฐ๋ ์ธ๋ถ๋ก๋ถํฐ ์ ๊ณต๋ฐ๋๋ก ํ๋ค.