docker / compose图片容器由于端口已绑定

时间:2018-07-10 21:29:47

标签: docker docker-compose drone drone.io

我有以下设置:

第一台机器。带有Github集成的Docker服务器。

第二台机器。使用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 psnetstat -tulpn之间插入cd <dir_with_docker-compose.yml>docker-compose up -d <service_name>,服务将成功启动。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

该错误消息表示该端口已在使用其他端口。由于该端口似乎是80,因此我猜您正在运行Web服务器。有很多方法可以确定正在使用端口的程序(如果它是docker容器,docker ps -a应该显示给您),我将尝试其中一种并关闭有问题的进程,然后尝试再次启动您的docker系统。如果错误消失了,那么您已经找到了罪魁祸首。

我不知道您的docker映像中到底有什么,但也可能是它们彼此冲突。我相信Docker会自动为图像分配一个随机的空闲端口,但前提是未指定端口。因此,如果程序集中的多个容器都试图绑定80,那将是一个问题。我会仔细检查您的Dockerfile和docker compose,看看是否有人使用80。您可以明确要求Docker使用docker run -p 12345 CONTAINER_NAME将容器绑定到任意端口。您的运行命令中确实有-e DRONE_SERVER=<ip:host>,但是IIRC会设置一个环境变量,因此Docker可能会忽略您指定的端口。因此,基本上,对于您正在执行的所有运行命令,请包含一个类似-p 12345的参数(每个容器使用不同的数字),并更改docker-compose.yml中的端口。如果可以解决问题,请查看以前使用-p 80运行了哪些容器,或者在docker compose中指定了端口80。

请注意,如果您不小心尝试运行相同的Docker映像两次,那么新实例当然会与旧实例冲突,因为它们都将尝试使用同一端口(除非未指定端口,在这种情况下) Docker能够自动解决冲突)。因为我看到了docker_<service_name>_1(特别是_1),所以我怀疑您已经完成了此设置的docker-compose run,却忘记将其删除并重新运行。基本上,您应该关闭所有与此docker compose相关的容器并将其删除。像Portainer这样的GUI可能对此有所帮助。