Apple Container: новий проєкт контейнеризації на macOS

Apple нещодавно випустила новий проєкт з відкритим кодом, який може суттєво змінити підхід до роботи з контейнерами на macOS. Цей проєкт, названий просто container, представляє створене на Swift, нативне для Apple середовище виконання контейнерів, спеціально розроблене для систем macOS, особливо тих, що працюють на Apple Silicon.

Основні можливості нового рішення для контейнеризації

По суті, container дозволяє користувачам завантажувати, створювати, запускати та публікувати стандартні OCI-сумісні Linux-контейнери. Проте, на відміну від Docker, який зазвичай використовує спільну віртуальну машину для всіх контейнерів на macOS, підхід Apple запускає кожен контейнер у власній легкій мікро-VM з ізольованим ядром Linux та мережевим стеком.

Інструмент використовує та створює OCI-сумісні образи контейнерів, тому ви можете завантажувати та запускати образи з будь-якого стандартного реєстру контейнерів. Ви також можете публікувати створені вами образи в цих реєстрах і запускати їх у будь-якому іншому OCI-сумісному застосунку.

Ця модель нагадує концепцію мікро-VM, популяризовану інструментами на зразок Firecracker, але тісно інтегрована в macOS через Virtualization.framework, нативний гіпервізорний інтерфейс Apple.

Порівняння з Docker: основні відмінності в контейнеризації

Хоча Apple не позиціонує це як повноцінну заміну Docker, інструмент охоплює багато тих самих функцій для локальної розробки. Інтерфейс командного рядка знайомий і зрозумілий: з командами на кшталт container image pull alpine або container run -ti alpine sh.

Однак, є принципові відмінності. Насамперед, на macOS немає справжньої нативної контейнеризації, як у Linux. Docker використовує специфічні функції ядра Linux, такі як cgroups, namespaces та overlay файлові системи, яких немає в ядрі macOS.

Тому новий проєкт Apple використовує окрему легку віртуальну машину Linux для запуску кожного контейнера. Водночас, підхід Docker полягає у запуску всього в одній віртуальній машині (побудованій з LinuxKit), яка містить Docker Engine та всі контейнери.

У випадку Apple, кожен контейнер знаходиться у власній окремій VM, що означає багато віртуальних машин, навіть якщо вони легкі.

Таблиця порівняння рішень для контейнеризації

Функція Docker Desktop Apple Container
Модель VM Спільна VM для всіх контейнерів Мікро-VM для кожного контейнера
Ядро Єдине ядро Linux для всіх Окреме ядро Linux для кожного контейнера
База Використовує Docker Engine і гіпервізор Використовує власний Virtualization.framework від Apple
Мережа NAT або міст через VM Нативний мережевий стек macOS
Середовище виконання runc / containerd vminitd, користувацька система ініціалізації Swift
Інтеграція Кросплатформна, орієнтована на контейнери Глибоко нативна для macOS та орієнтована на Swift

Переваги та обмеження нового рішення контейнеризації

Основна перевага проєкту Apple полягає в тому, що він надає кожному контейнеру власне виділене ядро Linux. Також він використовує нативний мережевий стек macOS, тоді як Docker зазвичай покладається на віртуальну машину з NAT або мостовою мережею.

Проте, незважаючи на всі відмінності, основна ідея однакова в обох випадках — створення, запуск та робота з OCI-сумісними образами контейнерів. З цієї точки зору Docker все ще пропонує значно більше гнучкості та можливостей.

Наприклад, поки що немає еквіваленту docker-compose, а екосистема інструментів (відсутність GUI-панелі, обмежена оркестрація) все ще потребує розвитку та вдосконалення.

Цікаво спостерігати, як розвиватиметься цей проєкт і чи зможе він врешті-решт замінити Docker або Podman як основний інструмент для роботи з контейнерами для розробників на macOS.

Більше інформації про проєкт можна знайти на офіційній сторінці проєкту Container на GitHub.