Как работают сети контейнеров на Mac
macOS не может запускать Linux-контейнеры напрямую, поэтому каждое контейнерное приложение на Mac запускает их в Linux и передаёт трафик между ним и Mac. Важны три пути:
- Входящий трафик: опубликованный порт на Mac перенаправляет соединение в контейнер.
- Исходящий трафик: контейнер открывает соединение с интернетом, корпоративной сетью или сервисом на Mac.
- Имена: контейнер разрешает имя хоста.
Когда эти пути обходят собственную сеть Mac, маршруты VPN не действуют, внутренние имена хостов не разрешаются, а межсетевой экран не видит, какое приложение обменивается данными. Oxcart устроен так, чтобы этого не происходило.
Исходящий трафик: VPN, DNS и межсетевой экран продолжают действовать
Oxcart перенаправляет исходящий TCP из контейнеров и шагов сборки, IPv4 и IPv6, на Mac, который открывает соединение своими сокетами. Таблица маршрутизации Mac определяет путь, включая маршруты, установленные VPN-клиентом. Oxcart не меняет маршруты Mac, настройки VPN или межсетевого экрана.
Запросы адресов (A и AAAA) используют системный резолвер macOS, включая /etc/hosts и выбор резолвера, настроенный VPN, поэтому корпоративные имена разрешаются в контейнерах так же, как в браузере. Имена контейнеров остаются в пределах своих сетей Docker, а DNS работает по UDP и TCP.
Little Snitch, LuLu и агенты защиты конечных устройств
Сетевой фильтр часто задерживает первое соединение новой программы примерно на две секунды, пока спрашивает вас. Oxcart этого не ждёт: соединения идут по резервному пути, пока основной канал не проверен; медленное или неудачное соединение автоматически переходит на резервный путь, а три сбоя подряд отключают канал на 30 секунд до новой проверки. Разрешите Oxcart в фильтре один раз, и дальше будут действовать его правила.
Входящий трафик: опубликованные порты
Публикуйте порты с обычным синтаксисом Docker:
# Mac loopback only (recommended for development)
docker run -d -p 127.0.0.1:8080:80 nginx
# Ephemeral host port, UDP
docker run -d -p 127.0.0.1::9000/udp my-udp-service
# IPv4 and IPv6 listeners on the Mac
docker run -d -p "[::]:8080:80" nginx Привязка без адреса слушает на всех IPv4-адресах Mac, поэтому доступна другим машинам в сети, если межсетевой экран macOS их не блокирует. TCP и UDP могут использовать один номер порта хоста. Опубликованные слушающие сокеты освобождаются при остановке контейнера.
Опубликованные порты также отвечают на localhost самого движка, поэтому реестр в контейнере работает как цель для push:
docker run -d -p 127.0.0.1:5000:5000 --name registry registry:2
docker tag my-app localhost:5000/my-app
docker push localhost:5000/my-app Раздел Ports: почему порт не отвечает
Раздел Ports в Oxcart показывает все слушающие сокеты на Mac и все порты контейнеров, сгруппированные по репозиторию, рабочему дереву и ветке, чтобы две копии одного проекта не смешивались. У каждой привязки есть состояние готово, ожидание или ошибка с причиной:
- адрес уже занят на Mac;
- сервер внутри контейнера слушает только на
127.0.0.1; - на этом порту пока ничто не слушает.
Порты, доступные другим машинам, отмечены. Агент программирования видит те же данные через MCP-инструмент Oxcart ports; см. Docker для ИИ-агентов программирования.
Доступ к Mac из контейнера
host.docker.internal разрешается в контейнерах и шагах сборки и даёт доступ по TCP к сервисам на 127.0.0.1 Mac. Направьте контейнер на базу данных или сервер разработки, работающий нативно на Mac:
docker run --rm curlimages/curl http://host.docker.internal:3000/health Считайте это намеренно открытым доступом: любой запущенный контейнер может так обращаться к сервисам на loopback Mac, поэтому не оставляйте административные сервисы без аутентификации на 127.0.0.1, пока запускаете контейнеры, которым не доверяете.
Зашифрованный канал между Mac и движком
Трафик между Mac и Linux проходит через виртуальную сеть, которую macOS разделяет с другими средствами виртуализации на том же Mac. Oxcart передаёт опубликованный и исходящий TCP по этому каналу внутри TLS 1.3 (TLS_AES_128_GCM_SHA256), с привязкой к сертификату, заново создаваемому при каждом запуске движка, и новым 256-битным bearer-токеном на каждый запуск. Неверный токен закрывает соединение, а сторона Linux закрывает соединения не с адреса Mac ещё до начала TLS.
От чего это защищает: другое ПО в общей сети может подменять адреса, чтобы читать или внедрять трафик либо открывать новые соединения с контейнерами. Межсетевой экран гостевой системы также закрывает ему доступ к неопубликованным портам контейнеров и внутреннему резолверу. Шифрование на этом канале имеет цену, и мы сознательно её приняли. Сам API Docker никогда не передаётся по сети: это частный Unix-сокет, а без опубликованных портов Oxcart не держит TCP- или UDP-сокетов на Mac.
Текущие ограничения
- Сетевой режим host (
--network host) и IPv6-сети контейнеров не реализованы; контейнеры имеют IPv4-адреса. host.docker.internalпередаёт TCP; UDP к шлюзу хоста не реализован.- Опубликованные TCP и UDP не сохраняют адрес клиента: контейнер видит стороной соединения Linux.
- DNS-записи не для адресов (например, SRV и TXT) используют резолверы DHCP сети вместо раздельного DNS macOS.
Устранение неполадок
| Симптом | Вероятная причина | Решение |
|---|---|---|
Отказ в соединении на localhost:PORT | Сервер слушает на 127.0.0.1 внутри контейнера | Слушайте на 0.0.0.0; раздел Ports указывает на этот случай |
| "port is already allocated" | Порт хоста занят другим процессом или контейнером | Выберите другой порт хоста; раздел Ports показывает владельца |
| Внутреннее имя хоста не разрешается в контейнере | Имя есть только в DNS вашей VPN | Подключите VPN на Mac; запросы адресов используют резолвер Mac |
| Контейнер не может обратиться к серверу разработки на Mac | Используется localhost внутри контейнера | Используйте host.docker.internal |
| Первое скачивание замирает на пару секунд | Сетевой фильтр спрашивает о новом соединении | Разрешите Oxcart один раз; тем временем соединения идут по резервному пути |
| Коллеги могут обращаться к вашему порту разработки | Опубликован без адреса | Публикуйте на 127.0.0.1 |
Вопросы
Используют ли Docker-контейнеры на Mac мою VPN?
В Oxcart — да. Исходящие соединения контейнеров открывает сам Mac, поэтому на них действуют его маршруты, VPN, раздельный DNS для запросов адресов и межсетевой экран для приложений. Oxcart не меняет маршруты Mac, настройки VPN или межсетевого экрана.
Как обратиться к сервису на Mac из контейнера?
Используйте host.docker.internal. В Oxcart он даёт доступ по TCP к сервисам на 127.0.0.1 Mac из контейнеров и шагов сборки. --add-host mac:host-gateway задаёт другое имя для того же адреса.
Почему контейнер работает, но его порт недоступен?
Обычно сервер внутри контейнера слушает на 127.0.0.1, куда опубликованные порты не ведут; настройте прослушивание на 0.0.0.0. Другие причины — занятый порт хоста или пока отсутствующий слушатель. Раздел Ports в Oxcart показывает конкретную причину.
Работает ли Oxcart с Little Snitch и LuLu?
Да. Когда сетевой фильтр задерживает первое соединение Oxcart, пока спрашивает вас, соединения идут по резервному пути до проверки основного канала, поэтому ничего не ломается и не ждёт ответа. Медленное или неудачное соединение автоматически переходит на резервный путь.
Шифруется ли трафик контейнеров на моём Mac?
Опубликованный и исходящий TCP между Mac и движком Oxcart передаётся внутри TLS 1.3 с привязкой к сертификату, создаваемому при каждом запуске движка, и 256-битным токеном на запуск. Это защищает канал от других средств виртуализации в общей сети Mac. Трафик в интернет защищается средствами самого приложения, например HTTPS.
Видны ли мои опубликованные порты другим машинам в сети?
Порт, опубликованный без адреса, слушает на всех IPv4-адресах Mac, поэтому другие машины могут обращаться к нему, если их не блокирует межсетевой экран macOS. Публикуйте на 127.0.0.1, чтобы ограничить доступ своим Mac. Oxcart отмечает порты, доступные другим машинам.
Поддерживает ли Oxcart сеть host или IPv6 для контейнеров?
Нет. Сетевой режим host и IPv6-сети контейнеров не реализованы. У контейнеров IPv4-адреса; при этом порты можно публиковать на IPv6 через "[::]:8080:80".
Источники и методика
Описанное сетевое поведение проверено в Oxcart 10 октября 2026 года, включая исходящий TCP, DNS, опубликованные порты, доступ к хосту и TLS на канале между Mac и контейнерами.