Docker는 생각보다 훨씬 이상하다: 직접 컨테이너 런타임을 만들며 알게 된 것들

Docker Is Weird

직접 컨테이너 런타임을 만들면서 알게 된 Docker의 의외의 사실들. 컨테이너는 가상머신이 아니라 특수 제약이 걸린 프로세스일 뿐이고, 리눅스 커널 기능 다섯 개가 겹쳐진 것이다. 이미지는 그저 폴더이며, Go로 작성된 runc는 멀티스레드 런타임과 fork 부재 때문에 C 모듈과 /proc/self/exe 트릭을 쓴다. Docker가 root를 요구하는 이유도 짚는다.

컨테이너는 실제로 리눅스 커널 기능 다섯 개가 트렌치코트를 입고 있는 것에 불과하다.
  1. shykes

    안녕하세요, 저는 Docker의 창시자이고 이 글을 우연히 보게 되었습니다. 다른 엔지니어들이 시스템을 어떻게 설계했는지 고민하는 모습을 보는 건 항상 재미있습니다. 저는 수년간 Docker 개발에 참여하지 않았지만, 옛 추억을 떠올리게 하는 즐거운 시간이네요.

    질문이 있으시면 기꺼이 답변해 드리겠습니다.

  2. jlhawn

    > Docker의 컨테이너 런타임인 runc는 Go로 작성되었습니다.

    저는 2014년부터 2019년까지 Docker에서 일했습니다. 가장 중요한 부분은 실제로 C로 작성되었습니다.

    [여기에 "Go로 작성되었다"는 말이 기술적으로 얼마나 부정확한지에 너무 집착한 나머지 그 핵을 설명하는 댓글을 통째로 썼습니다. 그러고 나서 글의 나머지 부분을 읽으러 돌아갔더니, 바로 다음 문단이 나름대로 그걸 설명하고 있더군요! 이걸 교훈 삼아, 글에 대해 글을 올리기 전에 항상 끝까지 읽어야겠습니다.]

  3. vbezhenar

    제 생각에 Docker를 독특하게 만든 것은 컨테이너 기술 자체가 아니었습니다. 저는 20년 전에 chroot를 썼고 그것은 아주 잘 작동했습니다. 네, 네트워크 네임스페이스도 없었고 프로세스 네임스페이스도 없었지만, 그게 그렇게 중요하다고 생각하지도 않습니다.

    Docker를 독특하게 만든 것은 다음 세 가지였습니다:

    1. Dockerfile 개념. 이미지를 레이어별로 빌드하기. 레이어 캐싱. 모든 것을 단일 파일에 담기. 이를 통해 이미지를 빠르게 반복 개선할 수 있었습니다. 효율적인 CI 빌드를 구현할 수 있게 해주었습니다.

    2. Docker 네트워크 레지스트리 개념. 범용 이미지를 서버에 올리고 전 세계와 공유하기.

    3. 모멘텀. 전통적으로 배포하기 복잡했던 많은 소프트웨어가 갑자기 Docker 서버에 등장했습니다. 작은 docker-compose로 워드프레스 웹사이트를 배포할 수 있었을 때 얼마나 감탄했는지 기억합니다. 그리고 그것이 얼마나 격리되어 있었는지도요. 호스트에서 그 흔적을 전부 지울 수 있었습니다. 저는 항상 호스트에 이것저것 설치하는 것이 불안했는데 Docker가 그 불안을 해결해 주었습니다.

  4. slowin

    저는 대부분의 경우 Podman을 선호하지만, Docker는 놀라웠고/놀랍고, 이른바 "트렌치코트를 입은 5가지 리눅스 커널 기능" 위에 훌륭한 DX를 얹어 놓았습니다. 그게 바로 셀링 포인트입니다. 매우 가볍고, 이미 존재하던(혹은 개발 중이던) OS 기능을 최대한 활용하지만 사용하기 어색하고 엄청난 전문 지식이 필요했던 것들을 잘 다뤄줍니다.

  5. suprjami

    복잡한 것을 구성 요소를 배우며 신비를 벗겨내는 사람을 보는 건 항상 반갑습니다.

    이걸 알고 나면, 루트리스 Podman의 fork-exec 방식 컨테이너 시작이 더 합리적이라고 느낄 수 있을 겁니다. 저는 확실히 그렇습니다. 루트도, 데몬도, 소켓도 없습니다.

    컨테이너를 만들기 위해 함께 작동하는 리눅스 커널 네임스페이스에 대해 더 알고 싶다면, 이 LWN 시리즈가 정말 좋습니다: https://lwn.net/Articles/531114/

  6. j16sdiz

    글의 모든 문장이 저에게 "그게 뭐가 이상한데?"라고 묻게 만듭니다.

    그 목록의 모든 것은 수년에 걸쳐 사물이 어떻게 진화하는지 알면 자연스럽게 느껴집니다. 어쩌면 저만 나이가 들고 호기심이 줄어든 것일지도 모르겠네요.

  7. tyingq

    bocker[1]를 살펴보세요. 기술적인 사람들에게는 글에서 말하는 요점을 아주 명확하게 전달해 줍니다.

    [1] "약 100줄의 bash로 구현한 Docker"

    https://github.com/p8952/bocker

  8. sreekanth850

    저는 Reddit에서의 카고 컬트를 보고 나서 Docker를 싫어하기 시작했습니다. 누군가 리눅스에 앱을 배포하는 방법을 물으면, 항상 적어도 하나는 "그냥 Docker 쓰세요"라는 댓글이 달립니다. 결국 우리는 Docker를 전혀 쓰지 않는 전체 스택용 자체 배포 자동화 도구를 만들게 되었습니다.

이 날의 다른 글

2026-10-23