Docker Stack部署后部分容器未启动的排查求助
Docker Stack部署后部分服务显示Running但无容器的问题分析与调试
问题现象
执行Docker Stack部署命令:
⇒ docker stack deploy -c docker-compose.yml my_stack Creating network my_stack_network Creating service my_stack_redis Creating service my_stack_wsgi Creating service my_stack_nodejs Creating service my_stack_nginx Creating service my_stack_haproxy Creating service my_stack_postgres
但执行docker container ls仅能看到3个容器:
~|⇒ docker container ls | grep my_stack 212720bfafc3 postgres:11 "docker-entrypoint.s…" 4 minutes ago Up 3 minutes 5432/tcp my_stack_postgres.1.9nx7jb21whi61aboe9hmet6m2 3132dd980589 isiq/nginx-brotli:1.21.0 "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp my_stack_nginx.1.isl2c78z6w5ptizurm3a4cnte 62ef3c76fb9e redis:6.2.4 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 6379/tcp my_stack_redis.1.xnisrd1i6hod6jkm64623cpzj
docker stack ps显示所有服务状态为Running,但wsgi、nodejs、haproxy的NODE列为空:
~|⇒ docker stack ps --no-trunc my_stack ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 1fqwlgblhi5q0cdl5cy75ucli my_stack_haproxy.1 haproxy:2.3.9@sha256:f63aabf39efcd277b04a503d38e59e80224a0c11f47b2568b13b0092698c5a3a Running New 2 minutes ago isl2c78z6w5ptizurm3a4cnte my_stack_nginx.1 isiq/nginx-brotli:1.21.0@sha256:436cbc0d8cd051e7bdb197d7915fe90fa5a1bdadea6d02272ba117fccf30c936 tadoba Running Running 2 minutes ago 1myvtgl11qqw2xa9cv79uikcs my_stack_nodejs.1 nodejs:my_stack Running New 2 minutes ago 9nx7jb21whi61aboe9hmet6m2 my_stack_postgres.1 postgres:11@sha256:5d2aa4a7b5f9bdadeddcf87cf7f90a176737a02a30d917de4ab2e6a329bd2d45 tadoba Running Running 2 minutes ago xnisrd1i6hod6jkm64623cpzj my_stack_redis.1 redis:6.2.4@sha256:6bc98f513258e0c17bd150a7a26f38a8ce3e7d584f0c451cf31df70d461a200a tadoba Running Running 2 minutes ago mzmmb7a3bxjpfkfa3ea5o5w85 my_stack_wsgi.1 wsgi:my_stack Running New 2 minutes ago
尝试查看这些服务的容器日志时,提示容器不存在:
~|⇒ docker logs -f 1myvtgl11qqw2xa9cv79uikcs Error: No such container: 1myvtgl11qqw2xa9cv79uikcs ~|⇒ docker logs -f mzmmb7a3bxjpfkfa3ea5o5w85 Error: No such container: mzmmb7a3bxjpfkfa3ea5o5w85 ~|⇒ docker logs -f 1fqwlgblhi5q0cdl5cy75ucli Error: No such container: 1fqwlgblhi5q0cdl5cy75ucli
补充信息
- 无依赖的服务(postgres、redis、nginx)正常启动,带依赖的服务(wsgi、nodejs、haproxy)始终未生成容器
- 集群为单节点Swarm(节点
tadoba为manager):
~|⇒ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION z9hovq8ry6qont3m2rbn6upy4 * tadoba Ready Active Leader 20.10.11
- 问题服务的
docker service ps输出中,NODE列始终为空:
~/my_app|master-py3⚡ ⇒ docker service ps my_app_nodejs ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS i04jpykp9ign my_app_nodejs.1 nodejs:bodhitree3_stats Running New about a minute ago ~/my_app|master-py3⚡ ⇒ docker service ps my_app_haproxy ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS of4fcsxuq24c my_app_haproxy.1 haproxy:2.3.9 Running New about a minute ago ~/my_app|master-py3⚡ ⇒ docker service ps my_app_wsgi ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS yt9nuhule39z my_app_wsgi.1 wsgi:bodhitree3_stats Running New 2 minutes ago
可能原因
- 本地镜像缺失:
wsgi:my_app3_stats、nodejs:my_app3_stats为本地构建镜像,若Swarm节点上未构建或未推送至可访问仓库,会导致容器无法启动,但Swarm错误标记为Running。 - 节点资源不足:节点CPU、内存或磁盘耗尽,导致服务无法调度到节点。
- 挂载目录异常:问题服务的绑定挂载目录(如
./wsgi/my_app)在节点上不存在、权限错误,导致容器启动后立即退出,docker container ls默认不显示已退出容器。 - Overlay网络故障:自定义overlay网络
my_app_network配置异常,服务无法加入网络,启动失败。 - 依赖配置失效:Swarm模式下
depends_on仅控制服务创建顺序,不等待依赖服务就绪,若依赖服务未完全启动,后续服务启动失败后被反复重启,但未记录错误状态。
调试步骤
- 查看服务错误详情:
用以下命令获取服务的事件和错误信息:
或查看Docker系统日志,定位容器启动失败原因:docker service inspect --pretty my_stack_wsgijournalctl -u docker.service | grep -i error - 检查本地镜像:
在tadoba节点确认镜像存在:
若缺失,需在节点本地构建镜像或推送到私有仓库。docker images | grep -E "wsgi|nodejs" - 排查节点资源:
查看节点CPU、内存、磁盘使用情况:
资源不足时需释放资源或调整服务资源限制。free -h df -h top - 查看已退出容器:
列出所有容器(包括已退出的),检查问题服务容器状态:
若存在已退出容器,查看其启动日志:docker container ls -a | grep my_stackdocker logs <container-id> - 验证挂载目录:
检查节点上挂载目录的存在性和权限:
确保目录存在且Docker进程有读写权限。ls -ld ./wsgi/my_app ./nodejs/frontend - 重建Overlay网络:
若网络存在问题,删除后重新部署:docker stack rm my_stack docker network rm my_app_network docker stack deploy -c docker-compose.yml my_stack - 移除依赖测试:
临时删除docker-compose.yml中的depends_on配置,重新部署,排除依赖顺序导致的问题。
解决建议
- 本地构建镜像需确保在Swarm节点上存在,或推送到私有仓库供节点拉取。
- 替换
depends_on为健康检查,让Swarm等待依赖服务就绪后再启动后续服务。例如给postgres添加健康检查:
然后在wsgi服务中配置依赖条件:postgres: image: postgres:11 # 其他配置... healthcheck: test: ["CMD-SHELL", "pg_isready -U my_app -d my_app_db"] interval: 5s timeout: 5s retries: 5wsgi: # 其他配置... depends_on: postgres: condition: service_healthy redis: condition: service_started - Swarm模式下避免使用相对路径挂载,改用绝对路径或绑定到节点固定目录。
内容的提问来源于stack exchange,提问作者Rnj
相关产品推荐
相关产品推荐

