EMZETT.
Войти

Docker: port is already allocated

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

Подробнее: Сообщение: Bind for 0.0.0.0:8080 failed: port is already allocated или address already in use. Порт на машине может использоваться одновременно только одним процессом.

Подробности

Причины

  • Другой контейнер работает с тем же портом хоста (-p 8080:80).
  • Локальная программа (например, сервер разработки, Nginx, локальная база данных) использует порт.
  • Старый контейнер всё ещё работает или завис (docker ps -a).
  • Несколько проектов Compose с одинаковыми портами.

Решения

  1. Выясните, кто занимает порт: docker ps (контейнеры), ss -ltnp | grep 8080 или lsof -i :8080 (Linux/macOS), netstat -ano | findstr 8080 (Windows).
  2. Остановите/удалите старый контейнер: docker stop имя && docker rm имя, или в Compose docker compose down.
  3. Выберите другой порт хоста: -p 8081:80 (хост слева, контейнер справа).
  4. Завершите мешающую программу.
  5. Проверьте записи ports в docker-compose.yml; внутри сети контейнерам не нужны опубликованные порты, они обращаются друг к другу по имени.

Примечание

Помните: -p ХОСТ:КОНТЕЙНЕР. Порт контейнера везде может быть 80, порт хоста должен быть свободен. Публикуйте порты только там, где необходимо, а на серверах только на 127.0.0.1 (-p 127.0.0.1:8080:80), чтобы они не были доступны из сети.

См. также: EADDRINUSE, Docker, Тома и сети Docker