Я думал, что понимаю контейнеры. Затем я попытался построить один.
Автор, несмотря на сдачу экзамена по Docker, осознал, что практические знания контейнеров отличаются от теоретического понимания. Первые попытки с командой unshare показали непонимание пространств имен PID, для чего потребовался флаг --fork для правильного создания PID 1 в новом пространстве имен. Далее, перемонтирование файловой системы /proc внутри пространства имен было крайне важно для того, чтобы инструменты, такие как ps, точно отражали изолированную иерархию процессов. Демонстрация пространства имен UTS показала, как можно изолировать имена хостов, доказав концепцию с помощью четкого контроля и обработки.Путешествие продолжилось с pivot_root, где автор попытался предоставить процессу свою собственную файловую систему. Первой проблемой стала динамически связанная исполняемая программа BusyBox, которая не смогла запуститься, поскольку ее требуемый интерпретатор был недоступен в новой файловой системе. Решение заключалось в использовании статически связанной программы BusyBox в качестве моста во время перехода файловой системы и устранении кэша хэшей Bash, который запомнил старые пути команд. Проблема, специфичная для Mac, с virtiofs и выполнением символьных ссылок, была решена путем перемещения файловой системы в родной путь контейнера.Операция pivot_root сама по себе требовала конкретной настройки: новая файловая система должна была быть точкой монтирования, а старая файловая система должна была быть подготовлена отдельно до фактического изменения. Успешное выполнение команд внутри новой файловой системы, таких как отображение /etc/os-release из Alpine Linux, дало осязаемую награду. Наконец, изучение cgroups в качестве файловой системы API продемонстрировало ограничение ресурсов, показав правило "нет внутренних процессов" для включения контроллеров в cgroup v2.Аккуратно эвакуируя процессы, а затем включая контроллеры в родительских cgroups, автор успешно установил ограничения на память и PID для дочернего cgroup. Принудительное соблюдение этих ограничений, в частности, наблюдение за событием Out-Of-Memory (OOM) через dmesg, укрепило понимание cgroups не как абстрактных настроек, а как прямых взаимодействий с файловой системой ядра. Этот практический опыт демистифицировал Pods Kubernetes, показав их как организованные реализации этих фундаментальных примитивов Linux: пространства имен, изоляции файловой системы и cgroups. Следовательно, инструменты контейнеризации, такие как Docker, containerd и Kubernetes, превратились из брендованных продуктов в структурированные композиции этих основных скриптов.
unshareпоказали непонимание пространств имен PID, для чего потребовался флаг--forkдля правильного создания PID 1 в новом пространстве имен. Далее, перемонтирование файловой системы/procвнутри пространства имен было крайне важно для того, чтобы инструменты, такие какps, точно отражали изолированную иерархию процессов. Демонстрация пространства имен UTS показала, как можно изолировать имена хостов, доказав концепцию с помощью четкого контроля и обработки.Путешествие продолжилось сpivot_root, где автор попытался предоставить процессу свою собственную файловую систему. Первой проблемой стала динамически связанная исполняемая программа BusyBox, которая не смогла запуститься, поскольку ее требуемый интерпретатор был недоступен в новой файловой системе. Решение заключалось в использовании статически связанной программы BusyBox в качестве моста во время перехода файловой системы и устранении кэша хэшей Bash, который запомнил старые пути команд. Проблема, специфичная для Mac, сvirtiofsи выполнением символьных ссылок, была решена путем перемещения файловой системы в родной путь контейнера.Операцияpivot_rootсама по себе требовала конкретной настройки: новая файловая система должна была быть точкой монтирования, а старая файловая система должна была быть подготовлена отдельно до фактического изменения. Успешное выполнение команд внутри новой файловой системы, таких как отображение/etc/os-releaseиз Alpine Linux, дало осязаемую награду. Наконец, изучение cgroups в качестве файловой системы API продемонстрировало ограничение ресурсов, показав правило "нет внутренних процессов" для включения контроллеров в cgroup v2.Аккуратно эвакуируя процессы, а затем включая контроллеры в родительских cgroups, автор успешно установил ограничения на память и PID для дочернего cgroup. Принудительное соблюдение этих ограничений, в частности, наблюдение за событием Out-Of-Memory (OOM) черезdmesg, укрепило понимание cgroups не как абстрактных настроек, а как прямых взаимодействий с файловой системой ядра. Этот практический опыт демистифицировал Pods Kubernetes, показав их как организованные реализации этих фундаментальных примитивов Linux: пространства имен, изоляции файловой системы и cgroups. Следовательно, инструменты контейнеризации, такие как Docker, containerd и Kubernetes, превратились из брендованных продуктов в структурированные композиции этих основных скриптов.