Запустится ли Docker-контейнер, собранный на Linux, на компьютере с macOS?

Ответ

Да, запустится. Docker обеспечивает переносимость на уровне контейнера, но с важными техническими оговорками.

Как это работает: Контейнеры используют ядро хостовой ОС. Поскольку macOS не имеет нативного ядра Linux, Docker Desktop для Mac запускает легковесную Linux-виртуальную машину (VM), поверх которой работают контейнеры.

Ключевые условия и ограничения:

  1. Совместимость архитектуры (CPU):

    • Образ, собранный для linux/amd64 (Intel), будет работать на Intel Mac и на Apple Silicon (M1/M2) через эмуляцию Rosetta 2.
    • Для нативной производительности на Apple Silicon (ARM) нужен образ linux/arm64. Многие официальные образы мультиархитектурные (multi-arch).
    • Можно явно указать платформу: docker run --platform linux/amd64 my-image.
  2. Отличия в производительности:

    • Доступ к файловой системе (примонтированные тома) может быть медленнее из-за слоя трансляции между macOS и VM.
    • Сетевой стек работает через виртуальный интерфейс.

Пример проверки архитектуры образа:

docker image inspect ubuntu:latest --format='{{.Architecture}}'
# Вывод: amd64 или arm64

Вывод: Контейнеры кроссплатформенны, но для оптимальной работы на Apple Silicon предпочтительны ARM-образы.

Ответ 18+ 🔞

Да, запустится, но не так прямо, как на линуксе, блядь. Docker — он не волшебная хуйня, которая просто так летает по воздуху. Он работает на ядре хоста, а у мака ядро — Darwin, ёпта, а не Linux. Поэтому под капотом у Docker Desktop для Mac крутится маленькая, но ёбаная виртуалка с линуксом, и уже в ней твои контейнеры и пляшут.

Так вот, сука, главные подводные камни:

  1. Архитектура процессора, ёбана в рот!

    • Если ты собрал образ под linux/amd64 (это для старых интеловских маков), то на новом маке с M1/M2 (это arm64) он запустится, но через эмуляцию Rosetta 2. Работать будет, но не так шустро, как могло бы.
    • Чтобы не ебать мозги эмуляцией, лучше сразу собирать или тянуть образы под linux/arm64. К счастью, все популярные образы сейчас — мультиархитектурные, то есть в одном теге и amd64, и arm64 лежат. Но если пишешь свой Dockerfile — указывай платформу явно, если хочешь. Или запускай с флагом: docker run --platform linux/amd64 my-image, если тебе прям позарез нужна старая архитектура.
  2. Производительность, особенно с файлами.

    • Когда ты монтируешь папку с мака внутрь контейнера (-v /Users/vasya/project:/app), то там, сука, целая цепочка: macOS -> виртуалка -> контейнер. Из-за этой хуйни работа с файлами (особенно если их много, как в node_modules) может быть ощутимо медленнее, чем на нативном линуксе. Это не баг, это фича, блядь.

Как проверить, под какую архитектуру собран образ, чтобы не быть лохом:

docker image inspect ubuntu:latest --format='{{.Architecture}}'
# Выдаст тебе либо amd64, либо arm64

Итог, Колян: Да, твой контейнер запустится на маке, это одна из основных идей Docker — переносимость. Но если ты на Apple Silicon, то гони образы под arm64 для нативной скорости, и не удивляйся, если работа с файлами через volume будет тормозить. Всё остальное — код, порты, переменные окружения — будет работать ровно так же, как и везде. Вот такая, блядь, магия, но с техническими нюансами.