Короткий ответ
Флаг -p HOST_PORT:CONTAINER_PORT команды docker run настраивает переадресацию трафика с порта хоста на порт внутри контейнера через правила iptables/NAT, делая сервис контейнера доступным снаружи.
Как это работает подробнее
контейнер в режиме bridge находится в изолированной подсети и по умолчанию недостижим снаружи хоста. Публикация порта создаёт правило трансляции адресов (DNAT) на хосте: обращения на host_port перенаправляются на IP контейнера и container_port внутри виртуальной сети.
Пример кода
Пример конфигурации
$ docker run -d -p 8080:80 nginx
$ curl http://localhost:8080Что использовать на практике
- Практика. можно опубликовать порт на все интерфейсы хоста (
-p 8080:80) или только на конкретный IP (-p 127.0.0.1:8080:80, чтобы сервис был доступен только локально); флаг-P(заглавная) публикует всеEXPOSE-порты образа на случайные свободные порты хоста.
Подводные камни
- Риск. путают
EXPOSEв Dockerfile с реальной публикацией порта —EXPOSEлишь документирует, какой порт слушает приложение внутри образа, и не публикует его автоматически; забывают, что при публикации на все интерфейсы (0.0.0.0) порт может стать доступен из внешней сети, если хост не защищён файрволом.