strace监视Dockerized应用程序活动

时间:2015-06-23 16:05:40

标签: sockets docker port strace

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

我已尝试使用Apache服务器dockerized:

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

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

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

5 个答案:

答案 0 :(得分:6)

您的命令+ strace组合的问题是docker有一个客户端/服务器模型,而您的docker run代表REST API事务的客户端,要求 docker守护程序代表您运行Apache容器。根据客户端的配置方式,该容器甚至可能无法在您键入docker run命令的同一系统上运行。

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

鉴于我必须使用" runc"(docker版本1.11及更高版本中的容器的执行程序)调试几个早期启动问题,我还为docker-runc创建了一个小包装器,其中包含&#39 ; s容器进程从一开始(从外部系统,因此容器文件系统中不需要strace)。你可以找到它here on GitHub,尽管公平警告说它对于常规使用有点麻烦,因为我认为shell + strace调用阻碍了containerd和真实docker-runc之间的一些信号传递。和相关的过程。更优雅的解决方案可能是创建runc的变体,它知道如何使用strace包装器预先包含所包含进程的实际开始,而不是在一个strace中拦截runc的整个调用。

答案 1 :(得分:3)

查看How-to Debug a Running Docker Container from a Separate Container中描述的解决方案,该解决方案告诉您如何启动安装了strace的容器,该容器与您希望运行strace的容器/进程位于同一个pid和网络命名空间中。

这很好,因为这意味着您不需要在要调试的容器中安装strace。

它的核心是在调试容器(在下面的示例中为caddy)时,运行一个名为strace的docker容器,并安装了适当的工具:

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

假设您在构建strace容器时已经这样做了,那么现在您将拥有一个带有适当工具的shell,您可以从中运行ps并查看caddy容器中的进程,你可以对它进行操作。

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

答案 2 :(得分:1)

我只是设法使用以下步骤操作一个docker容器:

  1. 找出容器所基于的发行版图像,然后从该发行版中获取strace二进制文件,例如:通过从为此目的创建的容器安装相应的发行包。

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

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

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

    这假设您从要调试的映像的Dockerfile读取的原始入口点以#!/bin/bash开头。确保设置此脚本的执行位,并将其放在放置strace二进制文件的位置。

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

    docker run -v $PWD/shared:/path/to \
               --entrypoint="/path/to/entry.sh" \
               --cap-add SYS_PTRACE \
               image-name
    
  5. 已安装的卷将使泊坞窗内的straceentry.sh可用。在调用实际入口点之前,入口点将执行strace调用。这可能会导致strace本身在容器中成为pid 1并且无法收获子项时出现问题。如果这是一个问题,像Phil建议的那种方法会更好。最后,添加的功能告诉docker可以开始跟踪进程。否则你会收到像

    这样的错误消息
    strace: …: PTRACE_TRACEME doesn't work: Operation not permitted
    

    实际上指出这种功能设置是我写答案的原因。我已经完成了除了这个标志之外的步骤,在搜索解决方案时,我在这里找到了这个问题,a blog post by John Goulah包含了那一点信息。为了完整起见,我认为这里也应该提到这面旗帜。尚未尝试菲尔的方法,所以我绝对不会声称我的方法优于他的建议。我想它可能更容易在你不想弄乱docker守护进程的系统上运行。

答案 3 :(得分:0)

尝试启动Apache docker run -D -P apache并在docker exec -it container_id bash内连接,然后在{@ 1}} Apache进程中连接。

答案 4 :(得分:0)

我们可以添加参数     --security-opt=seccomp:unconfined

我已经尝试过了,效果很好!

docker run -it   --security-opt=seccomp:unconfined  centos:7 /bin/bash

yum install strace
strace ls

execve("/usr/bin/ls", ["ls"], [/* 8 vars */]) = 0
brk(NULL)                               = 0x1d0a000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 
0) = 0x7ffb588da000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or 
directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

引用:http://johntellsall.blogspot.com/2016/10/tip-use-strace-to-debug-issues-inside.html