为什么docker堆栈部署没有启动我的所有容器



我部署了我的docker堆栈:

⇒  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时,它只显示三个容器:

~|⇒  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:

~|⇒  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 container ls中列出的容器的日志会导致No such container错误:

~|⇒  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

原因可能是什么?如何调试?

更新

似乎没有依赖关系的服务能够加入网络。但是依赖于其他服务的服务不能。我无法找出原因。以下是docker inspect network输出的要点。

PS

在运行docker stack deploy ...之前,我在另一个终端中运行了watch 'docker container ls | grep my_app'。但这三个集装箱从未出现在观察名单中。剩下的三个确实出现了。

我正在通过ssh连接的同一台远程机器上运行所有节点。这是docker node ls:的输出

~|⇒  docker node ls                          
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
z9hovq8ry6qont3m2rbn6upy4 *   tadoba     Ready     Active         Leader           20.10.11

这是我的docker撰写文件供参考:

version: "3.8"
services:
postgres:
image: postgres:11
volumes:
- my_app_postgres_volume:/var/lib/postgresql/data
- type: tmpfs
target: /dev/shm
tmpfs:
size: 536870912 # 512MB
environment:
POSTGRES_DB: my_app_db
POSTGRES_USER: my_app
POSTGRES_PASSWORD: my_app123
networks:
- my_app_network
redis:
image: redis:6.2.4
volumes:
- my_app_redis_volume:/data
networks:
- my_app_network
wsgi:
image: wsgi:my_app3_stats
volumes:
- /my_app/frontend/static/
- ./wsgi/my_app:/my_app
- /my_app/frontend/clientApp/node_modules
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
- postgres
- redis
ports:
- 9090
environment:
C_FORCE_ROOT: 'true'
SERVICE_PORTS: 9090
networks:
- my_app_network
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
nodejs:
image: nodejs:my_app3_stats
volumes:
- ./nodejs/frontend:/frontend
- /frontend/node_modules
depends_on:
- wsgi
ports:
- 9998:9999 
environment:
BACKEND_API_URL: http://aa.bb.cc.dd:9764/api/ 
networks:
- my_app_network
nginx:
image: isiq/nginx-brotli:1.21.0
volumes:
- ./nginx:/etc/nginx/conf.d:ro
- ./wsgi/my_app:/my_app:ro
- my_app_nginx_volume:/var/log/nginx/
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks:
- my_app_network

haproxy:
image: haproxy:2.3.9
volumes:
- ./haproxy:/usr/local/etc/haproxy/:ro
- /var/run/docker.sock:/var/run/docker.sock
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
depends_on:
- wsgi
- nodejs
- nginx
ports:
- 9764:80
networks:
- my_app_network
deploy:
placement:
constraints: [node.role == manager]
volumes:
my_app_postgres_volume:
my_app_redis_volume:
my_app_nginx_volume:
my_app_pgadmin_volume:
networks:
my_app_network:
driver: overlay

未在tadoba节点下列出的服务的docker service ps <service-name>输出:

~/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      

首先,所有的服务都在运行,这很好。但是docker container ls不是集群感知的,即它显示了在该节点上运行的当前容器。从输出docker stack ps --no-trunc my_stack,我可以看到还有另一个标记为tadoba的节点。因此,如果您可以登录到另一个节点,则可以看到正在运行的容器。

您可以通过运行docker node ls来列出集群上的节点。

如果你愿意,你可以设置你的docker上下文,这样你就可以更改你的dockercontext,这将消除登录和注销节点的需要。你可以在这里找到更多信息。

如果您的Docker堆栈正在运行,但没有创建副本,并且在运行Docker服务ps<STACK_NAME>命令,重新启动Docker可能有助于解决问题。

您可以尝试以下步骤:

打开端子或命令提示。使用适用于您的操作系统的命令重新启动Docker:

  • 在Linux(基于系统的系统,如Ubuntu(上:
    sudo systemctl restart docker
    
  • 在macOS上:
    sudo service docker restart
    
  • 在Windows(PowerShell(上:
    Restart-Service docker
    

等待Docker重新启动,然后通过运行Docker服务ps<STACK_NAME>命令。重新启动Docker可以帮助解决与容器管理和网络相关的各种问题,这通常是解决Docker中意外行为的第一步。

如果重新启动Docker后问题仍然存在,则可能是其他因素导致了问题,例如配置不正确或资源限制。在这种情况下,提供有关您的环境、特定Docker堆栈配置以及任何相关错误消息或日志的更多详细信息会很有帮助。

相关内容

最新更新