Проброс портов наружу
Как сделать приложение в контейнере доступным снаружи через проброс портов.
Публикация порта — связывание порта хоста с портом контейнера флагом
-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 ХОСТ:КОНТЕЙНЕРпубликует порт; слева хост, справа контейнер.- Флаг можно повторять для нескольких портов; занятый порт хоста — берём другой.