컨테이너는 앱과 라이브러리를 패키징하지만 커널은 호스트와 공유한다.
네임스페이스가 보이는 세계를 나누고, 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 같은 보강
방식을 검토한다.