Давай начистоту. Docker - это про Linux. Технология контейнеров целиком стоит на ядре Linux: namespaces изолируют процессы, cgroups режут ресурсы, overlayfs собирает слои образа. Ничего из этого в ядре Windows или macOS нет и быть не может - это другие ядра. Поэтому фраза "docker windows" или "docker mac" по сути всегда означает одно: где-то рядом тихо крутится Linux-виртуалка, и именно в ней живут твои контейнеры. Твой ноутбук с Windows или MacBook - это просто красивый пульт управления.
Это не мелочь, а ключ ко всему уроку. Как только ты понимаешь, что между твоим терминалом и контейнером всегда стоит граница "хост-ОС -> виртуальная Linux-машина", сразу становятся очевидны три главные головные боли: медленный доступ к файлам через эту границу, проброс портов и томов через неё, и вопрос "а чем вообще эту виртуалку поднимать". Старый курс говорил "поставь Docker Desktop и не думай". Мы будем думать, потому что в проде и в РФ-реалиях 2026 года думать приходится.

Как устроен Docker Desktop под капотом
Docker Desktop - это не сам Docker. Это коммерческий продукт-обёртка от Docker Inc.: GUI, автообновления, дашборд, встроенный Kubernetes плюс механизм запуска той самой Linux-VM. Внутри неё работает обычный Docker Engine (демон dockerd поверх containerd и runc) - ровно тот же, что ты ставил бы на Linux-сервер. CLI на хосте (docker.exe или docker на Mac) общается с демоном внутри VM через сокет.
Дальше детали зависят от платформы.
Windows. Современный Docker Desktop использует WSL2 - Windows Subsystem for Linux второй версии. Вокруг "docker wsl2" много путаницы, поэтому разложим. WSL2 - это не эмуляция и не транслятор системных вызовов (так работала WSL1). WSL2 - это настоящее Linux-ядро, которое Microsoft собирает и запускает в очень лёгкой виртуалке поверх гипервизора Hyper-V. Docker Desktop ставит в WSL2 два своих служебных дистрибутива - docker-desktop (там крутится движок) и раньше был docker-desktop-data (хранилище образов). Твои собственные дистрибутивы (Ubuntu из Microsoft Store и т.п.) получают доступ к движку через интеграцию: в настройках Docker Desktop есть раздел "WSL Integration", где ты галочками включаешь, в каких дистрибутивах будет доступна команда docker.
Проверить, что ты реально на WSL2, можно из PowerShell:
Код: Выделить всё
wsl -l -v
Код: Выделить всё
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop Running 2
Mac. Тут всё ещё проще и сложнее одновременно. macOS контейнеры запускать не умеет, поэтому Docker Desktop поднимает Linux-VM через фреймворк виртуализации Apple - Virtualization.framework (на старых версиях и на Intel-маках исторически был HyperKit на базе xhyve). На Apple Silicon (M1-M4) это нативная аппаратная виртуализация ARM, поэтому Linux внутри VM тоже ARM64. Запомни этот момент: образ, собранный на M-маке без указания платформы, по умолчанию будет arm64, и на amd64-сервере он не запустится. Лечится это явным указанием платформы при сборке (об этом ниже и в уроке про buildx).
Лицензия Docker Desktop: где он перестаёт быть бесплатным
Это та часть, из-за которой полкоманды внезапно мигрирует на альтернативы. Сам Docker Engine, containerd, runc, BuildKit - это open source под Apache 2.0, бесплатно навсегда. А вот Docker Desktop как продукт распространяется по подписочному соглашению Docker Inc., и оно платное для крупных организаций.
Условие на 2026 год: Docker Desktop бесплатен для личного использования, обучения, open source и для компаний, у которых меньше 250 сотрудников И меньше 10 миллионов долларов годовой выручки. Как только организация переваливает хотя бы один из этих порогов - нужна платная подписка (Pro, Team или Business). Цена стартует примерно от 5-9 долларов за пользователя в месяц в зависимости от тарифа.
Два подвоха, на которых горят:
- Порог считается по организации, а не по конкретному разработчику. Сотрудник тысячной корпорации не может "поставить бесплатную версию под личным аккаунтом" - юридически лицензия всё равно нужна компании.
- Платишь ты именно за Docker Desktop (обёртку с GUI и интеграциями), а не за движок. Поставил тот же Docker Engine руками в WSL2 или в Linux-VM без Desktop - формально под это соглашение не попадаешь.
Производительность файловой системы: почему bind mount тормозит на Mac и Windows
Самая частая жалоба новичков: "на Linux всё летает, а на маке docker mac тормозит". Дело не в Docker, а в той самой границе хост-VM.
Когда ты делаешь bind mount папки с хоста внутрь контейнера:
Код: Выделить всё
docker run -v $(pwd):/app node:22 npm install
Что с этим реально делают:
- virtiofs вместо старых протоколов. Docker Desktop умеет VirtioFS - современный протокол шаринга файлов между VM и хостом, который в разы быстрее старого gRPC-FUSE. Включается в Settings -> Resources -> File sharing. На реальных бенчмарках 2025-2026 переход на virtiofs давал ускорение файловых операций в 2-3 раза.
- Не монтировать тяжёлые папки с хоста вообще. node_modules, vendor, .venv держи в именованном томе, а не в bind mount. Том живёт внутри Linux-VM на родной ext4 - никакой границы, скорость нативная. Код монтируешь bind-ом (его мало и он меняется руками), а зависимости - в volume.
- Не класть проект в /mnt/c на Windows. Это главная WSL2-граблина. Если репозиторий лежит на диске Windows (/mnt/c/...), доступ к нему из WSL2 идёт через медленный мост 9p. Перенеси проект внутрь файловой системы Linux-дистрибутива (например в ~/projects внутри Ubuntu) - и скорость вырастет на порядок. Правило простое: Linux-инструменты работают с Linux-файлами, Windows-инструменты с Windows-файлами, через границу не гоняем.
Код: Выделить всё
services:
app:
image: node:22
working_dir: /app
volumes:
- ./src:/app/src # код - bind mount, его мало
- node_modules:/app/node_modules # зависимости - том, быстро
command: npm run dev
volumes:
node_modules:
Это смысловой центр урока. Все альтернативы решают ту же задачу - поднять Linux-VM и движок, - но без лицензионных оков и часто легче и быстрее.
Colima (Mac, Linux). "colima" = Containers on Lima. Терминальный, минималистичный, на базе проекта Lima (Linux VMs на Mac). GUI нет вообще - и для многих это плюс. Ставится через Homebrew, ест мало ресурсов. Запуск с быстрым шарингом файлов на Apple Silicon:
Код: Выделить всё
colima start --vm-type vz --mount-type virtiofs --cpu 4 --memory 8
Rancher Desktop (Win, Mac, Linux). Бесплатный, open source, от SUSE. Главная фишка - встроенный Kubernetes (k3s) из коробки и выбор движка: containerd с CLI nerdctl или классический dockerd с docker CLI. На Windows "rancher desktop" использует тот же WSL2. Лучший выбор, если тебе важна локальная отладка под Kubernetes без отдельной возни.
Podman Desktop (Win, Mac, Linux). GUI поверх Podman от Red Hat. Идеологически другой: без демона (нет постоянного dockerd) и rootless по умолчанию - контейнеры запускаются без root, что заметно безопаснее. Команда podman почти стопроцентно совместима с docker (можно сделать alias docker=podman). Умеет генерировать Kubernetes-манифесты. Выбор, где во главе угла безопасность и совместимость с экосистемой Red Hat/OpenShift.
OrbStack (только Mac). Проприетарный, но с бесплатным тарифом для индивидуальных разработчиков. Главное достоинство - скорость: старт за пару секунд, минимальный расход батареи и памяти, очень быстрый файловый шаринг и сеть. Многие на маке считают его лучшей заменой Docker Desktop по ощущениям. Минус - закрытый код и не для всех бесплатно в коммерции.
Чистый WSL2 + Docker Engine (Windows). Самый "хардкорный" и полностью бесплатный путь: ставишь обычный Docker Engine руками внутрь дистрибутива WSL2, как на настоящем Linux-сервере, без Docker Desktop вообще:
Код: Выделить всё
# внутри WSL2 (Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo service docker start
docker run hello-world
Проброс портов и томов через границу
С портами магия в том, что инструменты её прячут. Когда ты пишешь:
Код: Выделить всё
docker run -p 8080:80 nginx
С томами всё тоже завязано на границу. Bind mount тянется до файлов хоста (медленно, см. выше), именованный том живёт внутри VM (быстро). В WSL2 есть ещё нюанс пути: /mnt/c/Users/... - это диск Windows через мост, а ~ - это родная Linux-ФС. Монтируй из родной.
Когда что выбирать
- Mac, хочу "поставил и забыл", фирма маленькая или личное - Docker Desktop или OrbStack (OrbStack быстрее и легче).
- Mac, терминальщик, полный контроль, бесплатно навсегда - Colima с vz+virtiofs.
- Нужен локальный Kubernetes - Rancher Desktop.
- Во главе безопасность, rootless, экосистема Red Hat - Podman Desktop.
- Windows, нужна максимальная близость к проду и ноль лицензии - чистый WSL2 + Docker Engine.
- Крупная компания (>250 человек или >10 млн выручки) - либо платный Docker Desktop, либо любая бесплатная альтернатива. В РФ из-за проблем с оплатой и доступом чаще берут вторую опцию.
- Проект на /mnt/c в WSL2. Классика тормозов. Держи код внутри Linux-ФС.
- Тяжёлые зависимости в bind mount на Mac/Win. node_modules и vendor - в именованный том, иначе install идёт минутами.
- "Бесплатный" Docker Desktop в большой компании. Это нарушение лицензии, а не лайфхак. Юристы вашего работодателя такое не любят.
- Образ собран на Apple Silicon без --platform. Получишь arm64, на amd64-сервере он не запустится. Указывай docker build --platform linux/amd64 или собирай мультиарх через buildx.
- Раздутая VM. По умолчанию виртуалка может отъесть много RAM. Ограничивай ресурсы в настройках или флагами (Colima --cpu/--memory), особенно на ноутбуке.
- Смешивание движков. Поставил и Docker Desktop, и Colima/Rancher - и не понимаешь, к какому демону цепляется docker. Проверяй docker context ls и активный контекст.
- Узнай, где живёт твой движок: docker context ls и docker info (поле "Operating System" покажет Linux, даже если ты на Mac/Windows - вот она, VM).
- На Windows: wsl -l -v, убедись что версия 2. Положи тестовый проект сначала в /mnt/c, потом в ~ внутри Ubuntu и сравни время npm install в контейнере.
- Сравни bind mount и том: подними один контейнер с -v $(pwd):/app, другой с именованным томом, прогони установку зависимостей и засеки время.
- Проверь проброс: docker run -d -p 8080:80 nginx, открой http://localhost:8080, посмотри docker ps - колонку PORTS.
- Если на Mac - поставь Colima (brew install colima docker), запусти colima start --vm-type vz --mount-type virtiofs и убедись, что docker ps работает без Docker Desktop вообще.
- Почему Docker на Windows и Mac всегда подразумевает запущенную Linux-виртуалку, и что конкретно она содержит?
- Чем отличается доступ к файлам через bind mount от именованного тома на Mac/Win, и почему второй быстрее?
- При каких порогах организации Docker Desktop перестаёт быть бесплатным, и платишь ли ты за сам движок?
- Когда выберешь Rancher Desktop, когда Colima, а когда чистый WSL2 + Docker Engine?
Запомни главное: на не-Linux Docker - это всегда пульт + спрятанная Linux-VM, и почти все боли (тормоза ФС, проброс портов и томов) растут из границы между хостом и этой виртуалкой. Docker Desktop удобен, но платен для крупных и непрост по доступу в РФ. Бесплатные colima, rancher desktop, Podman Desktop, OrbStack и чистый WSL2 + Engine закрывают те же задачи - выбирай под сценарий: терминал, Kubernetes, безопасность, скорость или близость к проду.