【问题标题】:Docker Node is Down after service restart服务重启后 Docker 节点关闭
【发布时间】:2020-10-19 23:59:32
【问题描述】:

似乎我的服务器空间不足,并且我在部署的一些 docker 堆栈上遇到了一些问题。我花了一段时间才弄明白,但最终我还是删除了几个容器和图像以释放一些空间。

我能够运行 service docker restart 并且它有效。但是,也存在一些问题:

  • docker info 表示该群体“待定”
  • docker node ls 显示我拥有的唯一节点(Leader),它是 available 但它是 down
  • journalctl -f -u docker 说 `level=error msg="error remove task" error="incompatible value module=node/agent/worker node.id="

运行docker service ls 时,所有服务都有0/1 副本。

这是运行docker node ls时的状态

"Status": {
    "State": "down",
    "Message": "heartbeat failure for node in \"unknown\" state",
    "Addr": "<ip and port>"
},
"ManagerStatus": {
    "Leader": true,
    "Reachability": "reachable",
    "Addr": "<ip and port>"
}

我怎样才能让我的服务再次运行?

【问题讨论】:

  • 有多少经理和工人?什么版本的 docker 引擎?什么操作系统和发行版?

标签: docker docker-swarm docker-stack


【解决方案1】:

有时当您重新启动或更新 docker 版本时,tasks.db 文件会损坏。

这是一个未解决的问题 (#34827),有人建议解决此问题的方法,移动 tasks.db 文件并测试是否可以解决问题,然后删除 tasks.db 文件. Docker 会自动为你创建一个新的。

您可以在 /var/lib/docker/swarm/worker/ 中找到 tasks.db 文件

我最近遇到了同样的问题,这个workaround 拯救了我的一天。我没有丢失任何与我的 Stacks 相关的数据

2020 年 10 月 19 日更新

issue (#34827) 已关闭,但解决方法还是一样,删除 tasks.db 文件

【讨论】:

    【解决方案2】:

    选项 1:

    等等。有时它会自行修复。

    选项 2(可能因操作系统而异):

    systemctl stop docker
    rm -Rf /var/lib/docker/swarm
    systemctl start docker
    docker swarm init
    

    【讨论】:

    • 值得注意的是,在没有备份的情况下执行此操作意味着您将丢失 swarm 中的所有定义
    • 是的,这不是生产群的解决方案。但是只针对一个节点进行开发,是有效的。
    • 而不是擦除整个 swarm 文件夹(这实际上会擦除你的 swarm),只删除 /var/lib/docker/swarm/worker/tasks.db。如果这样做,则不需要最后一个“docker swarm init”
    【解决方案3】:

    我找到了下一个解决方案 https://forums.docker.com/t/docker-worker-nodes-shown-as-down-after-re-start/22329

    docker服务重启后Leader节点宕机。

    我已通过将工作节点提升为管理节点然后再启动来解决此问题 新的管理节点降级失败的领导节点。

    ubuntu@staging1:~$ docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    y0363og32cur9xq9yy0nqg6j9 * staging1 Down Active Reachable
    x68yyqtt0rogmabec552634mf staging2 Ready Active
    
    ubuntu@staging1:~$ docker node promote staging2
    
    root@staging1:~# docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    plxkuqqnkxotrzy7nhjj27w34 * staging1 Down Active Leader
    x68yyqtt0rogmabec552634mf staging2 Ready Active Reachable
    
    root@staging2:~# docker node demote staging1
    
    root@staging2:~# docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    plxkuqqnkxotrzy7nhjj27w34 staging1 Down Active
    x68yyqtt0rogmabec552634mf * staging2 Ready Active Leader
    
    root@staging2:~# docker node rm staging1
    
    Get join-token from leader node:
    root@staging2:~# docker swarm join-token manager
    
    Reconnect failed node to docker swarm cluster:
    
    root@staging1:~# docker swarm leave --force
    root@staging1:~# systemctl stop docker
    root@staging1:~# rm -rf /var/lib/docker/swarm/
    root@staging1:~# systemctl start docker
    root@staging1:~# docker swarm join --token XXXXXXXX 192.168.XX.XX:2377
    
    root@staging1:~# docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    y0363og32cur9xq9yy0nqg6j9 * staging1 Ready Active Reachable
    x68yyqtt0rogmabec552634mf staging2 Ready Active Leader
    
    root@staging1:~# docker node demote staging2
    
    root@staging1:~# docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    y0363og32cur9xq9yy0nqg6j9 * staging1 Ready Active Leader
    x68yyqtt0rogmabec552634mf staging2 Ready Active
    

    【讨论】:

      【解决方案4】:

      首先查看节点的详细信息: **

      docker 节点 ls

      ** 如果节点的状态仍然显示为 down 并且可用性处于活动状态,则可能是在节点上运行的服务停止。 将服务创建为全局模式
      或者 通过以下命令更新在 swarm 中运行的全局服务:

      docker 服务更新 --force

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2020-06-03
        • 1970-01-01
        相关资源
        最近更新 更多