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