Перевод: Eric Nograles — Why is Docker on macOS So Much Worse Than Linux?
Я часто слышу шутки от всех, у кого есть среда разработки Docker на Mac: это заставляет Mac звучать как реактивный самолет при взлете? Это Docker!
Однако их коллеги-разработчики на Linux не сразу могут понять, а в чем тут шутка так как ни разу не сталкивались с этой проблемой.
Почему Docker для Mac — это намного хуже, чем Docker для Linux? Мы рассмотрим причины в этом посте.
Во-первых, несколько слов об архитектуре контейнера и ее отличиях от стандартной виртуальной машины (Virtual Machine — VM).
Вообще говоря, оба они похожи в том, что вы запускаете «компьютеры внутри вашего компьютера». Разница в том, как это происходит.
(Источник: https://wiki.aquasec.com/display/containers/Docker+Architecture)
Как вы можете видеть выше, контейнеры используют вашу ОС и ее ядро и, следовательно, они «ближе к железу». Например, чтобы Контейнер мог читать/писать с жесткого диска ОС хоста, он должен:
Виртуальные машины запускают дополнительную операционную систему поверх вашей операционной системы, а также дополнительный уровень абстракции (называемый гипервизором) что бы «гостевая ОС» могла взаимодействовать с главной ОС. Например, чтобы виртуальная машина могла читать/писать с жесткого диска вашей ОС, она должна:
Хотя Docker может называться Docker для macOS, архитектурно он отличается от Docker для Linux.
(Источник: https://collabnix.com/how-docker-for-mac-works-under-the-hood/)
Как вы можете видеть выше, вместо прямого доступа к ОС хоста Docker для macOS должен запускать собственную виртуальную машину Linux (LinuxKit VM).
Docker может получить доступ только к ядру этой виртуальной машины, которое затем может выполнить описанные выше шаги для синхронизации дисков ваших Контейнеров и ОС хоста.
В то время как Docker для Linux по существу имеет прямую связь с ОС хоста (и, соответственно, с диском, сетью, графическим процессором и т. д.), Docker для macOS должен пройти несколько уровней абстракций для выполнения низкоуровневых задач.
Типичная настройка разработки Docker обычно выглядит следующим образом:
«Реактивный самолет взлетает», когда вы запускаете docker-compose на macOS? Ресурсы вашей ОС хоста усердно работают для синхронизации низкоуровневого ввода-вывода (в частности, диска и сети) между ОС хоста и контейнерами; это помимо запуска самих Контейнеров.
Вот почему вы видите, что процесс Hyperkit обычно потребляет большую часть вашего процессора даже в режиме ожидания. Вся эта синхронизирующая работа между этими слоями нетривиальна!
Это та часть, где многие посоветовали бы вам «просто разрабатывать на Linux». Хотя это правда, что Docker в Linux имеет такую архитектуру, как и предполагалось (и, следовательно, это лучший вариант), простое переключение неприемлемо для большинства людей.
Приведенные ниже параметры приблизят вас к опыту работы с Linux. По крайней мере, возможный «взлет реактивного самолета» может происходить только время от времени, а не все время.
На данный момент у Docker есть одобреный подход к минимизации потребления ресурсов при изменении диска с помощью чего-то под названием Mutagen. Однако вам не придется беспокоиться о деталях, поскольку они упаковывают его как часть официальной сборки Docker для Mac Edge.
Альтернатива, которая существует уже несколько лет, называется docker-sync.
docker-sync — это, по сути, контейнер, работающий параллельно с вашими собственными контейнерами, задача которого — эффективно информировать ваш контейнер об изменении файлов. По сути, это еще один уровень абстракции для ускорения процесса.
Docker в основном создавался для Linux. Как оказалось, его полезность была портирована на macOS и Windows.
Поскольку обе операционные системы сильно отличаются от Linux по своей сути, виртуализация была единственным реальным способом заставить все работать. К сожалению, это приводит к неэффективности низкого уровня, которую мы в противном случае принимаем как должное.
Поскольку в будущем Mutagen будет входить в состав Docker для Mac, у разработчиков macOS есть надежда, что проблема «реактивного двигателя» начнет уменьшаться.
Тем не менее, в настоящее время лучший опыт разработчиков для Docker по-прежнему остается родным Linux.
Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…
Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…
Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…
Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…
Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…