容器网络:来去自由的日子,不买公寓去合租

容器网络中如何融入物理网络?


了解了容器背后的技术,接下来我们来看,容器网络究竟是如何融入物理网络的?如果你使用 docker run 运行一个容器,你应该能看到这样一个拓扑结构。

是不是和虚拟机很像?容器里面有张网卡,容器外有张网卡,容器外的网卡连到 docker0 网桥,通过这个网桥,容器直接实现相互访问。 

如果你用 brctl 查看 docker0 网桥,你会发现它上面连着一些网卡。

那连接容器和网桥的那个网卡和虚拟机一样吗?在虚拟机场景下,有一个虚拟化软件,通过 TUN/TAP 设备虚拟一个网卡给虚拟机,但是容器场景下并没有虚拟化软件,这该怎么办呢?

在 Linux 下,可以创建一对 veth pair 的网卡,从一边发送包,另一边就能收到。

我们首先通过这个命令创建这么一对。

ip link add name veth1 mtu 1500 type veth peer name veth2 mtu 1500

 其中一边可以打到 docker0 网桥上。

ip link set veth1 master testbr    
ip link set veth1 up

那另一端如何放到容器里呢?一个容器的启动会对应一个 namespace,我们要先找到这个 namespace。对于 docker 来讲,pid 就是 namespace 的名字,可以通过这个命令获取。

docker inspect '--format={{ .State.Pid }}' test

假设结果为 12065,这个就是 namespace 名字。

默认 Docker 创建的网络 namespace 不在默认路径下 ,ip netns 看不到,所以需要 ln 软链接一下。链接完毕以后,我们就可以通过 ip netns 命令操作了。

rm -f /var/run/netns/12065    
ln -s /proc/12065/ns/net /var/run/netns/12065

 然后,我们就可以将另一端 veth2 塞到 namespace 里面。

ip link set veth2 netns 12065

然后,将容器内的网卡重命名。

ip netns exec 12065 ip link set veth2 name eth0

 然后,给容器内网卡设置 ip 地址。

ip netns exec 12065 ip addr add 172.17.0.2/16 dev eth0    
ip netns exec 12065 ip link set eth0 up

一台机器内部容器的互相访问没有问题了,那如何访问外网呢? 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值