Docker: port is already allocated и address already in use — как освободить порт
Порт, который вы указали в -p или в ports, уже занят — другим контейнером или программой на сервере. Найдите, кто его держит, и освободите порт или возьмите другой.
Содержание 8
Как выглядит ошибка
Порт занят другим контейнером:
docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web (…): Bind for 0.0.0.0:80 failed: port is already allocatedПорт занят программой на самом сервере — например, nginx или Apache:
docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web (…): failed to bind host port 0.0.0.0:80/tcp: address already in useweb — имя контейнера, в скобках — его длинный номер. 0.0.0.0:80 — адрес и порт на сервере, которые вы просили открыть. У docker compose up начало сообщения другое, а конец — те же слова.
Что значит -p 8080:80
В команде docker run -p 8080:80 … первое число — порт на сервере, второе — порт внутри контейнера. Занят бывает именно первый: внутри у каждого контейнера свои порты, а на сервере один порт может слушать только одна программа. В compose-файле то же самое записано в разделе ports, например "8080:80".
Шаг 1. Проверьте контейнеры
Команды на этой странице вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
docker psПосмотрите колонку PORTS. Запись 0.0.0.0:80->80/tcp значит, что этот контейнер уже занял порт 80 на сервере. Имя контейнера — в последней колонке NAMES.
Если это старая копия того же приложения и она не нужна, остановите её — вместо web-old подставьте имя из колонки NAMES:
docker stop web-oldЕсли контейнер запущен через docker compose, остановите его в папке того проекта:
docker compose downОна удаляет контейнеры и сети проекта, а именованные тома с данными оставляет.
Шаг 2. Если в docker ps порта нет — ищите программу
sudo ss -ltnpНайдите строку, где в четвёртой колонке стоит ваш порт — например :80. Имя программы — в конце строки, в кавычках после users::
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))Здесь порт 80 занял nginx. Если он вам нужен — а он принимает посетителей сайта, — не останавливайте его, а дайте контейнеру другой порт (шаг 3). Если программа не нужна, как её остановить и убрать из автозапуска, разобрано на странице nginx: Address already in use.
Шаг 3. Или возьмите другой порт
Контейнер с ошибкой уже создан, но не запущен. Удалите его, иначе новый запуск с тем же именем упрётся в ошибку занятого имени:
docker rm webИ запустите заново со свободным портом — вместо myapp подставьте свой образ:
docker run -d --name web -p 127.0.0.1:8080:80 myapp127.0.0.1: перед портом значит, что порт 8080 будет доступен только с самого сервера. Наружу сайт отдаёт nginx: он принимает посетителей на порту 80 и передаёт запросы контейнеру — как это настроить, рассказано в статье Как разместить сайт на VPS. Если порт нужен снаружи напрямую, прочтите сначала, как Docker открывает порты мимо ufw.
В compose-файле то же самое выглядит так:
ports:
- "127.0.0.1:8080:80"После правки файла запустите проект снова:
docker compose up -dКак проверить
docker psУ вашего контейнера в колонке STATUS должно стоять Up, а в колонке PORTS — новый порт. Ответ самого приложения покажет команда:
curl -I http://127.0.0.1:8080Первая строка ответа вида HTTP/1.1 200 OK значит, что приложение отвечает.
Тексты ошибок сверены с исходным кодом Docker 29.1.3 — эта версия ставится из пакетов Ubuntu 24.04. В Docker 28 и более старых версиях часть сообщений звучит иначе.
Источники
- Исходный код Docker 29.1.3: portallocator.go — текст port is already allocated: порт уже отдан контейнеру.
- Исходный код Docker 29.1.3: osallocator_linux.go — текст failed to bind host port: порт занят программой на сервере.
- Исходный код Docker 29.1.3: endpoint.go — начало сообщения driver failed programming external connectivity.
- Исходный код Docker CLI 29.1.3: container.go — колонки PORTS и NAMES в docker ps.
- Документация Docker: docker run — публикация портов, флаг --rm и коды выхода.
- Документация Docker: docker compose down — что удаляется при остановке проекта.
- Документация Docker: публикация портов — опубликованный порт открыт для всех, привязка к 127.0.0.1.
Сверено 10 октября 2026 года.
Что почитать дальше
- Как узнать, какая программа заняла порт — если порт занят не контейнером.
- Все ошибки Docker.
- Docker открывает порт мимо ufw.
- VPS для разработчика: порты только на 127.0.0.1.
- Как разместить сайт на VPS.
Проверено и обновлено: 10.10.2026