2022. 1. 16. 13:01ใBACKEND/Docker & Kubernetes
๐ Docker Series
> Docker Engine, ์ ๋๋ก ์ดํดํ๊ธฐ (1) - docker engine deep dive
Docker Engine, ์ ๋๋ก ์ดํดํ๊ธฐ (2) - namespace, cgroup
Docker Network, ์ ๋๋ก ์ดํดํ๊ธฐ (1) - libnetwork
Docker Network, ์ ๋๋ก ์ดํดํ๊ธฐ (2) - bridge, host, none drivers
Docker, ์ ๋๋ก ์ฌ์ฉํ๊ธฐ - Commands
์๋ ํ์ธ์. ์ค๋์ Docker Engine์ ๋ํด ๊น๊ฒ ๋ค๋ฃจ๋ ค๊ณ ํฉ๋๋ค.
์ด ํฌ์คํ ์ ๋ชฉ์ ์ dockerEngine์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋์์๋ฆฌ ๋ฑ์ ์ต๋ํ ์์ธํ ๋ค๋ฃจ๋๋ฐ ์์ต๋๋ค.
์ด ๊ธ์ ์ฝ๋ ๋ ์๊ฐ Docker image, container ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ดํดํ๋ค๋ ๊ฐ์ ํ์ ์์ฑํฉ๋๋ค.
์ฐธ๊ณ ์ฌํญ์ผ๋ก, ํฌ์คํ ์ " ๋์ฃผ์ (์ด๋ชจ์ง+ํ๋๊ธ์) > โ๏ธ ์์ฃผ์ > # ๋ฌธ๋จ ํค์๋ " ๋ก ๋ถ๋ฆฌํด์ ์ ๋ฆฌํ์ต๋๋ค.
ํด๋น ํฌ์คํ ์ ๋ชจ๋ ๊ทธ๋ฆผ์ ์ง์ ๊ทธ๋ฆฐ ๊ฒ์ผ๋ก, ์ฌ์ฉ์ ์ถ์ฒ ํ์ ๋ถํ๋๋ฆฝ๋๋ค ๐๐ป.
----------------- INDEX -----------------
[ 1๋ถ ]
History
Background
์ด๊ธฐ Docker engine
docker daemon
LXC
Docker Engine
big picture
docker client
dockerd
containerd
runc
shim
Namespace
cgroups
[ Docker Network ]
----------------------------------------------
โฑ History
Docker๋ ์ปจํ ์ด๋ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ํ๊ฒฝ์ ์ ์ํ๊ฒ ๊ตฌ์ถํ๊ณ ํ ์คํธ ๋ฐ ๋ฐฐํฌ๋ฅผ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ซํผ์ ๋๋ค. Docker๋ ์ ์๊ฒผ์๊น์? ์์ฃผ ์งง๊ฒ ๊ทธ ํ์ ๊ณผ์ ์ ๋ํด ์์๋ณผ๊ฒ์.
โ๏ธ Background
# VMware
์-์ฃผ ์์ ์๋ ํ๋์ ์๋ฒ ๋น ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์๋์ต๋๋ค.
๋์ผํ ์๋ฒ์์ ์ฌ๋ฌ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ๋ฉด์์๋ ๋ณด์๋ฉด์์๋ ์์ ํ๊ฒ ์คํ์ํค๋ ๊ธฐ์ ์ด ์์์ฃ .
๊ทธ๋์ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ๋๋ง๋ค ์๋ฒ๋ฅผ ๊ตฌ๋งคํด์ผํ๊ณ ,
๋ฌด์กฐ๊ฑด ์ฑ๋ฅ๊ณผ ๊ท๋ชจ๊ฐ ์ข์ ๊ฒ์ ๊ตฌ๋งคํ๋๋ผ ๋ญ๋น๊ฐ ์ฌํ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ '๊ฐ์ ๋จธ์ VM'์ด๋ผ๋ ๊ฐ๋ ์ด ์ธ์์ ๋์ค๊ฒ ๋์๊ณ ,
ํ๋์ ์ด์์ฒด์ ์์ ์ฌ๋ฌ OS๋ฅผ ์คํ์์ผ ๋ญ๋น๋ฅผ ํฌ๊ฒ ์ค๊ฒ ํด์ฃผ์์ต๋๋ค.
ํ์ง๋ง, ๊ฐ์๋จธ์ ๋ ๊ฒฐํจ์ ๊ฐ๊ณ ์๋๋ฐ์.
ํ๋์ VM ๋ง๋ค ๊ณ ์ ํ OS๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์,
๊ฐ๊ฐ CPU, RAM ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๋ฅผ ์๋นํ๋ฉฐ ๋ณด๋ค ๋ง์ ์๊ฐ๊ณผ ์์์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค.
๋ํ ํน์ OS๋ ๋ผ์ด์ผ์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
# Container
์์ VM ๋ชจ๋ธ์ ๋จ์ ๋ค๋ก ์ธํด ๊ตฌ๊ธ๊ณผ ๊ฐ์ ๋ํ ํ์ฌ๋ค์ ์ปจํ ์ด๋ ๊ธฐ์ ์ ์ฌ์ฉํด์์ต๋๋ค.
์ปจํ ์ด๋ ๋ชจ๋ธ์์ ์ปจํ ์ด๋๋ VM๊ณผ ์ ์ฌํฉ๋๋ค.
์ฃผ์ ์ฐจ์ด์ ์ ์ปจํ ์ด๋์ ์์ฒด์ ์ธ ํ๋์ ์์ ํ OSfull-blown OS ๊ฐ ํ์ํ์ง ์๋ค๋ ์ ์ ๋๋ค.
์ค์ ๋ก ์ปจํ ์ด๋ ๋ชจ๋ธ์์๋ ๋จ์ผ ํธ์คํธ์ ๋ชจ๋ ์ปจํ ์ด๋๋ ํธ์คํธ์ OS๋ฅผ ๊ณต์ ํฉ๋๋ค.
์ด ๊ฒ์ CPU, RAM ๋ฐ ์คํ ๋ฆฌ์ง์ ๊ฐ์ ๋ง๋ํ ์์ ์์คํ ๋ฆฌ์์ค๊ฐ ํ๋ณด๋๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
๋ํ , ๋ผ์ด์ผ์ค ๋น์ฉ์ ์ ๊ฐํ ์ ์๊ณ OS ํจ์น ๋ฐ ์ ์ง๋ณด์์ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ์ฃผ๋ฉฐ VM์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, VM์์ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ํ ์๊ฐ์ด๋ ๋ฆฌ์์ค ๋ฐ ๋คํธ์ํฌ๋ฅผ ์ ๊ฐํ ์ ์๋๋ฐ์.
์ปจํ ์ด๋๋ ๋ํ ์๋๋ ๋น ๋ฅด๊ณ ๋งค์ฐ ํด๋์ฑ์ด ๋ฐ์ด๋ฉ๋๋คultra-portable.
์ปจํ ์ด๋ ์ํฌ๋ก๋๋ฅผ ๋ ธํธ๋ถ์์ ํด๋ผ์ฐ๋๋ก, ํน์ ๋ฒ ์ด๋ฉํ ์๋ฒ๋ก ์ฝ๊ฒ ์ด๋ํ ์ ์์ต๋๋ค.
โ๏ธ ์ด๊ธฐ Docker Engine
์ด๊ธฐ Docker๋ ํ์ฌ ๋ชจ๋ธ๊ณผ๋ ๋ค๋ฅด๊ฒ Docker Daemon, LXC ๋ผ๋ ๋ ๊ฐ์ ์ฃผ์ ๊ตฌ์ฑ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
โ๏ธ docker daemon
์ด ๋ Dokcer Daemon์ ํ์ฌ์ Docker Daemon๊ณผ๋ ๋ฌ๋๋๋ฐ์.
The Docker daemon๋ ๋ชจ๋๋ฆฌ ๋ฐ์ด๋๋ฆฌmonolithic binary์ด์์ต๋๋ค. (๋ชจ๋ํ๊ฐ ๋์ด์์ง ์์)
Docker Daemon์ Docker client, the Docker API, container runtime, image builds ๋ฑ์ ๋น๋กฏํ ๋ง์ ์ฝ๋๋ค์ ๋ด๊ณ ์์์ต๋๋ค.
โ๏ธ LXC
LXC๋ ๋จ์ผ ์ปจํธ๋กค ํธ์คํธ ์์์ ์ฌ๋ฌ๊ฐ์ ๊ณ ๋ฆฝ๋ ๋ฆฌ๋ ์ค ์์คํ (์ปจํ ์ด๋)๋ค์ ์คํํ๊ธฐ ์ํ ์ด์ ์์คํ ๋ ๋ฒจ ๊ฐ์ํ ๋ฐฉ๋ฒ์ ๋๋ค. daemon์๊ฒ Linux kernel์ ์กด์ฌํ๋ ์ปจํ ์ด๋์ ๊ธฐ๋ณธ building block์ ๋ํ namespaces๋ cgroups(control groups)์ ๊ฐ์ ์ ๊ทผ์ ์ ๊ณตํ์ต๋๋ค.
namespace๋ ๊ฐ๋จํ ๋งํ์๋ฉด, ์ด์ ์์คํ ์ ์ชผ๊ฐ์ ๊ฐ๊ฐ ๊ณ ๋ฆฝ๋ ์ํ๋ก ์ด์์ด ๋๋ ๊ฐ๋ ์ ์๋ฏธํด์.
cgroups๋ ๊ฐ๋จํ ๋งํ์๋ฉด, namespaces์ผ๋ก ๊ณ ๋ฆฝ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์์์ ์ ํํ๋ ์ญํ ๋ฑ์ ํ๋ ๊ฐ๋ ์ ๋๋ค.
์ด ๋ถ๋ถ์ Building Block์ ์ดํดํ ํ ๋ค์ ๋ณด๋ฉด ์ดํดํ๋๋ฐ ๋์์ด ๋์ค๊ฑฐ์์.
์ด์จ๋ , ๋ถ๋ฆฌ๋ ํ ๊ณ ๋ฆฝ๋ ๊ฐ๊ฐ์ ํ๊ฒฝ๋ค์ด ๋ง๋ค์ด์ง๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ์.
container์ ๊ฐ๋ ์ ์๊ณ ์๋ค๋ฉด, ๋ฐ๋ก ์ด ๊ธฐ์ ์ด container ๊ธฐ์ ์ ๊ทผ๊ฐ์ด๋ผ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
# LXC์ ๋ฌธ์ ์
LXC๋ ๋ฆฌ๋ ์ค์ ํนํ๋์ด ์๋๋ฐ, Docker๊ฐ Multi-Platform์ ๋ชฉํ๋ก ํ๋๋ฐ ํฐ ๋ฆฌ์คํฌ์์ต๋๋ค.
๋ํ, ์์คํ ์ ๊ตฌ์ฑํ๋ ํต์ฌ์ ์ธ ์์๊ฐ ์ธ๋ถ ์์คํ ์ ์์กดํ๋ค๋ ๋ฌธ์ ๋ ์์์ต๋๋ค.
๋๋ฌธ์ Docker์ฌ๋ LXC๋ฅผ ๋์ฒดํ๊ธฐ ์ํด libcontainer๋ผ๋ ๋ ์์ ์ธ ํด์ ๊ฐ๋ฐํ์ผ๋ฉฐ,
go ์ธ์ด๋ก ์์ฑ๋์ด platform-agnostic(๋ถํน์ ํ๋ซํผ) ํด๋ก ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
๊ทธ๋์ Docker 0.9๋ถํฐ ๊ธฐ๋ณธ ์คํ ๋๋ผ์ด๋ฒ๋ฅผ LXC์์ libcontainer๋ก ๋์ฒดํ์ต๋๋ค.
# Libcontainer
Libcontainer๋ ํ์ฌ์ Docker Engine์์ ์ฌ์ฉํ๊ณ ์๋ ์ฃผ์ ์ปดํฌ๋ํธ์ ๋๋ค.
Go ์ธ์ด๋ก ๋ง๋ค์ด์ ธ์ Container๋ฅผ ์์ฑ ์ namespaces, cgroups, capabilities ๋ฅผ ์ ๊ณตํ๊ณ , filesystem์ ์ ๊ทผ์ ์ ํํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋๊ฐ ์์ฑ๋ ํ ์์ ์ ์ํํ ์ ์๋๋ก ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, Libcontainer๋Docker์ ๋ถ๋ฆฌ๋ LXC์๋ ๋ค๋ฅด๊ฒ,
Docker ๋ด๋ถ์์ ์คํ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Docker์์๋ ์์ฒด์ ์ผ๋ก ์ ์ํ libcontainer์ CLI wrapper์ธ runc๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์, ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ปจํ ์ด๋์ ๊ตฌ์กฐ๋ฅผ ์์๋ณผ๊ฒ์.
๋์ปค ๋ด๋ถ๋ฅผ ์์๊ฐ๊ธฐ ์ ์ ๋์ปค ์ฉ์ด๋ฅผ ํ์คํ ํ๊ณ ๋์ด๊ฐ์ผ ํ ๊ฒ ๊ฐ์์.
๋์ปค์ ๊ตฌ์กฐ๋ฅผ ์ดํผ๋ฉฐ ์์ฃผ ์ฌ์ฉํ ๋จ์ด๋ค์ ํ๋ฒ์ฉ ์ง๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
โ๏ธ Docker Engine
Docker๋ Client-Server ๋ชจ๋ธ์ ๊ตฌํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
Docker Engine์ Docker Components์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ถํ๊ณ ์คํํ๋ ๊ธฐ๋ณธ ํต์ฌ ์ํํธ์จ์ด์ ๋๋ค.
Docker Engine์ Docker Daemon, REST API, API๋ฅผ ํตํด ๋์ปค ๋ฐ๋ชฌ๊ณผ ํต์ ํ๋ CLI๋ก ๋ชจ๋์์ผ๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
๊ฐ๋ฐ์๋ค์ด Docker๋ผ๊ณ ํ ๋, ์ฃผ๋ก Docker engine์ ์๋ฏธํฉ๋๋ค.
Docker Engine์ ์๋์ฐจ์ ์์ง๊ณผ ๋น๊ตํ ์ ์์ต๋๋ค.
์๋์ฐจ ์์ง๊ณผ ๋์ปค ์์ง์ ๋น์ ๋ฅผ ํ์๋ฉด, ๋ ๋ค ๋ชจ๋์์ด๊ณ ๋ง์ ์ ์ฉ ๋ถํ๋ค์ ์ํด ์ฐ๊ฒฐ๋์ด ์ ์๋ฉ๋๋ค.
Car Engine — intake manifolds, throttle body, cylinders, spark plugs, exhaust manifolds etc.
Docker Engine — APIs, execution driver, runtimes, shims etc.
์๋์ ๊ทธ๋ฆผ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋๋ฅผ ๋น๋, ์คํ, ๋ฐฐํฌํ๋ ๋ฑ์ ๋ฌด๊ฑฐ์ด ์์ ์ Docker Daemon์ด ํ๋ฉฐ,
Docker Client๋ ์ด๋ฌํ ๋ก์ปฌ ํน์ ์๊ฒฉ์ Docker Daemon๊ณผ ํต์ ํฉ๋๋ค.
ํต์ ์ ํ ๋์๋ UNIX socket(/var/run/docker.sock) ๋๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ํตํ REST API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฃผ๋ก ์ฌ๋๋ค์ด "docker"๋ผ๋ ๋จ์ด๋ฅผ ๋งํ ๋๋ ๋ค์ํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ์.
"docker"๋ Docker Engine ๋ฟ๋ง ์๋๋ผ Docker Client, ํน์ Docker Inc.(๋์ปค ๊ฐ๋ฐ์ฌ)๋ฅผ ์๋ฏธํ ์๋ ์์ต๋๋ค.
โ๏ธ big picture
Docker Engine์ด ๋์๋๋ ํฐ ๊ทธ๋ฆผ์ ๋จผ์ ๋ณผ๊ฒ์.
์๋์ ๊ธฐ๋ฅ๋ค์ ๋จผ์ ์ตํ๋ค์ ์ฝ์ด๋ ์ข์ต๋๋ค.
1) docker client
๊ฐ์ฅ ๋จผ์ , ์ ์ ๊ฐ Docker CLI๋ฅผ ํตํด ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค.
(e.g. $ docker container run --name ctr1 -it alpine:latest sh
)
Docker CLI์ ์ ๋ ฅํ๋ฉด Docker client๋ ์ ์ ํ API Payload๋ก ๋ณํํด์
Docker Daemon(์ดํ dockerd)์๊ฒ REST API๋ก POST ์์ฒญ์ ํฉ๋๋ค.
(e.g. POST /containers/create HTTP/1.1
)
2) dockerd
API๋ Unix Socket์ ํตํด dockerd์๊ฒ ์ ๋ฌ๋ฉ๋๋ค.
Linux์์ socket์ /var/run/docker.sock
์ด๊ณ , Windows์์๋ \pipe\docker_engine
์
๋๋ค.
์ ์ปจํ ์ด๋๋ฅผ ์์ํ ๋, dockerd๋ ๋ก์ปฌ ์ด๋ฏธ์ง๊ฐ ์๋์ง ํ์ธํ๊ณ
์๋ค๋ฉด registry repository์์ ํด๋นํ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ํ logging drivers์ volume์ด๋ volume drivers๋ฅผ ์ค์ ํ๋ ๋ฑ ์ปจํ ์ด๋์ ํ์ํ ๋๋ถ๋ถ์ ์ค์ ์ ์ง์ ํฉ๋๋ค.
dockerd๊ฐ '์๋ก์ด container๋ฅผ ์์ฑํ๋ผ'๋ ๋ช ๋ น์ ์์ ํ๋ฉด, containerd๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๋, dockerd๋ CRUD ์คํ์ผ API๋ฅผ ํตํด gRPC๋ก containerd์ ํต์ ํฉ๋๋ค.
(e.g. client.NewContainer(context, ...)
)
3) containerd
containerd๋ ์ค์ ๋ก containers๋ฅผ ์์ฑํ์ง ๋ชปํ๊ณ , runc๋ฅผ ํตํด ์์ฑํฉ๋๋ค.
Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ์ปจํ ์ด๋ ๊ตฌ์ฑ์ ์ ์ฉํ์ฌ runc๊ฐ ์คํํ ์ ์๋ OCI ๋ฒ๋ค๋ก ๋ณํํฉ๋๋ค.
4) runc
runc(๋ด๋ถ์ libcontainer ์ฌ์ฉ)๋ OS ์ปค๋์ ์ ์ํด์
์ปจํ ์ด๋๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ ์์(๋ค์์คํ์ด์ค, cgroup ๋ฑ)๋ฅผ ํ๋๋ก ๋ฌถ์ต๋๋ค.
runc๋ ์๋ก์ด container๋ฅผ ์์ฑํฉ๋๋ค.
5) shim
๊ทธ ๋ค์ ์ปจํ ์ด๋๋ฅผ ์์ํ๊ธฐ ์ํด docker-containerd-shim๊ณผ ๊ฐ์ shim์ ์คํํฉ๋๋ค.
์ปจํ ์ด๋ ํ๋ก์ธ์ค๋ runc์ ํ์ ํ๋ก์ธ์ค๋ก ์์๋๋๋ฐ, ์ปจํ ์ด๋ ํ๋ก์ธ์ค๊ฐ ์คํํ์๋ง์ runc๊ฐ ์ข ๋ฃexit๋ฉ๋๋ค.
์ด ๋, docker-containerd-shim์ด ์๋ก์ด ์์ ํ๋ก์ธ์ค๊ฐ ๋์ด ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์, ์ด์ ์์์ ์ธ๊ธ๋ ๋ชจ๋ ๊ธฐ์ ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
โ๏ธ docker client
= docker
ํํ docker๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก Docker Client์ ๋๋ค.
๋จ์ํ Docker CLI๋ผ๊ณ ์ดํดํ๋ฉด ํธํ ํ ๋ฐ์.
Docker Client๋ ๊ฐ๋ฐ์๋ค์ด Docker๋ฅผ ์ฌ์ฉํ๋ Docker CLI๋ Docker Compose๋ก,
$ docker run
๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ dockerd์๊ฒ REST API ํํ๋ก ์ ๋ฌํฉ๋๋ค.
์ด ๊ธ์ ์ฐ๋ ์์ ์์๋ Docker 1.41 ์ด ๊ฐ์ฅ ์ต์ ์ด๋ฉฐ, ๋งํฌ๋ฅผ ํ์ธํ์๋ฉด API ๋ช ์ธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ํ, Docker Client๋ ๋ค์์ ๋ฐ๋ชฌ๊ณผ ํต์ ํ ์๋ ์์ต๋๋ค.
๊ธ์ ์ ๋ฆฌํ๋ฉฐ ํต์ ๊ณผ์ ์ดํด์ ์ฐธ๊ณ ํ ํต์ ํ ์คํธ ์์(Docker remote REST API)์ ๋ณด๋ฉด ์ดํด์ ๋์์ด ๋ ๋ฏํฉ๋๋ค.
โ๏ธ dockerd
= Docker Daemon (Server)
๋์ปค ๋ฐ๋ชฌ(dockerd)์ Docker API ์์ฒญ์ ์์ ํ๊ณ ,
๋์ปค ๋ฐ๋ชฌ์ ๋ค๋ฅธ ๋ฐ๋ชฌ๊ณผ ํต์ ํ์ฌ ๋์ปค ์๋น์ค๋ฅผ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.
dockerd์ ์ญํ ๋ก๋ ์ด๋ฏธ์ง ๊ด๋ฆฌ, ์ด๋ฏธ์ง ๋น๋, REST API, ์ธ์ฆ, ๋ณด์, ์ฝ์ด ๋คํธ์ํน, ์ค์ผ์คํธ๋ ์ด์ ๋ฑ์ด ์์ต๋๋ค.
๊ณผ๊ฑฐ์ docker daemon๊ณผ๋ ๋ค๋ฅด๊ฒ ์ปจํ ์ด๋์ ์คํ๊ณผ ์ปจํ ์ด๋ ๋ฐํ์ ์ฝ๋๊ฐ ๋ชจ๋ํ๋ก ๋ถ๋ฆฌ๋์ด ์์ ๊ธฐ๋ฅ๋ค๋ง ๋จ์์ต๋๋ค.
โ๏ธ containerd
containerd๋ Container์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค (= container lifecycle operations).
containerd๋ ์๋ ์๊ณ , ๊ฐ๋ฒผ์ด Container lifecycle operations์ผ๋ก ์ค๊ณ๋์๋๋ฐ,
์๊ฐ์ด ์ง๋๋ฉด์ image pulls, volumes and networks์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ํ์ฅ๋์์ต๋๋ค.
๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋ ์ด์ ์ค ํ๋๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด์์ธ๋ฐ์.
์๋ฅผ ๋ค์ด, Kubernetes๊ฐ์ ํ๋ก์ ํธ์์๋ containerd๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ pushํ๊ณ pullํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ์์ ์ด ์ ์ฉํ๋ค๋ ์ ์ด ์์ต๋๋ค.
๋ชจ๋ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ต์ ์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒ๋ค์ ์ ํํ์ฌ ๋ฐ์ํ ์ ์์ต๋๋ค.
# High-Level Runtime
containerd๋ High-Level Runtime์ ๋๋ค.
High-Level Runtime์ ๋ณดํต ์ด๋ฏธ์ง ๊ด๋ฆฌ, gRPC/Web API์ ๊ฐ์ด ์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ ์ด์์ ๋์ ์์ค์ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐํ์์ ์๋ฏธํฉ๋๋ค. "high-level container tools", "high-level container runtimes" ์ผ๋ก ๋ถ๋ฅด๊ฑฐ๋, ๊ฐ๋์ ๊ทธ๋ฅ "container runtimes”์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
๋์กฐ์ ์ผ๋ก, Low-Level Runtime์๋ ๋ค์์ผ๋ก ๋ณผ runc๊ฐ ์์ต๋๋ค.
Docker Client๋ก๋ถํฐ Container ๊ด๋ จ ์์ฒญ์ dockerd๋ฅผ ๊ฑฐ์ณ gRPC ํต์ ์ ํตํด containerd ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์, containerd๋ ์ปจํ ์ด๋์ ๊ด๋ฆฌ๋ฅผ ์ํด runc๋ฅผ ์ฌ์ฉํ๋๋ฐ์. ๊ทธ๋ผ, runc๊ฐ ๋ฌด์์ธ์ง ์์๋ณผ๊ฒ์.
โ๏ธ runc
runc๋ *libcontainer์ฉ CLI Wrapper๋ก, ๋ ๋ฆฝ๋ container runtime์ ๋๋ค.
docker๊ฐ container ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฐ๋ณ๊ณ ์ด์๊ฐ๋ฅํ ํด์ ๋๋ค.
๋ค์ ๋งํด, container ๋์ ํ๊ฒฝ์ด ๊ฐ์ถ์ด์ง ๊ฐ๋ณ๊ณ ์ด์ ๊ฐ๋ฅํ ํด์ ๋๋ค.
Docker์์ runc๋ ๋ชฉ์ ์ ๋จ ํ๋์ธ๋ฐ์, ๋ฐ๋ก Container ์์ฑ์ ๋๋ค.
* libcontainer : Docker์ฌ๊ฐ multi-platform ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด go ์ธ์ด๋ก ์์ฑ๋ ํจํค์ง. (History - LXC ์ฐธ๊ณ )
# OCI
runc๋ OCI container-runtime-spec์ ๊ตฌํ์ฒด์ ๋๋ค.
OCI(Open Container Initiative)๋ kernel์ container ๊ด๋ จ ๊ธฐ์ ์ ๋ค๋ฃจ๋ interface๋ฅผ ํ์คํ์ํจ ๊ธฐ์ค์ ๋๋ค.
๊ทธ๋์ runc๊ฐ ๋์ํ๋ ๊ณ์ธต์ OCI Layer๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
# Low-Level Runtimes
Low-Level Runtimes๋ ๋ณดํต ์ปจํ ์ด๋๋ฅผ ์ด์ํ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถ ์ค์ ์ปจํ ์ด๋ ๋ฐํ์์ ์๋ฏธํฉ๋๋ค.
runc๋ ๋ ๋ฆฝ๋ ์ปจํ ์ด๋ ๋ฐํ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ด๋๋ฆฌ๋ก ๋ค์ด๋ฐ๊ณ ๋น๋ํ ์ ์์ต๋๋ค.
runc (OCI) container๋ฅผ ๋น๋ํ๊ณ ์คํ์ํค๋๋ฐ ๋ชจ๋ ๊ฒ์ ๊ฐ์ถ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
ํ์ง๋ง ์ด๊ฒ์ ๊ณจ๊ฒฉbare bones์ผ๋ฟ์ด๋ฉฐ ๋งค์ฐ ๋ฎ์ ๋ ๋ฒจlow-level์ ๋๋ค.
์ฆ, ์์ ํ Docker ์์ง์ ํน์ฑfull-blown Docker engine์ ๊ฐ์ง ์๋ ์์ต๋๋ค.
โ๏ธ shim
์์์ containerd๊ฐ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด runc๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ์.
์์ฑ๋๋ ๋ชจ๋ container ๋น runc์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ fork ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ ์ปจํ ์ด๋๊ฐ ์์ฑ๋๋ฉด, ์์ runc ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
์๋ฐฑ ๊ฐ์ runc ์ธ์คํด์ค๋ฅผ ์คํํ์ง ์๊ณ ๋ ์๋ฐฑ ๊ฐ์ container๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋์ ํ ๋น๋ ๋ถ๋ชจ runc ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด, ์ฐ๊ฒฐ๋ containerd-shim ํ๋ก์ธ์ค๊ฐ ์ปจํ ์ด๋์ ๋ถ๋ชจํ๋ก์ธ์ค๊ฐ ๋ฉ๋๋ค.
์ด๋ containerd์๊ฒ ์ปจํ ์ด๋์ file descriptor(e.g. stdin/out)์ ์ข ๋ฃ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์ฝ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊น๋๋ค.
* file descriptor
ํ๋ก์ธ์ค์์ ์ด๋ฆฐ ํ์ผ์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ํ์ผ ํ ์ด๋ธ์ ์ธ๋ฑ์ค์ ๋๋ค. ํ๋ก๊ทธ๋จ์ด ํ๋ก์ธ์ค๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์คํ๋ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋น๋๋ ํ์ผ๋์คํฌ๋ฆฝํฐ๋ ํ์ค์ ๋ ฅ(Standard Input), ํ์ค ์ถ๋ ฅ(Standard Output), ํ์ค์๋ฌ(Standard Error)์ด๋ฉฐ ์ด๋ค์๊ฒ ๊ฐ๊ฐ 0, 1, 2๋ผ๋ ์ ์(file table์ ์ธ๋ฑ์ค)๊ฐ ํ ๋น๋ฉ๋๋ค.
shim์ด ์ปจํ ์ด๋์ ์์ ํ๋ก์ธ์๋ก์ ์ํํ๋ ์ฃผ์ ์ฑ ์์ ์๋์ ๊ฐ์ต๋๋ค.
๐๐ป daemon์ด ์ฌ์์๋ ๋, ํ์ดํ๊ฐ ๋ซํ๋ ๋ฑ์ ์ด์ ๋๋ฌธ์ container๊ฐ ์ข ๋ฃ๋์ง ์๋๋ก STDIN๊ณผ STDOUT ์คํธ๋ฆผ์ ์ด๋ฆฐ ์ํ๋ก ์ ์งํฉ๋๋ค.
๐๐ป daemon์๊ฒ container์ ์ข ๋ฃ ์ํ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
์ด๋ ๊ฒ Docker Engine์ ๋ค๋ฃจ๋ ์ฒซ ๋ฒ์งธ ํฌ์คํ ์ ๋ง์น๊ฒ ์ต๋๋ค.
ํผ๋๋ฐฑ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ค์ ํฌ์คํ ์ namespace, cgroup ์ ํตํด ์ปจํ ์ด๋ ๊ฐ์ํ๊ฐ ์คํ๋ ์ ์์๋ ๋ด์ฉ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
- O'Reilly - "Docker Deep Dive, The Docker Engine"
- O'Reilly - "Docker: Up & Running, 2nd Edition"
'BACKEND > Docker & Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Docker Swarm, ์ ๋๋ก ์ดํดํ๊ธฐ - Swarm & Service (2) | 2023.10.30 |
---|---|
Docker, ์ ๋๋ก ์ฌ์ฉํ๊ธฐ - Commands (2) | 2023.10.17 |
Docker Network, ์ ๋๋ก ์ดํดํ๊ธฐ (2) (1) | 2022.02.15 |
Docker Network, ์ ๋๋ก ์ดํดํ๊ธฐ (1) (3) | 2022.02.09 |
Docker Engine, ์ ๋๋ก ์ดํดํ๊ธฐ (2) (0) | 2022.01.20 |
Backend Software Engineer
๐๐ฎ๐ง ยท ๐๐ฎ๐๐ค๐ฃ๐๐จ๐ช๐ฃ ๐๐๐ง๐