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

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

Публикация порта — связывание порта хоста с портом контейнера флагом -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Выбрать другой свободный порт хоста, например -p 8081:80
CИзменить порт внутри контейнера на нестандартный
DНичего нельзя сделать
Поддержать проект