Docker 容器的 6 种调试方法


Docker 很棒,但它增加了一层额外的复杂性,这意味着您不能总是轻松地近距离接触您的应用程序,并且当您的容器无法启动或以异常方式中断时,这确实会阻碍调试。

如果您陷入这种情况,这里是我的 goto 调试命令,可以帮助您获得有关具体情况的更多信息:

  1. docker logs <container_id>希望您已经尝试过此操作,但如果没有:从这里开始。这将为您提供最初在容器中运行的命令的完整 STDOUT 和 STDERR 命令行输出。docker attach <container id>如果您想在运行时关注输出,您还可以使用从活动容器流式传输实时日志。
  2. docker stats <container_id>如果您只需要关注容器的指标来找出问题所在,docker stats可以提供帮助:它将为您提供资源使用情况的实时流,以便您可以看到到目前为止泄漏了多少内存并轻松发现您的 CPU 使用率是否失控。
  3. docker cp <container_id>:/path/to/useful/file /local-path通常,只需掌握更多日志文件就足以解决问题。如果您已经知道自己想要什么,docker cp请支持:将任何文件从任何容器复制回本地计算机,以便您可以深入检查它(对于分析堆转储特别有用)。
  4. docker exec -it <container_id> /bin/bash接下来,如果您可以运行容器(如果它崩溃了,您可以使用 重新启动它docker start <container_id>),那么您可以使用此命令直接在容器内打开命令行 shell,并开始手动挖掘更多详细信息。
  5. docker commit <container_id> my-broken-container && docker run -it my-broken-container /bin/bash根本无法启动您的容器?如果您的容器启动然后立即关闭,那么您的初始命令或入口点将立即崩溃。这可能会使您的容器极其难以调试,因为您无法再在容器内进行 shell 操作或运行任何其他命令。幸运的是,有一个解决方法:您可以将关闭容器的状态保存为新映像(使用docker commit),然后使用不同的命令(例如/bin/bash)启动该映像以打开容器内的 shell,而根本不运行损坏的命令。有一个失败的入口点吗?还有一个入口点覆盖命令行标志
  6. 使用HTTP Toolkit for Docker检查和修改网络流量。HTTP Toolkit 是一个开源工具,可帮助调试 Docker 网络流量 - 如果您认为容器中可能存在任何类型的 HTTP 流量,可以帮助了解其正在执行的操作,则可以在启用 HTTP 拦截的情况下重新启动容器一键点击,立即捕获崩溃前发送的所有 HTTP、HTTPS 和 WebSocket 消息。您甚至可以断点并重写流量,以查看是否可以修改响应以手动阻止容器崩溃。