#Что означает ошибка
Bind for 0.0.0.0:80 failed: port is already allocated
При запуске контейнера с публикацией порта (-p 80:80) Docker не может связать порт хоста, потому что он уже используется: другим контейнером, процессом на хосте (nginx, Apache, IIS, Skype) либо остатками остановленного контейнера. Сообщение называет порт — это основа диагностики: определите, кто его занял, и решите, что остановить или куда переместить новый контейнер.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Занят другим контейнеромДругой контейнер публикует тот же порт. | docker ps показывает 0.0.0.0:80->80. | Остановите или измените порт. |
| Занят процессом на хостеСлужба на хосте слушает порт. | ss -tlnp показывает процесс. | Остановите службу. |
| Остатки старого контейнераСтарый контейнер не удалён. | docker ps -a содержит контейнер. | Удалите. |
| Конфликт в docker-composeДва сервиса используют один порт. | Дубли в ports:. | Измените порты. |
#Пошаговое решение
- Определите портПрочитайте сообщение Docker целиком: после
Bind for 0.0.0.0:80 failedуказан занятый порт хоста (здесь 80). Это НЕ порт контейнера. Откройте терминал в каталоге сcompose.yamlили проектом Docker и найдите записьports, например"80:80"означает «хост:контейнер». Сначала определите, какой сервис должен принимать внешний трафик; один порт хоста нельзя одновременно назначить двум процессам на том же адресе. - Проверьте контейнерыВ терминале выполните
docker ps --format "table {{.Names}}\t{{.Ports}}". Найдите контейнер, публикующий0.0.0.0:80->..., и запишите его имя. Если порт занят этим контейнером и он обслуживает рабочий сайт, не останавливайте его без согласования. Для Compose проверьте проект черезdocker compose psв его каталоге; контейнеры, запущенные другим проектом, не трогайте. - Проверьте процессы хостаЕсли контейнеров на порту 80 нет, на Linux выполните
sudo ss -ltnp '( sport = :80 )'в терминале сервера: поusers:(...)определите процесс. На Windows в PowerShell выполнитеGet-NetTCPConnection -LocalPort 80 -State Listen | Select LocalAddress,OwningProcess; затемGet-Process -Id НОМЕР, подставив фактический идентификатор. Иногда порт принадлежит Nginx, Apache или IIS — остановка их служб разорвёт доступ к работающим сайтам. - Остановите занявший процессОстанавливать занятую службу допускается только если точно известно, что она не нужна. Для контейнера в терминале выполните
docker stop имя_контейнерапосле подтверждения у владельца; для системного веб-сервера планируйте окно обслуживания. После остановки снова проверьте список слушающих портов. Если порт принадлежит рабочему прокси, предпочтительнее оставить его и изменить публикацию нового контейнера. - Удалите остаткиУдалять контейнер или выполнять
docker compose downдля освобождения порта обычно НЕ нужно; остановленный контейнер порт не занимает.docker rmудаляет контейнер и его доступный только внутри файловой системы слой, хотя именованные тома обычно остаются. Если послеdocker stopпорт не освободился, найдите другой слушающий процесс по шагу 3, а не удаляйте контейнеры вслепую. - Или измените портАльтернатива остановке существующего сайта — изменить порт хоста. В
compose.yamlизмените только левую часть парыports: - "8080:80"(8080 — хост, 80 — контейнер), сохраните и выполнитеdocker compose up -dв каталоге проекта. Проверьтеdocker compose psиhttp://адрес_сервера:8080; при изменении публичного порта настройте прокси и брандмауэр только если это согласовано. Если 8080 тоже занят, выберите другой свободный порт. - Для Windows проверьте IIS и SkypeНа Windows, если порт 80 занят системным процессом или IIS, в PowerShell от администратора можно просмотреть
Get-Service W3SVC, а также IIS Manager (если установлен). Не останавливайте W3SVC без проверки сайтов в IIS: он может обслуживать другие приложения. Старые рекомендации про Skype не универсальны; опирайтесь на реальныйOwningProcessи слушающий адрес. - Перезапустите DockerПерезапуск Docker Engine затрагивает все контейнеры и обычно не исправляет порт, реально занятый другим процессом. Если после удаления конфликтующей публикации Docker продолжает сообщать о занятом порте, сначала перепроверьте
docker ps,ss/Get-NetTCPConnectionи логи службы; только администратор может запланировать перезапуск движка в окно обслуживания. После действий повторите запуск и проверьте доступность приложения. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
В Windows порт 80 часто занят системой (PID 4) из-за службы HTTP.sys: определите конкретную службу по PID/HTTP.sys и согласуйте действия с администратором; безопаснее использовать другой свободный порт. Если вы запускаете контейнеры от прошлых проектов, проверьте docker network ls и удалите неиспользуемые сети (docker network prune). Для разработки удобнее публиковать порты на нестандартных значениях (8080, 8443) и проксировать через единый обратный прокси (Traefik, nginx). Документация — .
Если порт «занят», но ss и docker ps ничего не показывают, возможно, остался прокси-процесс docker-proxy от удалённого контейнера: ps aux | grep docker-proxy покажет его, а перезапуск Docker (sudo systemctl restart docker) освободит порт. В Docker Desktop для Windows порт может зарезервировать Hyper-V: проверьте netsh interface ipv4 show excludedportrange protocol=tcp и выберите порт вне диапазона. Для постоянной работы фиксируйте порты в docker-compose.yml, чтобы не получать конфликт при каждом запуске.