在主机操作容器网络namespace并添加veth ## 在主机进入容器的网络ns - 运行容器 ``` docker run -it --name=test alpine ``` - 此时,已经有一个容器running啦。 ``` docker ps 70dd731cdf21 alpine "/bin/sh" 5 minutes ago Up 5 minutes test ``` - 将容器的ns与主机进行软链 ``` ln -s /var/run/docker/netns /var/run/netns ``` - 使用命令查看当前的netns ``` ip netns list bc25af228e52 (id: 0) ``` - 咦,bc25af228e52 != 容器ID 70dd731cdf21呀,这个不急,因为这个bc25af228e52是容器的网络SandboxKey,而不是容器ID。使用下面的命令: ``` docker inspect 70dd731cdf21|grep SandboxKey "SandboxKey": "/var/run/docker/netns/bc25af228e52", ``` - 确认无误执行一个命令试试 ``` ip netns exec bc25af228e52 ifconfig eth0: flags=4163 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。如果想设置一些其它的东西,那就很开心了。 ## 把veth的一端添加到容器中 上面已经可以操作容器的ns了,现在更进一步,添加一个veth进去玩。 ``` ip link add veth0 type veth peer name veth1 ip a # ...省略1000字 可以看到这对veth 7: veth0@veth1: 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: 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 ``` 来自 大脸猪 写于 2020-01-16 01:15 -- 更新于2020-10-19 13:06 -- 0 条评论