Q. 도커와 컨테이너를 설명하기 어려워 하는 이유는 무엇인가요?
A. 리눅스를 잘 모르기 때문입니다.
Q. (...)
리눅스는 C언어로 만들어진 프로그램이자 OS이다.
애플리케이션 관리와 HW 자원 관리를 한다.
>> uname -r
5.3.0
>> ls /boot
...
vmlinuz-5.3.0
(참고)
vm + linuz
: 가상머신 환경에서, 압축된 형태(z)인 linuz가 있다.
압축되지 않으면 linux다.
init
프로세스는 PID가 1임을 확인할 수 있다.
>> ps -ef | head -2
UID PID PPID C STIME TTY TIME CMD
root 1 0 6 12:26 ? 00:02:03 /sbin/init maybe-ubiquity
init
프로세스의 실제 바이너리 명칭은 systemd*
다.
>> ll /sbin/init
lrwxrwxrwx 1 root root 20 2019-09-05 03:59:51 /sbin/init -> /lib/systemd/systemd*
부모 프로세스부터 시작해서 트리 구조로 프로세스들이 연결된다.(PID, PPID)
>> ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 5 12:26 ? 00:02:25 /sbin/init maybe-ubiquity
root 2 0 0 12:26 ? 00:00:00 [kthreadd]
root 3 2 0 12:26 ? 00:00:00 [rcu_gp]
root 4 2 0 12:26 ? 00:00:00 [rcu_par_gp]
root 5 2 0 12:26 ? 00:00:00 [kworker/0:0-eve]
root 6 2 0 12:26 ? 00:00:00 [kworker/0:0H-kb]
root 8 2 0 12:26 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 12:26 ? 00:00:02 [ksoftirqd/0]
root 10 2 0 12:26 ? 00:00:10 [rcu_sched]
root 11 2 0 12:26 ? 00:00:00 [migration/0]
root 12 2 0 12:26 ? 00:00:00 [cpuhp/0]
root 13 2 0 12:26 ? 00:00:00 [cpuhp/1]
root 14 2 0 12:26 ? 00:00:00 [migration/1]
root 15 2 0 12:26 ? 00:00:04 [ksoftirqd/1]
root 17 2 0 12:26 ? 00:00:00 [kworker/1:0H]
root 18 2 0 12:26 ? 00:00:00 [cpuhp/2]
root 19 2 0 12:26 ? 00:00:00 [migration/2]
root 20 2 0 12:26 ? 00:00:05 [ksoftirqd/2]
root 22 2 0 12:26 ? 00:00:00 [kworker/2:0H]
root 23 2 0 12:26 ? 00:00:00 [cpuhp/3]
root 24 2 0 12:26 ? 00:00:00 [migration/3]
root 25 2 1 12:26 ? 00:00:45 [ksoftirqd/3]
root 26 2 0 12:26 ? 00:00:00 [kworker/3:0-eve]
root 27 2 0 12:26 ? 00:00:00 [kworker/3:0H-kb]
root 28 2 0 12:26 ? 00:00:00 [kdevtmpfs]
root 29 2 0 12:26 ? 00:00:00 [netns]
root 30 2 0 12:26 ? 00:00:00 [kauditd]
root 32 2 0 12:26 ? 00:00:00 [oom_reaper]
root 33 2 0 12:26 ? 00:00:00 [writeback]
root 34 2 0 12:26 ? 00:00:00 [kcompactd0]
root 82 2 0 12:26 ? 00:00:00 [kblockd]
root 83 2 0 12:26 ? 00:00:00 [ata_sff]
root 84 2 0 12:26 ? 00:00:00 [md]
root 86 2 0 12:26 ? 00:00:00 [edac-poller]
root 87 2 0 12:26 ? 00:00:00 [rpciod]
root 88 2 0 12:26 ? 00:00:00 [kworker/u9:0]
root 89 2 0 12:26 ? 00:00:00 [xprtiod]
root 90 2 0 12:26 ? 00:00:00 [cfg80211]
root 91 2 0 12:26 ? 00:00:00 [kswapd0]
root 92 2 0 12:26 ? 00:00:00 [nfsiod]
root 95 2 0 12:26 ? 00:00:00 [acpi_thermal_pm
격리된 리눅스 환경을 보장받는 프로세스
"Container is Linux"라고도 말한다.
컨테이너는 프로세스다.
모든 프로세스가 컨테이너는 아니다.
모든 프로세스가 격리된 독립성을 보장받는 것은 아니기 때문이다.
리눅스 커널을 통해 HW자원과 시스템 자원의 독립성을 보장하기 때문이다.
리눅스 커널의 namespace
기능을 통해 프로세스별 PID, 포트, rootfs 등을 독립적으로 관리한다.
루트 디렉터리들을 확인해보자.
>> ls /
bin dev initrd.img lib32 media proc sbin sys var
boot etc initrd.img.old lib64 mnt root snap tmp vmlinuz
cdrom home lib lost+found opt run srv usr vmlinuz.old
예를들어,프로세스별 etc 디렉터리를 독립적으로 관리한다.
즉, 시스템 자원들의 독립성을 보장한다.
리눅스 커널의 cgroup
을 통해 HW 자원을 독립적으로 관리한다.
여기서 하드웨어 자원은 CPU, memory, network, disk 등을 총칭한다.
리눅스의 일반적인 프로세스들끼리 포트번호는 중복되지 않으며 중복되어선 안 된다.
하지만 컨테이너 환경이라면 상황이 다르다.
80포트를 사용하는 무수히 많은 프로세스들을 생성할 수 있다.
각 컨테이너는 독립(격리)된 프로세스로써, cgroup은 고유한 환경을 사용할 수 있게 도와준다.
+) 흥미로운점
리눅스 호스트 입장에서 봤을 땐, 특정 프로세스가 포트번호를 5000번 사용하고 있다.
하지만 그 프로세스에서 파생된 컨테이너는 내부적으로 80포트를 사용할 수 있다. 프로세스 관점에서 이 컨테이너는 80포트를 사용하고 있다고 본다.
이러한 리눅스 커널의 기능(namespace, cgroup) 덕분에 서로 다른 프로세스끼리와의 충돌 문제, 개발/배포 등의 상황에서 발생하는 여러 충돌 문제에서 해방된다.
수많은 프로세스들 중 컨테이너화하여 독립(격리)된 프로세스를 컨테이너라고 했다.
이런 컨테이너를 쉽고 편리하게 운용/관리하게 하는 것이 도커(docker)다.
소량의 컨테이너까지는 도커만으로 관리할 수 있다.
관리해야할 컨테이너가 수십, 수백, 수천개, 수만개, 수억개라면 사람의 인지부하를 넘어선 스케일이다.
쿠버네티스는 다중 서버의 다수의 컨테이너 관리를 쉽고 편하게 도와주고, 서버 운용 관점 측면에서도 편의성을 제공하는 최적화된 기술이다.
우리에게 익숙한 컨테이너다.
Nginx 컨테이너, MySQL 컨테이너, ...
보통 1앱 1컨테이너화하여 운영하는게 일반적이다.(AWS, Azure, GCP, 등의 환경에)
cf) 하지만 프로세스는 여러 개가 될 수 있다. 컨테이너 하나에 여러 개의 프로세스가 생성될 수 있다.
간단한 예를 보자.
호스트 상에서 pid 5348인 프로세스가 있다. 해당 프로세스는 nginx 컨테이너라고 하자.
nginx 컨테이너(프로세스) 입장에서 자신의 프로세스 ID는 1이다.(PID :1)
nginx 컨테이너에서 bash를 실행하면 어떨까?
bash는 nginx의 자식 프로세스로써 생성된다.
ex) LXC
추후 자세히 다룰 예정
가상머신을 완전히 대체하기 위한 목표.
>> echo $$
1242
bash라는 이름의 쉘 프로그램임을 확인할 수 있다.
ps -ef | grep 1242
reallin+ 1242 1241 0 12:32 pts/0 00:00:02 -bash
reallin+ 1514 1242 0 13:41 pts/0 00:00:00 ps -ef
reallin+ 1515 1242 0 13:41 pts/0 00:00:00 grep --color=auto 1242