Docker의 숨겨진 작동 원리 5가지

원제: Docker is weird

왜 중요한가

컨테이너 기술의 실제 구조를 이해하면 보안 설계와 운영 최적화에 직접적인 영향을 미친다.

한 개발자가 직접 컨테이너 런타임을 제작하는 과정에서 Docker의 내부 구조를 분석했다. 컨테이너는 실제로 Linux 커널 5가지 기능의 조합이며, 이미지는 단순한 폴더이고, Docker 데몬은 기본적으로 root 권한으로 실행된다는 사실이 밝혀졌다.

개발자 블로그 Code and Cake에서 직접 컨테이너 런타임을 구현하다 발견한 Docker의 특이한 동작 방식이 화제다.

첫째, 컨테이너는 VM과 달리 실제로 독립된 환경이 아니다. Linux 커널 위에서 실행되는 일반 프로세스이며, /proc 디렉터리에서도 확인 가능하다. 둘째, '컨테이너'라는 단일 Linux 기능은 존재하지 않는다. Namespace(가시성 격리), cgroups(자원 제한), 네트워크 격리 등 5가지 커널 기능이 조합된 결과다.

셋째, Docker 이미지는 실상 폴더다. Docker는 해당 폴더를 특정 경로에 배치한 뒤 chroot 또는 pivot_root를 호출해 컨테이너 프로세스의 루트 디렉터리로 지정한다. `docker run -it --rm ubuntu /bin/bash` 명령 하나가 이미지 다운로드, 배치, 경로 변경, 실행의 순서로 처리된다.

넷째, Docker의 공식 런타임인 runc는 Go로 작성됐는데, Go의 멀티스레드 런타임은 단일 스레드가 필요한 Linux 시스템 콜과 충돌한다. 이를 해결하기 위해 runc는 Go 런타임 초기화 이전에 실행되는 C 모듈을 포함하며, fork() 대신 /proc/self/exe를 exec하는 방식으로 자식 프로세스를 흉내 낸다.

다섯째, Docker 데몬은 기본적으로 root 권한으로 실행된다. rootless 모드로 전환하면 네트워킹 스택 전체를 사용자 공간에서 재구현해야 하므로 동일한 기능을 제공하기 어렵다.

출처

codeandcake.dev — 원문 읽기 →