监视Dockerized应用程序活动

我的目标是监视哪些端口被多进程应用程序打开和closures。 我的计划是在Docker容器中运行应用程序,以便隔离它,然后使用strace来报告应用程序活动。

我已经尝试了Apache服务器dockerized:

strace -f -o /tmp/docker.out docker run -D -P apache 

我没有看到报告文件中显示应用程序在套接字中接受连接的任何行。

可以strace报告容器内进程的活动吗?

你的命令+ strace组合的问题是docker有一个客户端/服务器模型,你的docker run表示REST API事务的客户端,要求docker守护进程代表你运行Apache容器。 根据客户端的configuration方式,该容器甚至可能不会在您inputdocker run命令的同一个系统上docker run

但是,为了使Docker客户端和守护进程在同一个系统上的最简单情况,您可以使用ps查找正在运行的Apache服务器的PID,并使用strace来join并跟踪已启动的进程,只要这已足够为了您的追踪需求。

鉴于我不得不通过docker版本1.11及以上版本的容器执行器“runc”来debugging一些早期启动的问题,我还为docker-runc创build了一个小包装器,它从一开始就从容器进程开始(从外部系统,因此在容器文件系统中不需要strace)。 你可以在GitHub上find它,虽然公平的警告说,它有点bug的经常使用,因为我相信shell + strace调用阻碍containerd和真正的docker-runc和相关进程之间的信号。 一个更优雅的解决scheme可能是创build一个runc的变体,它知道如何用strace包装器预先包含包含进程的实际启动,而不是拦截strace中整个runc调用。

我只是设法使用以下步骤对docker集装箱进行拼合:

  1. 弄清楚容器所依据的是什么样的发行版镜像,然后从这个发行版中获得strace二进制文件,比如从为此目的创build的容器中安装相应的distro软件包。

  2. strace二进制文件复制到可以装入容器的卷中。

  3. 还要创build一个名为entry.sh的小包装程序脚本,其中包含strace调用。 就我而言,我是这样写的:

     #!/bin/sh exec /path/to/strace -ff -o /path/to/dumps /bin/bash /original/entrypoint 

    这是假设您从要debugging的映像的Dockerfile中读取的原始入口点以#!/bin/bash开头。 确保你设置了这个脚本的执行位,并把它放在你放置strace二进制文件的地方。

  4. 使用如下命令启动docker:

     docker run -v $PWD/shared:/path/to \ --entrypoint="/path/to/entry.sh" \ --cap-add SYS_PTRACE \ image-name 

装入的卷将使entry.shstraceentry.sh可用。 入口点将在调用实际入口点之前执行strace调用。 这可能会导致strace本身在容器中成为pid 1,并且没有收获孩子。 如果这是一个问题,像菲尔build议的一个不同的方法会更好。 最后,这个增加的function告诉docker,可以开始跟踪进程。 否则,你会得到类似的错误消息

 strace: …: PTRACE_TRACEME doesn't work: Operation not permitted 

其实指出这个能力设置是我写我的答案的原因。 除了这个标志之外,我已经完成了其他的步骤,在寻找解决scheme的同时,我在这里发现了这个问题,还有一个由John Goulah撰写的包含这些信息的博客文章 。 为了完整起见,我认为这里也应该提到国旗。 还没有尝试菲尔的方法,所以我绝对不会声称我的方法要优于他所build议的。 我想这可能会更容易在你不想混淆docker守护进程的系统上工作。

尝试启动Apache docker run -D -P apache然后在docker exec -it container_id bash连接,然后strace你的Apache进程。

看看在https://medium.com/@rothgar/how-to-debug-a-running-docker-container-from-a-separate-container-983f11740dc6中描述的解决scheme,它告诉你如何启动一个安装了strace的容器,它与您希望运行的容器/进程位于相同的pid和networking名称空间中。

这很好,因为它意味着你不需要在你想debugging的容器中安装strace。

它的胆量是,当debugging一个容器(在下面的例子中的caddy ),你运行一个名为strace的docker容器,并安装适当的工具:

docker run -t –pid = container:caddy \ –net = container:caddy \ –cap-add sys_admin \ –cap-add sys_ptrace \ strace

假设你在构buildstrace容器时做了这个工作,现在你将拥有一个带有合适工具的shell,从中你可以运行ps并在caddy容器中看到这个过程,并且可以用strace来运行它。

您将在不同的容器中,使用不同的文件系统,但可以在/prof/$PID/root看到目标容器的文件空间。