You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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      

可能原因

  1. 本地镜像缺失:wsgi:my_app3_stats、nodejs:my_app3_stats为本地构建镜像,若Swarm节点上未构建或未推送至可访问仓库,会导致容器无法启动,但Swarm错误标记为Running。
  2. 节点资源不足:节点CPU、内存或磁盘耗尽,导致服务无法调度到节点。
  3. 挂载目录异常:问题服务的绑定挂载目录(如./wsgi/my_app)在节点上不存在、权限错误,导致容器启动后立即退出,docker container ls默认不显示已退出容器。
  4. Overlay网络故障:自定义overlay网络my_app_network配置异常,服务无法加入网络,启动失败。
  5. 依赖配置失效:Swarm模式下depends_on仅控制服务创建顺序,不等待依赖服务就绪,若依赖服务未完全启动,后续服务启动失败后被反复重启,但未记录错误状态。

调试步骤

  1. 查看服务错误详情:
    用以下命令获取服务的事件和错误信息:
    docker service inspect --pretty my_stack_wsgi
    
    或查看Docker系统日志,定位容器启动失败原因:
    journalctl -u docker.service | grep -i error
    
  2. 检查本地镜像:
    在tadoba节点确认镜像存在:
    docker images | grep -E "wsgi|nodejs"
    
    若缺失,需在节点本地构建镜像或推送到私有仓库。
  3. 排查节点资源:
    查看节点CPU、内存、磁盘使用情况:
    free -h
    df -h
    top
    
    资源不足时需释放资源或调整服务资源限制。
  4. 查看已退出容器:
    列出所有容器(包括已退出的),检查问题服务容器状态:
    docker container ls -a | grep my_stack
    
    若存在已退出容器,查看其启动日志:
    docker logs <container-id>
    
  5. 验证挂载目录:
    检查节点上挂载目录的存在性和权限:
    ls -ld ./wsgi/my_app ./nodejs/frontend
    
    确保目录存在且Docker进程有读写权限。
  6. 重建Overlay网络:
    若网络存在问题,删除后重新部署:
    docker stack rm my_stack
    docker network rm my_app_network
    docker stack deploy -c docker-compose.yml my_stack
    
  7. 移除依赖测试:
    临时删除docker-compose.yml中的depends_on配置,重新部署,排除依赖顺序导致的问题。

解决建议

  • 本地构建镜像需确保在Swarm节点上存在,或推送到私有仓库供节点拉取。
  • 替换depends_on为健康检查,让Swarm等待依赖服务就绪后再启动后续服务。例如给postgres添加健康检查:
    postgres:
      image: postgres:11
      # 其他配置...
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U my_app -d my_app_db"]
        interval: 5s
        timeout: 5s
        retries: 5
    
    然后在wsgi服务中配置依赖条件:
    wsgi:
      # 其他配置...
      depends_on:
        postgres:
          condition: service_healthy
        redis:
          condition: service_started
    
  • Swarm模式下避免使用相对路径挂载,改用绝对路径或绑定到节点固定目录。

内容的提问来源于stack exchange,提问作者Rnj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:50:35