Ошибки

Docker: port is already allocated и address already in use — как освободить порт

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

Обновлено 10.10.2026≈ 5 мин чтения
Содержание 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 use

web — имя контейнера, в скобках — его длинный номер. 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 myapp

127.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 и более старых версиях часть сообщений звучит иначе.

Источники

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

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

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