Docker容器调试应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器调试应用程序相关的知识,希望对你有一定的参考价值。

参考技术A

因为Docker技术的火热,因此在工作中我们经常会以容器的方式来运行一个应用。每当容器无法成功运行或者想要对容器中的应用参数、应用配置以及应用启动进行深入研究时,当然希望能够像在宿主机上调试程序一样在容器中调试应用。容器的本质包括应用与应用运行所依赖的环境, 因此首先需要创建一个空壳容器(没有运行应用的应用容器),然后进入容器中调试应用。此处的空壳容器提供了应用运行所需的环境,进而可方便的在其中调试应用。实践环境:Centos7.2+Docker1.12.6。

比较规范的镜像的Dockerfile中通常会有ENTRYPOINT与CMD的定义(Docker官方推荐这样做)。因此容器的启动命令则为ENTRYPOINT所对应的脚本或可执行程序加上CMD中定义的内容。比如elasticsearch的Dockerfile定义的ENTRYPOINT与CMD分别为:ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["elasticsearch"],则创建的容器的启动命令为: /docker-entrypoint.sh elasticsearch mysql的Dockerfile:ENTRYPOINT ["docker-entrypoint.sh"] CMD ["mysqld"],则创建的容器的启动命令为: /docker-entrypoint.sh mysqld 。所以想要知道一个容器的启动命令需要首先了解其镜像的Dockerfile中ENTRYPOINT与CMD的定义。如何查看一个镜像的ENTRYPONT与CMD的值呢?一般采用如下两种方式:

上述第一种方式适用于比较规范的镜像,这类镜像通常会提供清晰、具体的Dockerfile。第二种方式适用于各种镜像,尽管是不规范的镜像。通过history、inspect两个命令的任一个均可快速、方便的查看镜像的ENTRYPOINT与CMD的值。

若要调试容器中的应用程序,则需额外的设置实现。docker run命令提供的--entrypoint参数能够覆盖Dockerfile中默认定义的ENTRYPOINT;docker run [OPTIONS] IMAGE [COMMAND] [ARG...]的COMMAND能够替换Dockerfile中定义的CMD。通过上面的示例可以发现,有的镜像的Dockerfile中ENTRYPOINT值为:/docker-entrypoint.sh,CMD为应用的可执行程序;有的镜像的Dockerfile中ENTRYPOINT值为应用的可执行程序,CMD为可执行程序的参数。因此针对不同的镜像想要创建空壳容器其方式是不同的。

容器其实是应用与应用运行所依赖的环境,创建空壳容器即提供了应用所需要的环境,进入此环境中可以调试应用,可以验证应用的各个参数,同样更可以像在宿主机中运行程序一样在此环境中运行应用,区别仅是容器与宿主机的两个环境。上面是对如何在容器中调试应用程序做的一些记录,希望与大家一起讨论、交流,一起学习。

docker容器内远程调试运行进程

【中文标题】docker容器内远程调试运行进程【英文标题】:Remote debugging running process inside docker container 【发布时间】:2016-04-06 16:30:08 【问题描述】:

我在 Docker 容器内运行 node.js 应用程序。我需要使用Intellij Ultimate 15 调试此应用程序。

demoapp:
  build: .
  command: 'bash -c "npm install && npm run debug"'
  ports:
    - "8989:8989"
  environment:
      VIRTUAL_HOST: 'demoapp.docker'
      VIRTUAL_PORT: 8989

来自package.jsondebug 脚本

"debug": "(node-inspector --web-port=8989  app.js &) && node --debug app.js"

以及IDE中的配置

IDE 以 Frame is not available 响应。估计连不上

我做错了吗?

此外,我可以使用Chrome 进行调试。如果我访问demoapp.docker:8989,它会连接,我可以开始调试。

【问题讨论】:

【参考方案1】:

您应该通过 IntelliJ 调试器连接到调试端口,而不是 Web 端口。因此,您应该在节点运行时指定它(使用 --debug 选项)并将其公开给 docker 主机,然后您就可以连接到它。

JetBrains 文档中的更多信息:https://www.jetbrains.com/idea/help/running-and-debugging-node-js.html#remote_debugging

【讨论】:

以上是关于Docker容器调试应用程序的主要内容,如果未能解决你的问题,请参考以下文章

docker容器内远程调试运行进程

在 docker 容器内调试角度

在 Docker 容器中调试 Nodejs

无法在 docker 容器中远程调试 Java 9 Tomcat 9

markdown 在docker容器(VSCode)中调试应用程序

在 Docker 容器中调试 webpack-dev-server 应用程序