监视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集装箱进行拼合:
-
弄清楚容器所依据的是什么样的发行版镜像,然后从这个发行版中获得
strace
二进制文件,比如从为此目的创build的容器中安装相应的distro软件包。 -
将
strace
二进制文件复制到可以装入容器的卷中。 -
还要创build一个名为
entry.sh
的小包装程序脚本,其中包含strace
调用。 就我而言,我是这样写的:#!/bin/sh exec /path/to/strace -ff -o /path/to/dumps /bin/bash /original/entrypoint
这是假设您从要debugging的映像的Dockerfile中读取的原始入口点以
#!/bin/bash
开头。 确保你设置了这个脚本的执行位,并把它放在你放置strace
二进制文件的地方。 -
使用如下命令启动docker:
docker run -v $PWD/shared:/path/to \ --entrypoint="/path/to/entry.sh" \ --cap-add SYS_PTRACE \ image-name
装入的卷将使entry.sh
的strace
和entry.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进程。
这很好,因为它意味着你不需要在你想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
看到目标容器的文件空间。