使用十几行脚本在容器网络命名空间内并且执行宿主空间的命令
通常容器内是没有 netstat
tcpdump
命名的,甚至 ip
都没有。
在需要排查容器内网络问题的时候,只能临时下载这些命令,操作起来很浪费时间。
一般而言,宿主机内部携带的命令会多一些,那么可以利用宿主机的命令来观测容器内的网络状态的。
- 使用 docker inspect 找到容器的命名空间路径
- 使用 ip 命令来切换命名空间并且执行命令
ip netns 只能识别到 /var/run/netns 中的命名空间
shell
#!/bin/bash
container_name=${@:1:1}
command=${@:2}
if [ -z "$container_name" ]; then
echo "Usage: $0 <container_name> <command>"
exit 1
fi
if [ -z "$command" ]; then
echo "Usage: $0 <container_name> <command>"
exit 1
fi
exec_inside_container() {
set -e
sandbox_key=$(docker inspect $container_name --format '{{ .NetworkSettings.SandboxKey }}')
netns_name=$1-$(basename $sandbox_key)
set +e
rm -f /var/run/netns/$netns_name
ln -s $sandbox_key /var/run/netns/$netns_name
ip netns exec $netns_name $command
rm -f /var/run/netns/$netns_name
}
exec_inside_container $container_name $command
如:在宿主机内查看容器内的网卡信息
shell
$ ./nsexec.sh ubuntu ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
1116: eth0@if1117: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever