Docker — это странно: энтузиаст написал собственный контейнерный рантайм и вот что выяснил
Docker is weird
Автор ради удовольствия решил написать собственный контейнерный рантайм и обнаружил, что Docker устроен куда страннее, чем кажется. Контейнеры — не виртуальные машины, а обычные процессы с ограничениями; образы — просто папки, к которым применяют chroot или pivot_root. Рантайм runc написан на Go, и из-за многопоточности и отсутствия fork ему приходится идти на хитрости. А ещё Docker обычно требует root.
Контейнеры — это на самом деле 5 разных функций ядра Linux в плаще.
- shykes
Привет, я создатель Docker и наткнулся на этот пост. Всегда забавно видеть, как другие инженеры размышляют о том, как ты спроектировал систему. Я много лет не участвовал в разработке Docker, но это приятное путешествие по воспоминаниям.
Буду рад ответить на любые ваши вопросы.
- jlhawn
> Контейнерный рантайм Docker, runc, написан на Go.
Я работал в Docker с 2014 по 2019 год. Самая важная часть на самом деле написана на C.
[Я написал здесь целый комментарий, чтобы объяснить, как работает этот хак, потому что слишком зациклился на том, насколько технически неверно утверждение «написан на Go». Потом я вернулся к чтению остальной статьи и увидел, что абзац сразу после этого вроде бы объясняет это по-своему! Пусть это будет уроком: всегда дочитывай статью до конца, прежде чем писать о ней.]
- vbezhenar
На мой взгляд, Docker сделало уникальным не сама контейнерная технология. Я использовал chroot 20 лет назад, и это прекрасно работало. Да, без сетевых пространств имён; без пространств имён процессов, но я даже не думаю, что они настолько важны.
Уникальным Docker сделали вот эти вещи:
1. Концепция Dockerfile. Сборка образов слой за слоем. Кэширование слоёв. Всё в одном файле. Это позволило быстро итерировать образ. Это позволило эффективно реализовать CI-сборки.
2. Концепция сетевого реестра Docker. Размещение универсальных образов на сервере и обмен ими со всем миром.
3. Импульс. Множество программ, которые традиционно было сложно развернуть, внезапно появились в docker-серверах. Помню, как я был очарован, когда смог развернуть сайт на wordpress с помощью крошечного docker-compose. И насколько это было изолировано. Я мог просто удалить все следы с хоста. Я всегда чувствовал себя неуютно, устанавливая разные вещи на свой хост, и docker просто решил эту проблему.
- slowin
Обычно я предпочитаю Podman, но Docker — это/был потрясающим, и отличный DX построен поверх так называемых «5 разных функций ядра Linux в плаще». В этом и есть фишка: он суперлёгкий и полностью использует возможности ОС, которые уже были (или разрабатывались), но были неудобны в использовании и требовали тонны специализированных знаний.
- suprjami
Всегда приятно видеть, как кто-то демистифицирует сложную вещь, изучая строительные блоки, из которых она состоит.
Зная это, вы можете найти метод fork-exec в rootless Podman для запуска контейнеров более разумным. Я уж точно нахожу. Никакого root, никакого демона, никакого сокета.
Если хотите узнать больше о пространствах имён ядра Linux, которые работают вместе, чтобы создать контейнер, эта серия LWN действительно хороша: https://lwn.net/Articles/531114/
- j16sdiz
Каждое утверждение в статье заставляет меня спрашивать: «Что в этом странного?»
Всё в этом списке кажется естественным, когда знаешь, как вещи развивались на протяжении многих лет. Может, это просто я старею и теряю любопытство.
- tyingq
Покопайтесь в bocker[1]. Для технических людей он иллюстрирует те же тезисы, что и статья, очень наглядным способом.
[1] «Docker, реализованный примерно в 100 строках bash»
- sreekanth850
Я начал ненавидеть Docker после того, как увидел весь этот карго-культ на Reddit. Всякий раз, когда кто-то спрашивает о развёртывании приложения на Linux, всегда найдётся хотя бы один комментарий: «Просто используй Docker». В итоге мы построили собственный инструмент автоматизации развёртывания для всего нашего стека, который вообще не использует Docker.