Hacker News인프라 · 데브옵스

직접 만들며 알게 된 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로 실행되며, 이는 컨테이너 보안 문제를 야기한다.
  • 루트 없는 컨테이너 런타임은 같은 기능을 제공하기 위해 사용자 공간에서 전체 네트워킹 스택을 다시 구현해야 한다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗