Проброс портов наружу

Как сделать приложение в контейнере доступным снаружи через проброс портов.

Публикация порта — связывание порта хоста с портом контейнера флагом -p, чтобы сервис стал доступен извне.

Почему порт нужно публиковать

Контейнер изолирован: даже если приложение внутри слушает порт 80, снаружи к нему не подключиться. Чтобы открыть доступ, порт контейнера публикуют на хосте флагом -p.

Формат host:container

docker run -d -p 8080:80 nginx

Читается так: запросы на порт 8080 хоста перенаправляются на порт 80 контейнера. Порядок важен — слева хост, справа контейнер. После этого http://localhost:8080 ведёт к nginx.

ЗаписьСмысл
-p 8080:80порт 8080 хоста → порт 80 контейнера
-p 80:80одинаковые порты хоста и контейнера
-p 127.0.0.1:8080:80опубликовать только на localhost

Несколько портов

Флаг -p можно повторять, если сервис слушает несколько портов:

docker run -d -p 8080:80 -p 8443:443 nginx

Если порт уже занят

Если порт хоста занят другим процессом, Docker откажется запускать контейнер с ошибкой port is already allocated. Решение — выбрать другой порт хоста; порт контейнера менять не нужно:

# 8080 занят — публикуем на 8081
docker run -d -p 8081:80 nginx

Проверка опубликованных портов

Какие порты проброшены, видно в docker ps в колонке PORTS:

docker ps

Вывод:

CONTAINER ID   IMAGE   PORTS                  NAMES
a1b2c3d4e5f6   nginx   0.0.0.0:8080->80/tcp   my-web

Запись 0.0.0.0:8080->80/tcp означает: порт 8080 хоста проброшен на порт 80 контейнера.

Итог

  • Без публикации порты контейнера снаружи недоступны.
  • -p ХОСТ:КОНТЕЙНЕР публикует порт; слева хост, справа контейнер.
  • Флаг можно повторять для нескольких портов; занятый порт хоста — берём другой.
Проверьте себя
1. В записи -p 8080:80 какой порт принадлежит хосту?
A80
B8080
Cоба
Dни один, это диапазон
2. Что делать, если порт хоста уже занят другим процессом?
AОстановить весь Docker
BИзменить порт внутри контейнера на нестандартный
CВыбрать другой свободный порт хоста, например -p 8081:80
DНичего нельзя сделать