Docker LinuxWindows

Docker: Bind for 0.0.0.0:80 failed: port is already allocated

  • Обновлено
  • Чтение ≈ 4 минуты
  • Нужны права администратора

Краткий ответ

Ошибка Docker «Bind for 0.0.0.0:80 failed: port is already allocated» возникает, когда порт занят другим контейнером или процессом. Найдите занявшего порт через docker ps и ss, остановите его или смените порт.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение

#Что означает ошибка

Сообщение
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:.Измените порты.

#Пошаговое решение

  1. Определите портПрочитайте сообщение Docker целиком: после Bind for 0.0.0.0:80 failed указан занятый порт хоста (здесь 80). Это НЕ порт контейнера. Откройте терминал в каталоге с compose.yaml или проектом Docker и найдите запись ports, например "80:80" означает «хост:контейнер». Сначала определите, какой сервис должен принимать внешний трафик; один порт хоста нельзя одновременно назначить двум процессам на том же адресе.
  2. Проверьте контейнерыВ терминале выполните docker ps --format "table {{.Names}}\t{{.Ports}}". Найдите контейнер, публикующий 0.0.0.0:80->..., и запишите его имя. Если порт занят этим контейнером и он обслуживает рабочий сайт, не останавливайте его без согласования. Для Compose проверьте проект через docker compose ps в его каталоге; контейнеры, запущенные другим проектом, не трогайте.
  3. Проверьте процессы хостаЕсли контейнеров на порту 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 — остановка их служб разорвёт доступ к работающим сайтам.
  4. Остановите занявший процессОстанавливать занятую службу допускается только если точно известно, что она не нужна. Для контейнера в терминале выполните docker stop имя_контейнера после подтверждения у владельца; для системного веб-сервера планируйте окно обслуживания. После остановки снова проверьте список слушающих портов. Если порт принадлежит рабочему прокси, предпочтительнее оставить его и изменить публикацию нового контейнера.
  5. Удалите остаткиУдалять контейнер или выполнять docker compose down для освобождения порта обычно НЕ нужно; остановленный контейнер порт не занимает. docker rm удаляет контейнер и его доступный только внутри файловой системы слой, хотя именованные тома обычно остаются. Если после docker stop порт не освободился, найдите другой слушающий процесс по шагу 3, а не удаляйте контейнеры вслепую.
  6. Или измените портАльтернатива остановке существующего сайта — изменить порт хоста. В compose.yaml измените только левую часть пары ports: - "8080:80" (8080 — хост, 80 — контейнер), сохраните и выполните docker compose up -d в каталоге проекта. Проверьте docker compose ps и http://адрес_сервера:8080; при изменении публичного порта настройте прокси и брандмауэр только если это согласовано. Если 8080 тоже занят, выберите другой свободный порт.
  7. Для Windows проверьте IIS и SkypeНа Windows, если порт 80 занят системным процессом или IIS, в PowerShell от администратора можно просмотреть Get-Service W3SVC, а также IIS Manager (если установлен). Не останавливайте W3SVC без проверки сайтов в IIS: он может обслуживать другие приложения. Старые рекомендации про Skype не универсальны; опирайтесь на реальный OwningProcess и слушающий адрес.
  8. Перезапустите DockerПерезапуск Docker Engine затрагивает все контейнеры и обычно не исправляет порт, реально занятый другим процессом. Если после удаления конфликтующей публикации Docker продолжает сообщать о занятом порте, сначала перепроверьте docker ps, ss/Get-NetTCPConnection и логи службы; только администратор может запланировать перезапуск движка в окно обслуживания. После действий повторите запуск и проверьте доступность приложения.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Удалены docker compose down и docker rm -f из общего блока
    Linux · Терминал (Bash)КомандаНужен sudo
    Удалены docker compose down и docker rm -f из общего блока
    # Только диагностические команды; запуск на Linux
    docker ps --format "table {{.Names}}\t{{.Ports}}"
    sudo ss -ltnp '( sport = :80 )'
    # В каталоге нужного Compose-проекта
    docker compose ps
    Вариант 21234 — пример, замените реальным PID; опасный net stop w3svc удалён
    Windows · Командная строка (CMD)КомандаПрава администратора
    1234 — пример, замените реальным PID; опасный net stop w3svc удалён
    # Диагностика Windows в PowerShell
    Get-NetTCPConnection -LocalPort 80 -State Listen | Select LocalAddress,OwningProcess
    # Подставьте настоящий PID в следующую команду
    Get-Process -Id 1234
    Вариант 3Смена опубликованного порта в docker-compose.yml.
    Текст
    Смена опубликованного порта в docker-compose.yml.
    services:
      web:
        image: nginx:stable
        ports:
          - "8080:80"

В Windows порт 80 часто занят системой (PID 4) из-за службы HTTP.sys: определите конкретную службу по PID/HTTP.sys и согласуйте действия с администратором; безопаснее использовать другой свободный порт. Если вы запускаете контейнеры от прошлых проектов, проверьте docker network ls и удалите неиспользуемые сети (docker network prune). Для разработки удобнее публиковать порты на нестандартных значениях (8080, 8443) и проксировать через единый обратный прокси (Traefik, nginx). Документация — Docker: порты.

Если порт «занят», но 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, чтобы не получать конфликт при каждом запуске.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.