Docker Swarm集群创建服务后副本为0/1无法生成容器问题求助
故障原因
- 核心拼写错误:Dockerfile的
CMD指令中httpd可执行文件路径写错,原配置为/user/sbin/httpd,CentOS系统中httpd的默认正确路径为/usr/sbin/httpd。路径错误会导致容器启动时直接报错退出,Swarm集群会持续尝试重启失败的容器,因此服务创建命令会卡在等待就绪状态,副本数始终显示0/1。 - 其他可能原因:
- 集群节点80端口已被其他服务(如Nginx、Apache、其他容器)占用,端口映射失败导致容器无法启动
- 部分节点构建镜像失败,Swarm调度到无该镜像的节点时无法拉取本地镜像(默认配置下Swarm不会自动分发本地构建的镜像)
- 构建镜像时ADD指令下载的模板压缩包损坏,导致解压步骤失败,镜像构建不完整
解决步骤
- 修正Dockerfile内容,参考修正后的配置如下:
FROM centos:latest LABEL maintainer="nityaranjan190592@gmail.com" RUN yum install -y httpd zip unzip && \ yum clean all ADD https://www.free-css.com/assets/files/free-css-templates/download/page247/kindle.zip /var/www/html/ WORKDIR /var/www/html RUN unzip kindle.zip && \ cp -rvf markups-kindle/* . && \ rm -rf __MACOSX markups-kindle kindle.zip CMD ["/usr/sbin/httpd" , "-D" , "FOREGROUND"] EXPOSE 80
- 在所有集群节点重新执行镜像构建命令,确保所有节点都存在正确的镜像:
docker image build -t webimage:1 .
- 检查所有节点的80端口占用情况,如有占用可停止对应服务,或修改服务创建命令的端口映射:
# 检查80端口占用 ss -tulpn | grep :80 # 若要更换端口,创建服务时改为映射8080端口 docker service create --name webserver -p 8080:80 webimage:1
- 若服务仍启动失败,可执行以下命令查看具体故障日志定位问题:
# 查看服务调度失败原因 docker service ps webserver --no-trunc # 查看失败容器的启动日志 docker logs <对应失败容器的ID>
内容的提问来源于stack exchange,提问作者Nitya
相关产品推荐
相关产品推荐

