当Docker容器启动后如果不是主机模式,那么将会在宿主机上面创建一个新的网络命名空间。容器有独立的网络空间,在这个网络空间中有独立的网卡和协议栈。
如果容器因为网络故障无法启动,譬如容器启动会链接etcd,如果连不上则会导致无法启动。因为容器无法启动,就不能通过dockerexec进入容器网络空间排查问题。
由于容器网络空间没有链接到“/var/run/netns”下,所以没法通过ipnetns命令管理,为了方便排查问题,可以将容器的网络命令空间链接到“/var/run/netns”下。具体命令如下:
#pid=$(dockerinspect-f'{{.State.Pid}}'${container_id})#mkdir-p/var/run/netns/#ln-sfT/proc/$pid/ns/net/var/run/netns/$container_id
链接完后有两种方式。方法一是通过ipnetns命令进入容器,排查问题。
#ipnetnsexec$container_idsh
除此之外,也可以通过方法二nsenter命令,也可以进入容器网络空间
#nsenter-t$pid-nsh
在k8s的环境中,也经常会遇到这个问题,为此k8s提供了Debug容器,通过kubectldebug命令,启动一个debug容器,挂载到业务容器的网络空间中。相当于dockerrun-net的方式启动一个debug容器,和业务容器共享网络空间。