Apple создала аналог WSL для Mac (Container Machines)
BBetter Stack
Computing/SoftwareInternet Technology
Transcript
00:00:00В тени всех нововведений Apple Intelligence на WWDC в этом году
00:00:03Apple тихо выпустила свою версию Windows Subsystem for Linux под названием Container
00:00:06Machines. Они предоставляют легкое и постоянное Linux-окружение на вашем Mac,
00:00:10использовать их очень просто. Они построены на базе проекта Apple
00:00:14Container, выпущенного в прошлом году, который является альтернативой Docker и, конечно же,
00:00:18оптимизирован для Apple Silicon. Давайте разберемся, что такое
00:00:21Container Machines, как они работают, и вспомним Apple Containers.
00:00:29Я начну с настройки Container Machine, а потом расскажу,
00:00:32как всё это работает. Мне нужно окружение Ubuntu Linux. У меня просто
00:00:37есть Dockerfile с образом Ubuntu и команды для установки распространенных
00:00:41инструментов. Это сработает с любым OCI-совместимым образом, так что почти со всеми,
00:00:46которые вы используете в Docker. Единственное, что нужно включить для полноценной ВМ, — это система
00:00:50инициализации. Когда у нас есть Dockerfile, нам нужно только
00:00:54собрать его с помощью инструментов Apple. Вот команда, которую я использую,
00:00:58так как Dockerfile в этой папке, и я просто помечу его как
00:01:01local Ubuntu machine. Нажмем Enter и начнем сборку. Инструмент
00:01:05Container, кстати, работает на macOS 26 и выше, установить его можно с GitHub,
00:01:09просто зайдя в репозиторий, в раздел релизов и скачав последний пакет. Сборка
00:01:13моего образа завершена, как видите, всё очень похоже на Docker. Просто сборка OCI-образа.
00:01:17Это всё, что нам нужно для контейнерной машины, теперь мы можем просто выполнить container machine create,
00:01:21указать нужный образ для нашей машины, дать ей понятное имя,
00:01:24и я также сделаю её используемой по умолчанию, чтобы не приходилось каждый
00:01:27раз указывать имя. Нажимаем Enter, и буквально за секунды всё готово.
00:01:31Мы можем увидеть информацию о только что созданной машине,
00:01:35выполнив “container machine list”. Здесь видно, что есть та самая Ubuntu,
00:01:38её IP-адрес, 7 ядер CPU и 18 ГБ оперативной памяти. Настройки CPU и памяти
00:01:44можно менять, но по умолчанию она берет половину памяти вашего Mac. Чтобы начать
00:01:48Чтобы начать использовать контейнерную машину, достаточно ввести container machine run,
00:01:51вы можете оставить это поле пустым, если хотите войти в интерактивный терминал, или на самом деле просто
00:01:54команду для выполнения в Linux. В данном случае, видите,
00:01:58я нажал Enter и теперь нахожусь в интерактивном терминале Linux. Можно подтвердить,
00:02:02выполнив “uname -a”, и видим, что это Linux Ubuntu,
00:02:06в отличие от моего Mac, где выводится Darwin. Одна из классных штук
00:02:10в Container Machines — это автоматический доступ к пользователю, мой аккаунт был скопирован с
00:02:14Mac в Linux-окружение. То же самое касается и домашней директории. Она монтируется
00:02:18в режиме чтения-записи, так что у меня в Linux есть доступ ко всем файлам с Mac.
00:02:23Видите, где я запустил “container run”, я сразу попал в эту папку
00:02:27внутри Linux, и файлы уже на месте. Но у неё есть и свой собственный том,
00:02:31поэтому, если перейти в домашнюю директорию этой машины Ubuntu, то можно заметить, что там
00:02:35пусто, хотя на Mac файлы есть, потому что это чистое Linux-окружение,
00:02:39и сюда вы можете поместить свои dot-файлы, специфичные для Linux. Общий доступ к папкам
00:02:43позволяет легко разрабатывать на Mac, используя привычные инструменты, даже те, что
00:02:48совместимы только с macOS, а затем быстро переключаться на Linux для тестирования.
00:02:52Например, у меня есть простое приложение на BUN, и я хочу скомпилировать его в
00:02:56исполняемый файл для Linux, но я не могу протестировать это на macOS,
00:03:01поэтому не уверен, работает ли оно. Переключившись на Container Machine,
00:03:04я могу сразу запустить команду. Мне не нужно передавать файлы или что-то еще,
00:03:08благодаря общей файловой системе. Нажимаю Enter — всё отлично работает.
00:03:12Это был простой веб-сервер, вот веб-страница, которая отображает, на чем
00:03:16на чём он работает, так что сейчас он запущен на Ubuntu 24.
00:03:20вокруг, то, что вам определенно стоит сделать. Сейчас я тестировал запуск BUN
00:03:23в Linux, и всё работает, как мы видим,
00:03:27он запущен через “bun dev”, не скомпилирован. Но если я меняю файл исходного кода на Mac,
00:03:31допустим, напишу “hello” вместо “subscribe”, то замечаю, что горячая перезагрузка
00:03:35не подхватывает изменения, и мне приходится перезапускать сервер,
00:03:39чтобы они применились. Вот, теперь отображается “hello”. Думаю, горячая перезагрузка
00:03:43работает так же, как точки останова: они не работают с кодом на macOS, но вы можете
00:03:47подключить редактор к Container Machine через SSH и редактировать файлы оттуда,
00:03:52тогда всё будет работать. В документации есть руководство, как это сделать.
00:03:55Это, в принципе, всё, что нужно знать об использовании
00:03:59Container Machine. Это обычное окружение Ubuntu, и опыт использования
00:04:03довольно бесшовный. Стоит отметить, что вы не ограничены одной машиной. Можно
00:04:08иметь Alpine, Ubuntu и Debian одновременно, по одному дистрибутиву
00:04:12под разные цели, и это очень удобно для кроссплатформенной работы. Плюс, так как эти машины
00:04:17могут запускать настоящий SystemD, вы можете тестировать полноценный стек сервисов, например,
00:04:22запустить Postgres как службу рядом с приложением, и всё будет вести себя в точности,
00:04:26как на Linux-сервере, куда вы будете деплоить. Простота — один из ключевых принципов,
00:04:30который продвигала Apple. Им нужны были быстрые, легкие ВМ,
00:04:34которые интегрируются в существующий рабочий процесс и легко создаются по мере необходимости,
00:04:39а также являются постоянными, позволяя настроить целое окружение со всеми
00:04:42нужными инструментами. Опять же, это похоже на то, чего пыталась добиться Windows Subsystem
00:04:47for Linux. А чтобы понять, как это устроено и как соотносится с Docker и
00:04:51OrbStack, нужно вспомнить инструмент Container, вышедший в прошлом году. Он написан
00:04:55на Swift и призван стать альтернативой Docker, запуская любые стандартные
00:04:59OCI-образы, так что всё, что есть в Docker Hub, будет работать. Уникальность подхода
00:05:04Apple в том, что каждый контейнер получает свою собственную легкую виртуальную машину через их
00:05:08фреймворк виртуализации, а не кучу контейнеров, использующих одну большую Linux-ВМ, как это
00:05:13делает Docker Desktop. Преимуществами такого подхода могут быть безопасность, так как
00:05:17каждый контейнер имеет изоляцию полноценной ВМ. Затем конфиденциальность: вы монтируете только
00:05:22необходимые данные в каждую ВМ, тогда как при общей ВМ вы монтируете туда всё, чтобы потом
00:05:27избирательно распределять по контейнерам. Наконец, может быть
00:05:31преимущество в производительности: контейнеры Apple требуют меньше памяти, чем
00:05:36полноценная ВМ, а время загрузки сопоставимо с Docker. Если взглянуть на
00:05:41бенчмарки от RepoFlow, сравнивающие Apple Containers, OrbStack и Docker Desktop, мы увидим,
00:05:46что результаты неплохие. Трудно сказать, но Apple Containers действительно показывает
00:05:50лучшую однопоточную производительность CPU, но OrbStack очень близка, там разница в долях.
00:05:55Та же история в многопоточном режиме, все работают отлично. В чем Apple
00:06:00вырывается вперед, так это пропускная способность памяти, OrbStack на втором месте, Docker
00:06:04Desktop последний. А вот по времени запуска маленького контейнера Apple еще
00:06:09нужно поработать, хотя это все еще меньше секунды, но Docker Desktop и OrbStack делают это
00:06:14быстрее чем за четверть секунды. Там еще много бенчмарков,
00:06:17оставлю ссылку. По сути, остальное показывает, что у OrbStack исключительная производительность файловой системы,
00:06:22но Apple Containers как минимум на уровне Docker Desktop, если не лучше.
00:06:27Есть несколько нюансов, о которых стоит знать перед использованием Container Machines,
00:06:30первый — память. Машина по умолчанию забирает половину RAM системы,
00:06:35и она её никогда не возвращает. Так что если у вас интенсивная задача,
00:06:39например тяжелая сборка, память будет занята до тех пор,
00:06:43пока вы не перезапустите машину. Это уникальный плюс OrbStack,
00:06:47у которого есть динамическая память, возвращающая неиспользуемую RAM обратно macOS. Насколько я знаю,
00:06:53больше никто этого не делает. Второе: нет проброса GPU и USB.
00:06:57Я видел открытые issues на GitHub, может, в будущем добавят. Третье,
00:07:02кажется сложно запускать GUI-приложения, например, если вы хотите
00:07:06запустить Linux-версию VS Code. Это точно не бесшовный опыт, я бы выбрал что-то другое.
00:07:11Наконец, есть компромисс в безопасности, так как, как я сказал ранее, домашняя директория
00:07:15монтируется в режиме чтения-записи по умолчанию, а это значит, что всё,
00:07:20что вы запускаете внутри Linux, может получить доступ к вашим SSH-ключам, облачным учетным данным
00:07:25и всему на Mac. Похоже, можно только переключить в режим чтения или отключить вовсе.
00:07:29Нельзя выбрать отдельную папку. В целом, попробовав Apple
00:07:33Container Machines, я, вероятно, останусь на OrbStack, так как это более отполированный
00:07:37вариант с лучшим управлением ресурсами, но знаю, что некоторым не нравится,
00:07:40что OrbStack платный для коммерческого использования. Так что без него,
00:07:45я бы выбрал Apple Containers, а не Docker Desktop. Есть еще Lima, отличная
00:07:49альтернатива. А что используете вы? OrbStack, Docker Desktop или Lima? Дайте знать
00:07:53в комментариях, не забудьте подписаться, и до встречи в новом видео.