如何找出服务不能启动的原因

我经常遇到问题,因为我部署在多个节点的 Docker 群上的服务无法启动,而且没有生成的日志可以用 docker service logs {serviceName}查看

服务不启动的可能原因有很多,例如

  • 无法从注册表下载图像
  • 无法满足的约束

我不知道为什么集装箱发动不起来。我发现命令 docker service ps {serviceName}列出一个或多个服务的任务和一个简短的错误消息(如果有一个错误)。但是,当我尝试用 docker service logs {taskId}检查任务(它应该显示任务的日志)时,我得到了 Error response from daemon: task 3lkgo8t2sn7k not found

有人能帮我得到一个完整的错误消息,为什么一个服务不会启动?

45789 次浏览

我找到了一个解决这个问题的方法。

docker service ps --no-trunc {serviceName}

这将显示下载图像的错误,安装 nfs 卷等。

——————更新

并非所有的错误都可以用上述方法找到。另一个有用的工具是查看 docker 守护进程日志,它可以按照 堆栈溢出中解释的方式进行:

journalctl -u docker.service | tail -n 50

这取决于你的操作系统。下面是几个位置,几个操作系统的命令:

  • Ubuntu (旧版使用 upstart)-/var/log/upstart/docker.log
  • Ubuntu (新的使用 systemd)-journalctl -u docker.service
  • Boot2Docker-/var/log/docker.log
  • Debian GNU/Linux-/var/log/daemon.log
  • CentOS-/var/log/daemon.log | grep docker
  • CoreOS-journalctl -u docker.service
  • 软呢帽 journalctl -u docker.service
  • 红帽企业 Linux 服务器
  • OpenSuSE-journalctl -u docker.service
  • OSX-~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌​ocker.log
  • Windows-Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time,如前所述 这里

我一直在使用的另一个技巧来自 这篇文章。我完全被困住了,这个把戏让我走得更远了:

docker run --network my-network -it --rm --entrypoint bash my-service

问题是,当我以这种方式运行它时,我可以启动服务并与群中的其他服务交互(通过外部覆盖网络)。但是当我尝试用 DockerCompose 启动所有三个服务时,上述服务无法启动。所以我还是卡住了,不过比以前稍微近了一点。

我也经常使用 grepsyslog,这有时会暴露出一些问题:

less /var/log/syslog | grep docker
less /var/log/syslog | grep error

最后,我发现了一个有时管用的窍门:

Https://faun.pub/debug-docker-swarm-services-eec20fe3d13e