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