Docker Engine, ์ ๋๋ก ์ดํดํ๊ธฐ (2)
๐ 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, ์ ๋๋ก ์ดํดํ๊ธฐ (1) ์ ์ด์ด์,
Container ๊ธฐ์ ์ด ๊ฐ๋ฅํ ์ด์ ์ธ ๋ฆฌ๋ ์ค ์ปค๋์ namespaces, cgroups์ ๋ํด ๋ค๋ฃจ๋ ค๊ณ ํฉ๋๋ค.
ํด๋น ํฌ์คํ ์ ๋ชฉ์ ์ dockerEngine์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋์์๋ฆฌ ๋ฑ์ ์ต๋ํ ์์ธํ ๋ค๋ฃจ๋๋ฐ ์์ต๋๋ค.
์ด ๊ธ์ ์ฝ๋ ๋ ์๊ฐ Docker image, container ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ดํดํ๋ค๋ ๊ฐ์ ํ์ ์์ฑํฉ๋๋ค.
ํด๋น ํฌ์คํ
์ ๋ชจ๋ ๊ทธ๋ฆผ์ ์ง์ ๊ทธ๋ฆฐ ๊ฒ์ผ๋ก, ์ฌ์ฉ์ ์ถ์ฒ ํ์ ๋ถํ๋๋ฆฝ๋๋ค ๐๐ป.
----------------- INDEX -----------------
History
Docker Engine
[ 2๋ถ ]
Namespace
cgroups
----------------------------------------------
์ง๋ ํฌ์คํ ์์ LXC๋ฅผ ์ฌ์ฉํ๋ ์์ ์ Docker์์ Linux ์์กด์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด libcontainer๋ฅผ ์ ์ํ๋ค๊ณ ํ์ต๋๋ค.
์ด๋ก ์ธํด Docker๊ฐ LXC๋ ์ธ๋ถ ํจํค์ง์ ์์กดํ์ง ์๊ณ ,
libcontainer๋ฅผ ํตํด ์ปค๋์ container API๋ค์ ์ง์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ฆ, libcontainer๊ฐ ์ด์ ๋ถํฐ ์์๋ณผ ์ปค๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ์์คํ ์ ๋ฆฌ์์ค๋ฅผ namespaces, control groups, capabilities, apparmor profiles, network interfaces, firewalling rules ๋ฑ ์ ์กฐ์ํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ ๋๋ค.
์๋์์ ๊ฐ๋ ์ ํ์ธํด๋ณธ ํ ๊ทธ๋ฆผ์ ๋ค์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๋์ค๊ฑฐ์์.
๊ทธ๋ผ ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ namespaces
Docker๋ฅผ ์ฌ์ฉํ๋ฉด์ Process๋ Network ๋ฑ์ด ์ด๋ป๊ฒ ๊ฐ ์ปจํ ์ด๋๋ง๋ค ๋ฐ๋ก ๊ด๋ฆฌ๋๋์ง ๊ถ๊ธํ์ง ์์ผ์ จ๋์?
VM์์๋ ๊ฐ ๊ฒ์คํธ ๋จธ์ ๋ณ๋ก ๋ ๋ฆฝ์ ์ธ ๊ณต๊ฐ์ ์ ๊ณตํ๊ณ ์๋ก๊ฐ ์ถฉ๋ํ์ง ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ต๋๋ค. Docker์์๋ namespaces๋ฅผ ํตํด ์ด๋ฌํ ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ์ ๊ณตํฉ๋๋ค.
namespaces์ nested process tree๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ฉฐ,
์ด ๋ง์ ๊ฐ ํ๋ก์ธ์ค๊ฐ ์์คํ ๋ฆฌ์์ค(process IDs, hostnames, user IDs, network access, interprocess communication, filesystem ๋ฑ)์ ํจ๊ป ๊ณ ์ ํ๊ฒ ๋ถ๋ฆฌ๋ ํ๋ก์ธ์ค ํธ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ถ๋ฆฌ๋ process tree๋ ๋ค๋ฅธ process tree์์ ํ์ธinspectํ๊ฑฐ๋ ์ญ์ kill ํ ์ ์์ต๋๋ค.
PID namespace๋ฅผ ์์๋ณด๋ฉฐ ์ดํด๋ฅผ ๋ํด๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋ ์์คํ ์ ๋ถํ ์ PID 1 ํ๋ก์ธ์ค๊ฐ ์์๋๊ณ ๊ทธ ์๋์ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ด ์์๋ฉ๋๋ค.
ํ๋ก์ธ์ค ํธ๋ฆฌ ๊ตฌ์กฐ
์ด๋, PID namespace๋ก ๊ฒฉ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด
ํ์ namespace์ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค์ ์กด์ฌ๋ฅผ ์ ์ ์๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง ์์ namespace์ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ธ ๊ฒ์ฒ๋ผ ํ์ namespace์ ํ๋ก์ธ์ค๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ์ด, PID namespace ๊ฒฉ๋ฆฌ๋ฅผ ํตํด
์๋ก ์์ฑ๋ ํ์ ํ๋ก์ธ์ค๋ ํ๋์ ์์คํ ์ธ ๊ฒ์ฒ๋ผ pid๋ฅผ 1๋ก ๊ฐ์ ํ์ฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ํตํด namespaces๋ฅผ ํตํ ๊ฒฉ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๊ณ ,
์ด๋ค namespaces๊ฐ ์ง์๋๋์ง ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
โ๏ธ namespace isolation
System call - clone() ์ ์ ์๋ flags๋ฅผ ์ง์ ํ์ฌ ๋ค์ํ namespace๋ฅผ ๊ฐ๋ ํ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <sched.h>
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
์ธ ๋ฒ์งธ ์ธ์๋ก flags๋ฅผ ์ง์ ํ ์ ์๋๋ฐ์.
์ด๋ค flags๊ฐ ์๊ณ , ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ์ง๋์ง ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
pid_t = pid = clone(cb, *stack,
CLONE_NEWPID | // create new PID namespace
CLONE_NEWNET | // create new network namespace
CLONE_NEWNS | // create new mount namespace
CLONE_NEWUTS | // create new UTS namespace
CLONE_NEWIPC | // create new IPC namespace
SIGCLD,
...);
flags๋ค์ ์ง์ ๋๋ ์ต์ ์ ์๋์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
PID namespace
for process isolation.
PID (Process ID)๋ฅผ ๋ถํ ํฉ๋๋ค.
NET namespace
for managing network interfaces.
Network interface, iptables ๋ฑ network ๋ฆฌ์์ค์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ถํ ํฉ๋๋ค.
IPC namespace
for managing access to IPC resources.
Inter-process communication - ํ๋ก์ธ์ค๊ฐ ํต์ ์ ๊ฒฉ๋ฆฌํฉ๋๋ค.
MNT namespace
for managing filesystem mount points.
file system์ mount ์ง์ ์ ๋ถํ ํ์ฌ ๊ฒฉ๋ฆฌํฉ๋๋ค.
UTS namespace
for isolating kernel and version identifiers.
hostname, domainname ์ ๋ณ๊ฒฝํ๊ณ ๋ถํ ํฉ๋๋ค.
์์ธํ ๋งํ์๋ฉด, Linux system call ์ค ํ๋์ธ uname์์ utsname ๋ผ๋ struct์ ์ ์๋ ์๋ณ์ ์ค nodename์ isolateํฉ๋๋ค.
namespace๋ก ์์คํ ์์ ์ปจํ ์ด๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์์ ์์๋ณด์๋๋ฐ์,
๋ ํ๋ ๊ถ๊ธ์ฆ์ด ์๊น๋๋ค.
๋ถ๋ฆฌ๋ ํ๊ฒฝ์ ์ด๋ป๊ฒ ์ ๋ขฐ์ฑ์๊ฒ ์ฌ์ฉํ๊ณ , ๋ถ๋ฆฌ๋ ์์ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ ์ ์์์์ง ๊ถ๊ธํ์ง ์์ผ์ ๊ฐ์ ?
ํธ๊ธฐ์ฌ ๊ฐ์ ์ค์ธ๊ฐ์..?
๋ฐ๊ฐ์ ์ ์ธ ์ด ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์, cgroups์ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค ~
๐ฅ cgroups
cgroups์ control group์ ์๋ฏธํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ธ์ค ๊ทธ๋ฃน๋ณ๋ก ์์คํ ์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฆฌ์์ค(hardware resources)๋ฅผ ์ ํ์ด๋ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ ํํ ์ ์๋ ๋ฆฌ์์ค์๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
- CPU
- Memory
- Desk I/O
- Network
- Device
Kernel์์ cgroup์ ์ ์ดํ ๋, ๋ฐ๋ก system call์ ์ ๊ณตํ์ง ์๊ณ
cgroupfs๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ ์ฌ ํ์ผ ์์คํ pseudo-filesystem์ ํตํด ์ ๊ณต๋ฉ๋๋ค.
ํ์ผ์ ํตํด์ ์ ํ์ ํ๋ค๋ ๊ฒ ๋ฌด์จ๋ง์ผ๊น์?
systemd๋ /sys/fs/cgroup ์๋์ cgroupfs๋ค์ ๋ง์ดํธํฉ๋๋ค.
๊ทธ๋์ mount ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ดํธ๋์ด ์๋ cgroupfs๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
# mount
...
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
...
์์ mount๋ ํ์ผ๋ค์ ํ์ธํด๋ณด๋ฉด ์ ์ ์๋ฏ์ด, cgroup์ ์ ์ดํ๋ ๋ฆฌ์์ค๋ฅผ ํ์ ๋ณ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๊ฐ๊ฐ์ ํ์ ์ ๋ง์ถฐ ๋ฐ๋ก mountํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด์ฃ .
์ด๋ ๊ฒ ํน์ํ ํํ์ ํ์ผ์์คํ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ง๊ธฐ ๋๋ฌธ์,
cgroupfs์ผ๋ก cgroup์ ์ ์ดํ ๋๋ mkdir, rmdir, echo์ ๊ฐ์ ๋ช ๋ น์ด๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, cgroup์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ cgroupfs์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
cgroupfs ๋ด ๋๋ ํฐ๋ฆฌ๋ ํ๋์ cgroup์ด๋ฉฐ, cgroup์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ์ฒ๋ผ Tree ํํ๋ฅผ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ Docker Engine์ ๋ค๋ฃจ๋ ๋ ๋ฒ์งธ ํฌ์คํ ์ ๋ง์น๊ฒ ์ต๋๋ค.
์ปจํ ์ด๋ ๊ธฐ์ ์ ์ด๋ ๊ฒ namespace, cgroup ๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ์ ์์์ต๋๋ค.
๊ถ๊ธ์ฆ์ด ํ๋ฆฌ๋ฉด์ ๋ญ๊ฐ ๊ฐ์ฆ์ด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์์ ๐๐ป
๋ค์ ํฌ์คํ ์ network, volume์ ๋ํ ๊น์ ๋ด์ฉ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๋ถ์กฑํ ๋ด์ฉ์ด๋, ์ฒจ์ธ, ํผ๋๋ฐฑ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ์ ๋ง์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
docking a docker container part 2