Docker открывает порт мимо ufw: как закрыть порт контейнера
Ошибки нет, но порт контейнера виден из интернета, хотя ufw его не разрешает. Так устроен Docker: его правила срабатывают раньше ufw. Закройте порт, привязав его к 127.0.0.1.
Содержание 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.
Источники
- Документация Docker: Docker и фаервол — почему Docker и ufw несовместимы.
- Документация Docker: публикация портов — опубликованный порт открыт для всех, привязка к 127.0.0.1.
- Документация Docker: docker run — публикация портов, флаг --rm и коды выхода.
- Документация Docker: docker compose up — запуск и пересоздание контейнеров.
- Исходный код Docker CLI 29.1.3: container.go — как docker ps показывает колонку PORTS.
Сверено 10 октября 2026 года.
Что почитать дальше
- Как открыть порт на VPS — команды ufw и фаервол в панели провайдера.
- Все ошибки Docker.
- VPS для разработчика: порты только на 127.0.0.1.
- Как разместить сайт на VPS.
- Порт уже занят: port is already allocated.
Проверено и обновлено: 10.10.2026