調試

對於普通的服務器進程,我們可以很方便的使用宿主機上的各種工具來調試;但容器經常是僅包含必要的應用程序,一般不包含常用的調試工具,那如何在線調試容器中的進程呢?最簡單的方法是再起一個新的包含了調試工具的容器。

來看一個最簡單的 web 容器如何調試。

webserver 容器

用 Go 編寫一個最簡單的 webserver:

// go-examples/basic/webserver
package main

import "net/http"
import "fmt"
import "log"

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

func main() {
    http.HandleFunc("/", index)
    err := http.ListenAndServe(":80", nil)
    if err != nil {

        log.Println(err)
    }
}

以 linux 平臺方式編譯

然後用下面的 Docker build 一個 docker 鏡像:

最後啓動 webserver 容器

訪問映射後的 80 端口,webserver 容器正常返回 "Hello World"

新建一個容器調試 webserver

用一個包含調試工具或者方便安裝調試工具的鏡像(如 alpine)創建一個新的 container,爲了便於獲取 webserver 進程的狀態,新的容器共享 webserver 容器的 pid namespace 和 net namespace,並增加必要的 capability:

這樣,新的容器可以直接 attach 到 webserver 進程上來在線調試,比如 strace 到 webserver 進程

也可以獲取 webserver 容器的網絡狀態

當然,也可以訪問 webserver 容器的文件系統

Kubernetes 社區也在提議增加一個 kubectl debug 命令,用類似的方式在 Pod 中啓動一個新容器來調試運行中的進程,可以參見 https://github.com/kubernetes/community/pull/649

Last updated