직접 만들며 알게 된 Docker의 이상한 설계들
원제 Docker is weird
183 포인트댓글 90
Key Point
직접 컨테이너 런타임을 만들면서 발견한 Docker의 설계 결정들을 알면, 우리가 매일 쓰는 도구가 왜 이렇게 복잡한지, 그리고 그 복잡성이 어디서 비롯됐는지 이해할 수 있다.
핵심 요약
- 컨테이너는 VM과 달리 특별한 제한이 적용된 일반 프로세스이며, /proc에서 찾을 수 있다.
- 컨테이너 기능은 단일 리눅스 기능이 아니라 Namespaces, cgroups, 네트워킹 등 5개의 커널 기능을 조합한 것이다.
- 이미지는 폴더일 뿐이며 Docker는 chroot나 pivot_root를 사용해 새 루트 디렉터리로 설정한다.
- Go로 작성된 runc(Docker의 컨테이너 런타임)는 Go의 멀티스레드 특성 때문에 단일 스레드 환경에서만 작동해야 하는 Linux syscall들을 위해 별도의 C 모듈을 실행한다.
- Go는 fork() 함수가 없어서, runc는 /proc/self/exe를 특수한 명령줄 인자로 실행해 fork를 근사화한다.
- 많은 리눅스 커널 API가 root 권한을 요구하기 때문에 Docker 데몬은 보통 root로 실행되며, 이는 컨테이너 보안 문제를 야기한다.
- 루트 없는 컨테이너 런타임은 같은 기능을 제공하기 위해 사용자 공간에서 전체 네트워킹 스택을 다시 구현해야 한다.