【问题标题】:docker/compose image container does not start up service due to already binded port由于端口已经绑定,docker/compose 镜像容器没有启动服务
【发布时间】:2018-07-10 21:29:46
【问题描述】:

我有以下设置:

第一台机器。与 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.

但如果我在cd &lt;dir_with_docker-compose.yml&gt;docker-compose up -d &lt;service_name&gt; 之间插入docker psnetstat -tulpn 服务启动成功。

为什么会这样?

【问题讨论】:

    标签: docker docker-compose drone.io


    【解决方案1】:

    错误消息意味着其他东西已经在使用该端口。由于有问题的端口似乎是 80,我猜你有一个网络服务器正在运行。有很多方法可以确定哪些程序正在使用端口(如果它是 docker 容器,docker ps -a 应该会告诉你),我会尝试其中一种并关闭有问题的进程,然后再次尝试启动你的 docker 系统。如果错误消失,那么您已经确定了罪魁祸首。

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

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

    【讨论】:

    • 无人机代理正在与远程无人机服务器通信。无人机服务器正在监听 9000 端口,而 docker-agent 正在公开 3000 端口。在构建过程中,我只创建了一个容器,因此 docker-compose 服务之间的端口不应该有冲突。奇迹是,docker psnetststat -tulpn 解决了端口绑定问题
    • @IgorNikolaev 等等,只是打印一些状态修复它?
    • @IgorNikolaev 嗯,这很奇怪,但恭喜你修复它。
    • 好吧,我不认为它是固定的:)(这样)
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多