Ошибки

Docker открывает порт мимо ufw: как закрыть порт контейнера

Ошибки нет, но порт контейнера виден из интернета, хотя ufw его не разрешает. Так устроен Docker: его правила срабатывают раньше ufw. Закройте порт, привязав его к 127.0.0.1.

Обновлено 10.10.2026≈ 4 мин чтения
Содержание 8

Что происходит

Вы запустили контейнер с -p 8080:80 или с "8080:80" в compose-файле. В выводе sudo ufw status порта 8080 нет, но по адресу http://IP-сервера:8080 контейнер открывается из любой точки интернета. То же с базой данных: строка "5432:5432" откроет базу всему интернету.

Документация Docker прямо называет Docker и ufw несовместимыми. Трафик к опубликованным портам контейнеров Docker перенаправляет своими правилами раньше, чем до него доходят правила ufw. А порт без адреса Docker публикует на 0.0.0.0 — для всех.

Шаг 1. Посмотрите, какие порты открыты

Команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.

docker ps

Посмотрите колонку PORTS:

  • 0.0.0.0:8080->80/tcp — порт 8080 открыт для всех;
  • 127.0.0.1:8080->80/tcp — порт доступен только с самого сервера;
  • пусто — порт не опубликован, снаружи до контейнера не достучаться.

Шаг 2. Привяжите порт к 127.0.0.1

Если контейнер запущен командой docker run, удалите его и запустите заново, добавив перед портом 127.0.0.1: — вместо myapp подставьте свой образ, а остальные параметры оставьте как были:

docker stop web
docker rm web
docker run -d --name web -p 127.0.0.1:8080:80 myapp

Если в контейнере есть данные, перед удалением проверьте, где они хранятся — как это сделать, сказано на странице имя контейнера занято.

Если проект запущен через docker compose, поправьте строку в разделе ports compose-файла:

    ports:
      - "127.0.0.1:8080:80"

И запустите проект снова в его папке — Compose сам пересоздаст изменённый контейнер:

docker compose up -d

Порт базы данных публиковать не нужно вовсе: внутри одного проекта Compose контейнеры видят друг друга по имени сервиса. Если строка с портом базы нужна для подключения со своего компьютера, тоже привяжите её к 127.0.0.1.

Как сайт будет открываться снаружи

Посетителей принимает nginx на самом сервере — на портах 80 и 443 — и передаёт запросы контейнеру на 127.0.0.1:8080. Как настроить nginx и HTTPS, рассказано в статье Как разместить сайт на VPS. Порты 80 и 443 должны быть разрешены в ufw.

Как проверить

docker ps

В колонке PORTS должно стоять 127.0.0.1:8080->80/tcp. С самого сервера контейнер отвечает:

curl -I http://127.0.0.1:8080

А на своём компьютере откройте терминал и выполните ту же команду с адресом сервера — вместо 203.0.113.10 подставьте его IP:

curl -I --max-time 5 http://203.0.113.10:8080

Теперь curl должен ответить ошибкой подключения, а не строкой HTTP/1.1.

Держите Docker свежим

В версиях Docker до 28.0.0 до портов на 127.0.0.1 могли достучаться не только сам сервер, но и машины из того же сегмента сети. Узнать версию — docker version, строка Version в разделе Server.

Источники

Сверено 10 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 10.10.2026