Контейнер состоит из следующего не слишком сложно для понимания деталей.
Вы, наверное, знаете программу Chroot, это в основном обертка для ядра Chroot
Системный вызов, который приготовляет заданный путь ко всем следующим системам, связанным с пути. Или, чтобы процитировать страницу «Человек: этот вызов» меняет ингредиент в процессе разрешения пути и ничего не делает. При вызове корневой файловой системы — то есть все файлы и каталоги, которые составляют операционную систему — процесс, называемый и все его будущие дочерние процессы — в простых терминах — думайте, что они находятся в другом распределении Linux. На практике большинство контейнеризационных платформ будут использовать немного более сложные pivot_root
звонок, который следует той же базовой концепции.
В то время как Chroot меняет корневую файловую систему процесса вызова, она ничего не делает с «специальными» файловыми системами, такими как /Дев
или /proc
. Они должны быть настроены на Gusto данной платформой контейнеризации с помощью системы Mount System. Вы, вероятно, уже использовали соответствующую бинарную обертку. «Объем» достигаются не более чем креплением привязки.
С Chroot и MountPoints у нас уже есть что -то пригодное для использования, но это все равно не ощущается как отдельная операционная система. Многие ресурсы все еще связаны между нашим примитивным «контейнером» и остальной частью системы. У Linux есть интересная концепция, чтобы решить эту названия. Вместо того, чтобы отделить весь процесс сразу, чтобы иметь что -то вроде отдельной «виртуальной машины», с Linux вы можете точно настроить, что именно должно получить свои собственные пространства имен. Например: сделать Верх
Не отображать процессы из основной системы, пространства имен PID невыразились. Если желательно, чтобы призывы к монтированию в вашем контейнере не должны испортить основные системы), вы бы сделали это «неразличивая» пространство имен Mount. Возможно, что «подделка» является root -пользователем с пространствами имен пользователей. Вот список Доступные пространства имен что процесс может отделить с UNSHARE
системный вызов. Linux Namespaces — это функциональность, обеспечиваемая ядром Linux, не поддерживаемая другими операционными системами Unix.
Я не буду слишком глубоко погрузиться в этот, потому что это не мой опыт. Но с этими тремя ингредиентами — Chroot, MountPoint и Linux -пространствами имен — у нас уже есть что -то, что похоже на отдельную коробку Linux, работающую в нашей операционной системе хоста. Аккуратный, но сделать это достаточно хорошо с точки зрения безопасности, — это еще одна история. Злоумышленник все еще может «избежать» самого выпеченной виртуализации довольно легко. Например, Chroot не предоставляет никаких гарантий того, что процесс останется в его отсеке Chroot.
По практическим причинам было бы неплохо не нужно вручную загружать новый, например. Операционная система Ubuntu из Интернета каждый раз, когда мы хотим использовать ее в качестве нашей гостевой системы. Хорошо, что у нас есть наш центральный сервер репозитория, где мы можем скачать все, что хотим, и загрузить наши собственные изменения. О, и, конечно, он должен поддерживать слои или наложения, объясняется в следующем разделе.
Гостевая система — у нас еще нет контейнеров — как Ubuntu со стеком ламп, а некоторые другие вещи могут легко занять пару гигабайт пространства на жестком диске. Хотя можно было бы загрузить, загружать, копировать, удалять и проводить другие операции по этому поводу, это нецелесообразно. Вот почему платформы контейнеризации управляют корневой файловой системой (все файлы и каталоги операционной системы) битами в виде слоев. На самом деле это довольно просто: несколько файлов и каталогов накладываются друг на друга, чтобы создать «полное» представление, которое увидит пользователь. «Специальные» файлы используются для сигнала удаленного файла. Еще один интересный подход к решению этого может включать в себя обратные связи — при условии, что используемая файловая система поддерживает это. Как и все остальные интерфейсы, описанные в этом посте, накладывающие файловые системы также могут использоваться отдельно для любого другого варианта использования. Существует наложная файловая система, запеченная в ядро под названием «Overlayfs». Существует также реализация, основанная на предохранителе, называемая «предохранителями».
И последнее, но не менее важное количество платформ контейнеризации состоит в том, чтобы позволить пользователям создавать свои собственные корневые файловые системы для их распространения или развертывания. Простой сценарий оболочки, скорее всего, не будет честь слоев и других «особых» функций, таких как аргументы времени или объемы.
Вуаля, это как создать платформу контейнеризации. Из моего понимания все эти описанные детали уже доступны с десятилетий. Но вместе это делает что -то особенное. При этом, пожалуйста, не пытайтесь создать собственную платформу для контейнеров на выходных. Это очень привыкает и, конечно, займет больше времени, чем вы думаете. Вот что я придумал, это называется Plash 🙂
Оригинал: «https://dev.to/ihucos/demystifying-containers-109n»