Маппинг портов (-p / -P)
Тема дорожной карты · Docker & Containers
По умолчанию docker run не публикует порты наружу — они остаются изолированными в network namespace контейнера. Чтобы пробросить конкретный порт, используйте -p hostPort:containerPort[/proto], например -p 8080:80 или -p 127.0.0.1:5432:5432 (только на localhost). Флаг -P (заглавная) автоматически публикует все EXPOSE-нутые порты на случайные свободные порты хоста; их видно через docker port. Грабли: режим host-сети игнорирует -p; биндинг на 0.0.0.0 открывает сервис в LAN и обходит многие host-фаерволы, поскольку Docker пишет собственные правила iptables.
Как это работает
Маппинг портов (-p / -P) создаёт виртуальные сети для общения контейнеров между собой. Дефолтный bridge (bridge) даёт каждому контейнеру IP, но не имеет DNS-discovery по имени. User-defined bridge (docker network create mynet) добавляет автоматический DNS — контейнеры достижимы по имени. Host networking (--network host) пропускает namespace; контейнер делит сетевой стек хоста. Overlay-сети — для multi-host Swarm. Публикация портов (-p 8080:80) — NAT с хоста на контейнер.
Когда применять
Всегда создавайте именованную user-defined сеть для compose-стеков (compose делает сам) — DNS-discovery бьёт жонглирование IP. Host networking — только для raw kernel-производительности или конкретного порта, который NAT не переводит. Публикуйте только порты, нужные внешнему миру; остальное живёт во внутренней сети. Для service-to-service трафика в production предпочитайте DNS-имена hardcoded IP — контейнеры приходят и уходят.
Типичные ошибки
Ловушки Маппинг портов (-p / -P): публикация всех портов (docker run -P) без раздумий и выставление внутренних сервисов в интернет; дефолтная сеть bridge и удивление, что DNS не работает (переходите на user-defined); путаница EXPOSE (только документация) и -p (реальный NAT); непонимание, что localhost внутри контейнера — это сам контейнер, не хост (используйте host.docker.internal в Desktop, --add-host в Linux). docker network inspect mynet — когда трафик идёт не туда.