docker/compose镜像容器由于已绑定端口而无法启动服务



我有以下设置:

第一台机器。Docker服务器与Github集成。

第二台机器。与码头代理的生产,以这种方式启动:

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 <dir_with_docker-compose.yml>docker-compose up -d <service_name>之间插入docker psnetstat -tulpn,则服务成功启动。

为什么会发生这种情况?

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

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

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

最新更新