调试
对于普通的服务器进程,我们可以很方便的使用宿主机上的各种工具来调试;但容器经常是仅包含必要的应用程序,一般不包含常用的调试工具,那如何在线调试容器中的进程呢?最简单的方法是再起一个新的包含了调试工具的容器。
来看一个最简单的 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。
最后更新于