Docker — это странно: энтузиаст написал собственный контейнерный рантайм и вот что выяснил

Docker is weird

Автор ради удовольствия решил написать собственный контейнерный рантайм и обнаружил, что Docker устроен куда страннее, чем кажется. Контейнеры — не виртуальные машины, а обычные процессы с ограничениями; образы — просто папки, к которым применяют chroot или pivot_root. Рантайм runc написан на Go, и из-за многопоточности и отсутствия fork ему приходится идти на хитрости. А ещё Docker обычно требует root.

Контейнеры — это на самом деле 5 разных функций ядра Linux в плаще.
  1. shykes

    Привет, я создатель Docker и наткнулся на этот пост. Всегда забавно видеть, как другие инженеры размышляют о том, как ты спроектировал систему. Я много лет не участвовал в разработке Docker, но это приятное путешествие по воспоминаниям.

    Буду рад ответить на любые ваши вопросы.

  2. jlhawn

    > Контейнерный рантайм Docker, runc, написан на Go.

    Я работал в Docker с 2014 по 2019 год. Самая важная часть на самом деле написана на C.

    [Я написал здесь целый комментарий, чтобы объяснить, как работает этот хак, потому что слишком зациклился на том, насколько технически неверно утверждение «написан на Go». Потом я вернулся к чтению остальной статьи и увидел, что абзац сразу после этого вроде бы объясняет это по-своему! Пусть это будет уроком: всегда дочитывай статью до конца, прежде чем писать о ней.]

  3. vbezhenar

    На мой взгляд, Docker сделало уникальным не сама контейнерная технология. Я использовал chroot 20 лет назад, и это прекрасно работало. Да, без сетевых пространств имён; без пространств имён процессов, но я даже не думаю, что они настолько важны.

    Уникальным Docker сделали вот эти вещи:

    1. Концепция Dockerfile. Сборка образов слой за слоем. Кэширование слоёв. Всё в одном файле. Это позволило быстро итерировать образ. Это позволило эффективно реализовать CI-сборки.

    2. Концепция сетевого реестра Docker. Размещение универсальных образов на сервере и обмен ими со всем миром.

    3. Импульс. Множество программ, которые традиционно было сложно развернуть, внезапно появились в docker-серверах. Помню, как я был очарован, когда смог развернуть сайт на wordpress с помощью крошечного docker-compose. И насколько это было изолировано. Я мог просто удалить все следы с хоста. Я всегда чувствовал себя неуютно, устанавливая разные вещи на свой хост, и docker просто решил эту проблему.

  4. slowin

    Обычно я предпочитаю Podman, но Docker — это/был потрясающим, и отличный DX построен поверх так называемых «5 разных функций ядра Linux в плаще». В этом и есть фишка: он суперлёгкий и полностью использует возможности ОС, которые уже были (или разрабатывались), но были неудобны в использовании и требовали тонны специализированных знаний.

  5. suprjami

    Всегда приятно видеть, как кто-то демистифицирует сложную вещь, изучая строительные блоки, из которых она состоит.

    Зная это, вы можете найти метод fork-exec в rootless Podman для запуска контейнеров более разумным. Я уж точно нахожу. Никакого root, никакого демона, никакого сокета.

    Если хотите узнать больше о пространствах имён ядра Linux, которые работают вместе, чтобы создать контейнер, эта серия LWN действительно хороша: https://lwn.net/Articles/531114/

  6. j16sdiz

    Каждое утверждение в статье заставляет меня спрашивать: «Что в этом странного?»

    Всё в этом списке кажется естественным, когда знаешь, как вещи развивались на протяжении многих лет. Может, это просто я старею и теряю любопытство.

  7. tyingq

    Покопайтесь в bocker[1]. Для технических людей он иллюстрирует те же тезисы, что и статья, очень наглядным способом.

    [1] «Docker, реализованный примерно в 100 строках bash»

    https://github.com/p8952/bocker

  8. sreekanth850

    Я начал ненавидеть Docker после того, как увидел весь этот карго-культ на Reddit. Всякий раз, когда кто-то спрашивает о развёртывании приложения на Linux, всегда найдётся хотя бы один комментарий: «Просто используй Docker». В итоге мы построили собственный инструмент автоматизации развёртывания для всего нашего стека, который вообще не использует Docker.

Ещё за этот день

2026-10-23