리눅스와 컨테이너의 이해

hyuckhoon.ko·2024년 2월 5일
0

리눅스

불편한 진실

Q. 도커와 컨테이너를 설명하기 어려워 하는 이유는 무엇인가요?
A. 리눅스를 잘 모르기 때문입니다.
Q. (...)

리눅스

리눅스는 C언어로 만들어진 프로그램이자 OS이다.
애플리케이션 관리와 HW 자원 관리를 한다.

커널 버전 확인

>> uname -r
5.3.0

boot 디렉터리 확인

>> ls /boot
...
vmlinuz-5.3.0

(참고)
vm + linuz
: 가상머신 환경에서, 압축된 형태(z)인 linuz가 있다.
압축되지 않으면 linux다.

프로세스 관리

init 프로세스 확인

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 프로세스 톺아보기

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 디렉터리를 독립적으로 관리한다.
즉, 시스템 자원들의 독립성을 보장한다.

HW 자원관리

리눅스 커널의 cgroup을 통해 HW 자원을 독립적으로 관리한다.
여기서 하드웨어 자원은 CPU, memory, network, disk 등을 총칭한다.

리눅스의 일반적인 프로세스들끼리 포트번호는 중복되지 않으며 중복되어선 안 된다.

하지만 컨테이너 환경이라면 상황이 다르다.
80포트를 사용하는 무수히 많은 프로세스들을 생성할 수 있다.
각 컨테이너는 독립(격리)된 프로세스로써, cgroup은 고유한 환경을 사용할 수 있게 도와준다.

+) 흥미로운점
리눅스 호스트 입장에서 봤을 땐, 특정 프로세스가 포트번호를 5000번 사용하고 있다.
하지만 그 프로세스에서 파생된 컨테이너는 내부적으로 80포트를 사용할 수 있다. 프로세스 관점에서 이 컨테이너는 80포트를 사용하고 있다고 본다.

이러한 리눅스 커널의 기능(namespace, cgroup) 덕분에 서로 다른 프로세스끼리와의 충돌 문제, 개발/배포 등의 상황에서 발생하는 여러 충돌 문제에서 해방된다.

도커, 쿠버네티스 가볍게 살펴보기

도커

수많은 프로세스들 중 컨테이너화하여 독립(격리)된 프로세스를 컨테이너라고 했다.

이런 컨테이너를 쉽고 편리하게 운용/관리하게 하는 것이 도커(docker)다.
소량의 컨테이너까지는 도커만으로 관리할 수 있다.

쿠버네티스

관리해야할 컨테이너가 수십, 수백, 수천개, 수만개, 수억개라면 사람의 인지부하를 넘어선 스케일이다.

쿠버네티스는 다중 서버의 다수의 컨테이너 관리를 쉽고 편하게 도와주고, 서버 운용 관점 측면에서도 편의성을 제공하는 최적화된 기술이다.

컨테이너 타입

1) 애플리케이션 컨테이너

우리에게 익숙한 컨테이너다.
Nginx 컨테이너, MySQL 컨테이너, ...
보통 1앱 1컨테이너화하여 운영하는게 일반적이다.(AWS, Azure, GCP, 등의 환경에)

cf) 하지만 프로세스는 여러 개가 될 수 있다. 컨테이너 하나에 여러 개의 프로세스가 생성될 수 있다.
간단한 예를 보자.

호스트 상에서 pid 5348인 프로세스가 있다. 해당 프로세스는 nginx 컨테이너라고 하자.
nginx 컨테이너(프로세스) 입장에서 자신의 프로세스 ID는 1이다.(PID :1)

nginx 컨테이너에서 bash를 실행하면 어떨까?
bash는 nginx의 자식 프로세스로써 생성된다.

2) 머신 컨테이너

ex) LXC
추후 자세히 다룰 예정
가상머신을 완전히 대체하기 위한 목표.


정리

컨테이너는 프로세스다.

리눅스 커널의 namespace, cgroup을 통해 시스템 자원과 HW자원의 독립(격리)를 보장받는다.

  • namespce : "무엇을 볼 수있는지(see) 제한"
  • cgroup : "얼마나 사용(use) 할 수있는지 제한"

오늘의 리눅스 명령어

쉘 PID

>> 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

0개의 댓글