Linux Container

컨테이너는 같은 커널 위에서 프로세스의 세계를 나눈다

컨테이너는 앱과 라이브러리를 패키징하지만 커널은 호스트와 공유한다. 네임스페이스가 보이는 세계를 나누고, cgroups가 자원 사용량을 제어한다.

namespace는 PID, NET, MNT, UTS, IPC, USER 같은 뷰를 격리한다
cgroup은 프로세스 그룹의 CPU, 메모리, I/O, PID 사용을 제한한다
같은 커널을 공유하므로 커널 취약점에는 함께 노출될 수 있다
Container A
web processPID 1처럼 보임
rootfs/app, /usr, /etc
Container B
worker process별도 포트와 라우팅 테이블
rootfs다른 마운트 뷰
Container C
job process사용자 ID 매핑 가능
rootfs이미지 레이어 기반
Namespaces

보이는 세계를 분리

PID: 컨테이너 안에서 PID 1부터 시작
NET: 독립 IP, 포트, 라우팅 테이블
MNT/UTS/IPC/USER: 파일 시스템, hostname, IPC, UID/GID 뷰
+
cgroups

자원 사용을 제어

memory.max: 메모리 상한
cpu.max: CPU 시간 분배
pids.max: 생성 가능한 프로세스 수
RuntimeDocker API에서 containerd, runc/OCI runtime으로 이어지며 이미지 rootfs와 커널 기능을 묶어 프로세스를 시작한다.
Securityseccomp, AppArmor/SELinux, capabilities, user namespace로 공격 면을 줄인다.
Boundary커널은 공유하므로 높은 격리가 필요하면 VM, Kata, gVisor 같은 보강 방식을 검토한다.