docker run -it --name=test alpine
docker ps
70dd731cdf21 alpine "/bin/sh" 5 minutes ago Up 5 minutes test
ln -s /var/run/docker/netns /var/run/netns
ip netns list
bc25af228e52 (id: 0)
docker inspect 70dd731cdf21|grep SandboxKey
"SandboxKey": "/var/run/docker/netns/bc25af228e52",
ip netns exec bc25af228e52 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 25 bytes 1942 (1.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此时执行ifconfig,可以明确的看到显示的IP不是主机的IP,而是这个容器的IP 172.17.0.2。如果想设置一些其它的东西,那就很开心了。
上面已经可以操作容器的ns了,现在更进一步,添加一个veth进去玩。
ip link add veth0 type veth peer name veth1
ip a
# ...省略1000字 可以看到这对veth
7: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 42:a1:b3:9e:99:3a brd ff:ff:ff:ff:ff:ff
# 修改设备的网络ns
ip link set dev veth1 netns bc25af228e52
# 查看一下效果
ip netns exec bc25af228e52 ip a
# ........省略1000字,发现,真的在啊,大功告成
6: veth1@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d2:aa:b6:90:31:28 brd ff:ff:ff:ff:ff:ff link-netnsid 0