Почему Docker на MacOS намного хуже, чем на Linux? | Журнал "Вольт"
Пт. Окт 30th, 2020


На сайте webdevblog.ru опубликован перевод статьи «Почему Docker на macOS намного хуже, чем Linux?». Представляем вашему вниманию.

Я часто слышу шутки от тех, у кого есть Docker IDE на Mac: из-за этого Mac звучит как реактивный самолет при взлете? Это докер!

Однако их коллеги-разработчики по Linux не могут сразу понять, в чем заключается прикол, поскольку они никогда не сталкивались с этой проблемой.

Почему Docker для Mac намного хуже Docker для Linux? Мы расскажем о причинах в этом посте.

Контейнеры против виртуальных машин

Для начала несколько слов об архитектуре контейнера и ее отличиях от стандартной виртуальной машины (Virtual Machine – ВМ).

Вообще говоря, оба они похожи в том, что вы запускаете «компьютеры внутри вашего компьютера». Разница в том, как это работает.

Контейнер: работа с диском

Как вы видите выше, контейнеры используют вашу ОС и ее ядро ​​и, следовательно, «ближе к оборудованию». Например, чтобы Контейнер мог читать / писать с жесткого диска ОС хоста, он должен:

  • Смонтируйте диск в контейнере (т.е. он имеет прямой доступ к диску в ОС хоста благодаря ядру)
  • А потом работать так, как если бы это было прямо в ОС хоста

ВМ: работа с диском

Виртуальные машины запускают дополнительную операционную систему поверх вашей операционной системы, а также дополнительный уровень абстракции (называемый гипервизором), чтобы «гостевая ОС» могла взаимодействовать с ОС хоста. Например, чтобы виртуальная машина могла читать / писать с жесткого диска вашей ОС, она должна:

  • Смонтировать диск в гостевой ОС
  • Смонтировать диск в основной ОС на гипервизоре
  • Теперь гипервизор должен синхронизировать все изменения между ними.

Докер для macOS

Хотя Docker может называться Docker для macOS, он архитектурно отличается от Docker для Linux.

Как вы видите выше, вместо прямого доступа к ОС хоста Docker для macOS должен запускать собственную виртуальную машину Linux (LinuxKit VM).

Docker может получить доступ только к ядру этой виртуальной машины, которое затем может выполнить описанные выше действия, чтобы синхронизировать диски ваших контейнеров с ОС хоста.

Хотя Docker для Linux по существу имеет прямое соединение с ОС хоста (и, следовательно, с диском, сетью, графическим процессором и т. Д.), Docker для macOS должен пройти несколько уровней абстракции для выполнения задач низкого уровня.

Воздействие на машину разработки

Типичная установка разработки Docker обычно выглядит так:

ОС хоста

  • Инструменты разработчика (IDE, текстовые редакторы, линтеры и т. Д.)
  • Редактирование исходного кода

Контейнер

  • Код приложения и зависимости
    • Какой-то механизм горячей / живой перезагрузки при изменении кода
  • Скопируйте или сделайте ссылку на исходный код ОС хоста

“Джет взлетает” при запуске docker-compose на macOS? Ресурсы вашей ОС хоста усердно работают над синхронизацией низкоуровневого ввода-вывода (особенно диска и сети) между ОС хоста и контейнерами; это в дополнение к запуску самих контейнеров.

Вот почему вы можете видеть, что процесс Hyperkit обычно потребляет большую часть вашего процессора даже в режиме ожидания. Вся эта работа по синхронизации между этими слоями нетривиальна!

Опции для macOS

Это та часть, где многие посоветовали бы вам «просто разрабатывать на Linux». Хотя это правда, что Docker в Linux спроектирован так, как задумано (и, следовательно, является лучшим вариантом), простой переключатель неприемлем для большинства людей.

Приведенные ниже варианты приблизят вас к опыту работы с Linux. По крайней мере, возможный “реактивный взлет” может происходить только время от времени, а не постоянно.

Docker для Mac Edge Build (с Mutagen)

На данный момент у Docker есть устоявшийся подход к минимизации потребления ресурсов при замене диска с помощью так называемого Mutagen. Однако вам не нужно беспокоиться о деталях, поскольку они входят в состав официальной сборки Docker для Mac Edge.

инструкции

  1. Установите Docker для Mac Edge Build
  2. В пользовательском интерфейсе Docker перейдите в раздел Ресурсы => Общий доступ к файлам и укажите, какие папки вы хотите присоединить к контейнерам Docker.

профи

  • Утверждено командой Docker
  • Минимальная настройка – используйте файлы docker-compose и docker как обычно
  • Значительно снижает производительность ЦП при горячих / живых перезагрузках
  • Изменения файлов выполняются намного быстрее

Минусы

Докер-синхронизация

Альтернатива, которая существует уже несколько лет, называется docker-sync.

docker-sync – это, по сути, контейнер, работающий вместе с вашими собственными контейнерами, задача которого – эффективно информировать ваш контейнер об изменениях файлов. По сути, это еще один уровень абстракции для ускорения процесса.

инструкции

  1. Установить docker-sync
  2. Измените свой docker-sync.yml в соответствии с необходимыми настройками.

профи

  • Работает на всех платформах Docker
  • Значительно снижает скорость процессора при горячих / живых перезагрузках
  • Изменения файлов выполняются намного быстрее

Минусы

  • Требуются изменения конфигурации
  • Потребляется больше ресурсов докера из-за дополнительных параллельных контейнеров
  • Для перемещения контейнеров вверх и вниз требуется дополнительная оркестровка
  • Иногда возникают проблемы с синхронизацией; т.е. контейнер не обновляется при изменении ОС хоста и его необходимо перезапустить

Вывод

Докер в основном создавался для Linux. Как оказалось, его полезность была перенесена на macOS и Windows.

Поскольку обе операционные системы сильно отличаются от Linux по своей сути, виртуализация была единственным реальным способом заставить все работать. К сожалению, это приводит к низкому уровню эффективности, который в противном случае мы бы приняли как должное.

Поскольку в будущем Mutagen станет частью Docker для Mac, разработчики macOS надеются, что проблема «реактивного двигателя» начнет уменьшаться.

Однако в настоящее время лучшим опытом разработчика для Docker по-прежнему является родной Linux.



Source link

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *