打破容器的界限——使用nsenter实现Docker“内网穿透”
Docker 是个好东西,我们都知道。它的优点就是“隔离”,所有的依赖、监听的网络端口、运行产生的垃圾文件都被隔离在Docker容器里,应用数据、日志、服务端口被 Docker 以统一的形式暴露出来,简单且易维护。
但它的缺点,也是“隔离”。在生产环境中,我们当然认为最干净的环境是最好的,但一旦某些bug暴露出来,需要我们去对容器中的服务进行操作时,比如写个Python、修改数据库内容、调试服务连通性,就到了令人头痛的时候了。在容器里, dig
、 netstat
这种豪华的工具自然不能指望,有的容器里连 wget
、 curl
这种最基本的命令行工具都没有。怎么办呢?
一般来讲,我们有两种选择。一是把服务端口暴露出来,在容器外面连接暴露端口进行操作。二是在容器内安装我们需要的调试工具、运行环境,或将必要的工具 bind mount 进去,在容器内部进行操作。但这两种方式,各有优点,也各有缺点。所以今天,我们试一试第三种选择——使用 nsenter
工具,让宿主机上的程序“借用” Docker 容器的运行上下文 [1] (主要是网络与进程namespace),打破容器内外的界限,方便开发者利用宿主机上的工具快速解决问题。
同时,文中还会分享我写的一个小脚本,通过我们宿主机 glibc 提供的一个特殊机制,优雅的解决容器内网域名解析的问题。我敢打包票,针对这个问题,我这个绝对是东半球第二好用的解决方案。