Контейнер образа docker/compose не запускает службу из-за уже привязанного порта

У меня есть следующая настройка:

1-я машина. Сервер Docker с интеграцией Github.

2-я машина. Производство с помощью docker-agent, которое запускается следующим образом:

docker run -d 
    -e DRONE_SERVER=<ip:host>
    -e DRONE_SECRET=<secret> 
    -v /var/run/docker.sock:/var/run/docker.sock 
    --restart=always 
    --name=drone-agent
      drone/agent:0.8 agent

Репо со следующим .drone.yml:

pipeline:
  run:
    image: docker/compose:1.21.2
    commands:
      - cd <dir_with_docker-compose.yml>
      - docker-compose up -d <service_name>
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    when:
      branch: [<branch_name>]

поэтому, когда я запускаю сборку с этим .drone.yml, я получаю следующий вывод:

cd <dir_with_docker-compose.yml>
docker-compose up -d <service_name>
Starting docker_<service_name>_1 ...
Starting docker_<service_name>_1 ... error

ERROR: for docker_<service_name>_1  Cannot start service <service_name>: driver failed programming external connectivity on endpoint docker_<service_name>_1 
(<hash>): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

ERROR: for <service_name>  Cannot start service <service_name>: driver failed programming external connectivity on endpoint docker_<service_name>_1
(<hash>): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
Encountered errors while bringing up the project.

Но если я вставлю docker ps или netstat -tulpn между cd <dir_with_docker-compose.yml> и docker-compose up -d <service_name>, служба запустится успешно.

Почему это происходит?


person IgorNikolaev    schedule 10.07.2018    source источник


Ответы (1)


Сообщение об ошибке означает, что этот порт уже используется чем-то другим. Поскольку рассматриваемый порт имеет номер 80, я предполагаю, что у вас работает веб-сервер. Есть много способов определить, какие программы используют порт (если это док-контейнер, docker ps -a должен показать вам), я бы попробовал один из них и закрыл проблемный процесс, а затем снова попытался запустить вашу док-систему. Если ошибка исчезнет, ​​вы определили виновника.

Я не знаю, что именно находится в ваших образах докеров, но может быть и так, что они конфликтуют друг с другом. Я считаю, что Docker автоматически назначает изображениям случайный свободный порт, но только в том случае, если порт не указан. Поэтому, если несколько контейнеров в вашей сборке пытаются связать 80, это будет проблемой. Я бы внимательно просмотрел ваши Dockerfiles и docker compose, чтобы узнать, использует ли кто-нибудь 80. Вы можете явно попросить Docker привязать контейнер к произвольному порту с помощью docker run -p 12345 CONTAINER_NAME. У вас есть -e DRONE_SERVER=<ip:host> в вашей команде запуска, но IIRC устанавливает переменную среды, поэтому Docker может игнорировать указанный вами порт. Итак, в основном, для всех выполняемых вами команд запуска включите аргумент, например -p 12345 (используйте разные числа для каждого контейнера), а также измените порты в вашем docker-compose.yml. Если это решит проблему, найдите, какие контейнеры запускались с -p 80 ранее или где порт 80 указан в докере.

Обратите внимание, что если вы случайно попытаетесь запустить один и тот же образ Docker дважды, новый экземпляр, конечно же, будет конфликтовать со старым, поскольку оба они будут пытаться использовать один и тот же порт (если порт не указан, в этом случае Docker может для автоматического разрешения конфликта). Поскольку я вижу docker_<service_name>_1 (в частности, _1), я подозреваю, что вы уже сделали docker-compose run в этой настройке, забыли удалить его и снова запустили. По сути, вы должны закрыть все контейнеры, связанные с этим докером, и удалить их. В этом может помочь графический интерфейс, такой как Portainer.

person Wassinger    schedule 10.07.2018
comment
Дрон-агент связывается с удаленным дроном-сервером. Drone-server прослушивает 9000 портов, а docker-agent выставляет порт 3000. Во время сборки я использую только один контейнер, поэтому не должно быть конфликтов портов между сервисами docker-compose. Чудо в том, что docker ps или netststat -tulpn решают проблему с привязкой портов - person IgorNikolaev; 11.07.2018
comment
@IgorNikolaev Подождите, простая печать статуса исправит это? - person Wassinger; 14.07.2018
comment
@IgorNikolaev Ну, это очень странно, но поздравляю с исправлением. - person Wassinger; 14.07.2018
comment
ну, я не считаю это фиксированным :) (таким образом) - person IgorNikolaev; 14.07.2018