Ошибка port is already allocated
Ошибка при 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, уже занят. Первая обычно значит, что его занял другой контейнер, вторая — что обычная программа на хосте.
Найдите, кто занял порт
Сначала среди контейнеров:
docker ps --filter publish=8080Если контейнер нашёлся — это он. Часто это старый экземпляр того же сервиса или контейнер из другого проекта Compose. Остановите или удалите его, если он не нужен:
docker stop имя-контейнераЕсли контейнеров нет, ищите программу на хосте:
sudo ss -tlnp | grep ':8080 'В конце строки будет имя программы и её номер процесса, например users:(("nginx",pid=1234,fd=6)). Часто порт 80 занимают Nginx или Apache, установленные прямо в систему, порт 3306 — MySQL, 5432 — PostgreSQL.
Решения
Выберите решение по тому, кто занял порт:
Порт нужен тому, кто его занялвозьмите другой порт хоста
Порт внутри контейнера оставьте прежним, поменяйте только первый:
docker run -d --name web2 -p 8081:80 nginx:alpineВ Compose — то же в разделе ports: "8081:80".
Порт держит ненужная служба системыостановите её
Если порт занимает служба, установленная прямо в систему, и она не нужна:
sudo systemctl stop nginx
sudo systemctl disable nginxПрежде чем останавливать службу, убедитесь, что она не нужна: на сервере это может быть рабочий сайт или база данных. disable убирает её из автозапуска.
Порт держит старый контейнерудалите его
Если порт держит прежняя версия вашего же сервиса — удалите её перед запуском новой (docker rm -f старое-имя) или запускайте сервис через Compose: он сам пересоздаёт контейнеры, не оставляя старых.
Особые случаи
- Порт освободился, а ошибка осталась. Бывает, что порт остаётся «за Docker» после сбоя. Перезапустите службу:
sudo systemctl restart docker(контейнеры при этом перезапустятся). - Два одинаковых проекта Compose. Если скопировать папку проекта под другим именем и запустить, это будет второй проект с теми же портами. Остановите первый (
docker compose downв его папке) или поменяйте порты. - Windows. Часть портов может быть зарезервирована системой (их показывает
netsh interface ipv4 show excludedportrange protocol=tcp); возьмите порт вне этих диапазонов.