Глиф Учебники

Как пробросить порт в контейнер

Справочник · Docker · 2 минуты чтения

Bash
docker run -d --name web -p 8080:80 nginx:alpine

-p 8080:80 — порт 8080 на хосте ведёт в порт 80 внутри контейнера. Сначала порт хоста, потом порт программы в контейнере. Теперь сайт открывается по адресу http://адрес-сервера:8080.

Варианты

ЗаписьЧто делает
-p 80:80порт 80 хоста → 80 контейнера
-p 8080:80 -p 8443:443несколько портов
-p 127.0.0.1:8080:80только для самого хоста — снаружи недоступен
-p 192.168.1.10:8080:80только на одном адресе хоста
-p 1194:1194/udpпорт UDP
-Pвсе порты из EXPOSE образа на случайные свободные порты хоста

Какой порт слушает программа в контейнере, написано в описании образа на Docker Hub или в его Dockerfile (инструкция EXPOSE).

В Docker Compose

YAML
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
      - "127.0.0.1:8443:443"

Значения пишите в кавычках. После правки файла — docker compose up -d.

Проверить

Bash
docker port web
curl -I http://localhost:8080

docker port показывает, какие порты контейнера куда опубликованы. curl -I должен вернуть ответ сервера, например HTTP/1.1 200 OK.

Добавить порт к готовому контейнеру

Порты задаются при создании контейнера, и у существующего контейнера их не добавить. Удалите контейнер и создайте заново с нужным -p — данные в томах сохранятся:

Bash
docker rm -f web
docker run -d --name web -p 8080:80 -p 8443:443 nginx:alpine

Порт опубликован, а не открывается

Порт, опубликованный без адреса (-p 8080:80), доступен из всей сети, и на Linux Docker открывает его в обход ufw. Базы данных и панели управления так не публикуйте: либо -p 127.0.0.1:…, либо вообще без -p — другие контейнеры в той же сети Docker достучатся и так. Подробно — в справке Docker открывает порты в обход ufw.

EXPOSE — не публикация

Инструкция EXPOSE 80 в Dockerfile и строка 80/tcp в docker ps только сообщают, какой порт слушает программа. Снаружи такой порт закрыт, пока его не опубликуют ключом -p или в разделе ports Compose.