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

Ошибка port is already allocated

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

Ошибка при docker run -p … или docker compose up выглядит примерно так:

Текст
Bind for 0.0.0.0:8080 failed: port is already allocated

Или так:

Текст
listen tcp4 0.0.0.0:80: bind: address already in use

Обе значат одно: порт на хосте, который вы указали первым в -p 8080:80, уже занят. Первая обычно значит, что его занял другой контейнер, вторая — что обычная программа на хосте.

Найдите, кто занял порт

Сначала среди контейнеров:

Bash
docker ps --filter publish=8080

Если контейнер нашёлся — это он. Часто это старый экземпляр того же сервиса или контейнер из другого проекта Compose. Остановите или удалите его, если он не нужен:

Bash
docker stop имя-контейнера

Если контейнеров нет, ищите программу на хосте:

Bash
sudo ss -tlnp | grep ':8080 '

В конце строки будет имя программы и её номер процесса, например users:(("nginx",pid=1234,fd=6)). Часто порт 80 занимают Nginx или Apache, установленные прямо в систему, порт 3306 — MySQL, 5432 — PostgreSQL.

Решения

Выберите решение по тому, кто занял порт:

Порт нужен тому, кто его занялвозьмите другой порт хоста

Порт внутри контейнера оставьте прежним, поменяйте только первый:

Bash
docker run -d --name web2 -p 8081:80 nginx:alpine

В Compose — то же в разделе ports: "8081:80".

Дальше: «Особые случаи»

Порт держит ненужная служба системыостановите её

Если порт занимает служба, установленная прямо в систему, и она не нужна:

Bash
sudo systemctl stop nginx
sudo systemctl disable nginx

Прежде чем останавливать службу, убедитесь, что она не нужна: на сервере это может быть рабочий сайт или база данных. disable убирает её из автозапуска.

Дальше: «Особые случаи»

Порт держит старый контейнерудалите его

Если порт держит прежняя версия вашего же сервиса — удалите её перед запуском новой (docker rm -f старое-имя) или запускайте сервис через Compose: он сам пересоздаёт контейнеры, не оставляя старых.

Особые случаи