调试运行中的容器

    来看一个最简单的 web 容器如何调试。

    用 Go 编写一个最简单的 webserver:

    以 linux 平台方式编译

    1. FROM scratch
    2. COPY ./webserver /
    3. CMD ["/webserver"]

    最后启动 webserver 容器

    1. docker run -itd --name webserver -p 80:80 feisky/hello-world

    访问映射后的 80 端口,webserver 容器正常返回 “Hello World”

    1. # curl http://$(hostname):80
    2. Hello World

    新建一个容器调试 webserver

    用一个包含调试工具或者方便安装调试工具的镜像(如 alpine)创建一个新的 container,为了便于获取 webserver 进程的状态,新的容器共享 webserver 容器的 pid namespace 和 net namespace,并增加必要的 capability:

    1. / # apk update && apk add strace
    2. fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
    3. v3.5.1-34-g1d3b13bd53 [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
    4. v3.5.1-29-ga981b1f149 [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
    5. OK: 7958 distinct packages available
    6. (1/1) Installing strace (4.14-r0)
    7. Executing busybox-1.25.1-r0.trigger
    8. OK: 5 MiB in 12 packages
    9. / # strace -p 1
    10. ^Cstrace: Process 1 detached
    11. <detached ...>

    也可以获取 webserver 容器的网络状态

    1. # 继续在刚创建的新容器 sh 中执行
    2. / # apk add lsof
    3. (1/1) Installing lsof (4.89-r0)
    4. Executing busybox-1.25.1-r0.trigger
    5. OK: 5 MiB in 13 packages
    6. / # lsof -i TCP
    7. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

    当然,也可以访问 webserver 容器的文件系统

    Kubernetes 社区也在提议增加一个 kubectl debug 命令,用类似的方式在 Pod 中启动一个新容器来调试运行中的进程,可以参见 。