容器虚拟化网络漫谈(上)

本文探讨了Docker如何利用Linux的Namespace实现容器的网络隔离,详细介绍了Namespace、Veth和Linux Bridge的概念及其在网络虚拟化中的应用。通过实例展示了如何创建和配置网络命名空间、Veth对以及Bridge,实现容器间的通信以及与外部网络的连接。内容涵盖ip命令的使用,以及iptables和路由表在容器网络中的作用。
摘要由CSDN通过智能技术生成

当我们安装好 Docker 后,它会为我们处理好所有与网络虚拟化有关的事,但在这背后,Docker 实际上是利用了多个 Linux 提供的特性来完成这一切,这也是当初 Docker 刚发布时被批评为「新瓶装旧酒」的原因,因为实际上 Docker 只是包装了操作系统的能力并提供了一套易用的 API,并没有发明什么新东西。

ps: 当然我并不同意这个观点 :)

这篇文章中会大量使用 ip 这个命令,ip 命令来自于 iproute2 包,一般系统会默认安装,如果没有的话,请自行安装,此外 ip 命令因为需要修改系统网络设置所以需要 root 权限,所以请不要在生产环境或者重要的系统中尝试,以防产生预期外的错误。

一、Linux Namespace

Namespace 是 Linux 提供的一种对于系统全局资源的隔离机制;从进程的视角来看,同一个namespace中的进程看到的是该namespace自己独立的一份全局资源,这些资源的变化只在本 namespace 中可见,对其他namespace没有影响。Docker 就是采用namespace 机制实现了对网络,进程空间等的隔离。不同的 container属于不同namespace,实现了container 之间的资源互相隔离,互不影响。

通过 namespace 可以隔离容器的进程 PID、文件系统挂载点、主机名等多种资源。不过我们今天只关注网络 namespace,简称 netns。它可以为不同的命名空间从逻辑上提供独立的网络协议栈,具体包括网络设备、路由表、arp表、iptables、以及套接字(socket)等。使得不同的网络空间就都好像运行在独立的网络中一样。

首先我们先尝试创建一个新的的 netns:

ip netns add netns1

接下来我们检查一下这个 netns 的路由表、Iptables及网络设备等信息:

[root@centos ~]$ ip netns exec netns1 route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

[root@centos ~]$ ip netns exec netns0 iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

[root@centos ~]$ ip netns exec netns1 ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

可以看到,由于是新创建的 netns,以上所有信息都为空,只存在一个状态为 down 的 lo 设备

通过 netns 我们可以隔离不同容器之间的协议栈,避免相互影响和污染,接下我们会尝试如何在不同的 netns 相互通信。

二、Veth

Linux 提供了一种用软件来模拟硬件网卡的方法: Veth(Virtual Ethernet devices),Veth 是 Linux 中一种虚拟出来的网络设备,veth 总是成对出现,所以一般也叫 veth-pair,其作用非常简单:如果 v-a 和 v-b 是一对 veth 设备,v-a 发送的数据会由 v-b 收到。反之亦然,其实说白了,Veth就是一根“网线”,你从一头发数据,自然可以从另一头收到数据。

veth 的两头都直接连着网络协议栈,所以你创建一个veth对,主机上就会多两个网卡,实际上这种虚拟设备我们并不陌生,我们本机网络 IO 里的 lo 回环设备(127.0.0.1)也是这样一个虚拟设备。唯一的区别就是 veth 总是成对地出现。

在 Linux 下我们可以使用 ip 命令创建一对 veth,使用 ip link add 创建一对 veth0@veth1 的网卡, ip link 表示这是一个链路层的接口:

$ ip link add veth1 type veth peer name veth1-peer

使用 ip link show 来进行查看,此时可以看到,veth1@veth1-peer 相互连接:

[root@centos ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:09:10:27 brd ff:ff:ff:ff:ff:ff
5: veth1-peer@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 06:20:02:e7:bf:bd brd ff:ff:ff:ff:ff:ff
6: veth1@veth1-peer: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether aa:c4:57:ee:46:60 brd ff:ff:ff:ff:ff:ff

将 veth1 这头添加到我们刚才创建的 netns1 中:

$ ip link set veth1-peer netns netns1

此时再进行检查会发现 veth1 已经不见了,因为这个设备已经到了 netns0 中:

[root@centos ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值