Docker网络基础

编程

一、 网络命名空间

为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议栈被隔离到不同的命名空间中。

  • 好处:通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。并且,在Linux的网络命名空间中可以有自己独立的路由表及独立的iptables设置来提供包转发、NAT及IP包过滤等功能。
  • 难处:为了隔离出独立的协议栈,需要纳入命名空间的元素有进程、套接字、网络设备等。
  • 方法:Linux的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须被修改为协议栈私有。最好的办法就是让这些全局变量称为一个Net Namespaces变量的成员,然后为协议栈的函数调用加入一个Namespaces参数。这就是Linux实现网络命名空间的核心。

命令:

  1. 创建一个命名空间:

ip netns add <name>

  1. 在命名空间中执行命令:

ip netns exec <name> <command>

  1. 通过bash命令进入内部的shell界面:

ip netns exec <name> bash

  1. 退出到外面的命名空间时,请输入exit

由于一个设备只能属于一个命名空间,所以转移后在这个命名空间中就看不到这个设备了。具体哪些设备能被转移到不同的命名空间呢?在设备里面有个重要的属性:NETIF_F_ETNS_LOCAL,如果这个属性为on,就不能转移到其他命名空间中。而很多其他设备如lo设备、vxlan设备、ppp设备、bridge设备等都是不可转移的。将无法转移的设备移动到别的命名空间时,会得到无效参数的错误提示。

命令:

  1. 转移设备至命名空间:

ip link set <device> netns <namespace>

  1. 查看设备是否可以转移:

ethtool -k <device>

操作

# ip netns add netns1

# ip netns show

netns1

# ip netns exec netns1 ip link show

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

# ip netns exec netns1 bash

# ip link show

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

# exit

exit

# ip link set br0 netns netns1

RTNETLINK answers: Invalid argument

# ethtool -k br0

netns-local: on [fixed]

# ip netns del netns1

由于网络命名空间代表的是一个独立的协议栈,所以它们之间是相互隔离的,彼此无法通信,在协议栈内部都看不到对方。为了打破这种限制,让处于不同命名空间的网络相互通信,甚至和外部的网络进行通信,我们应用“Veth设备对”即可达到。

二、Veth设备对

Veth设备对的一个重要作用就是打通相互看不到的协议栈之间的壁垒,它就像一条管子,一端连着这个网络命名空间的协议栈,一端连着另一个网络命名空间的协议栈。

由于要连接两个网络命名空间,所以Veth设备都是成对出现的,就像是一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。

命令:

创建Veth设备对:

ip link add <veth0> type veth peer name <veth1>

  • 生成的两个设备中,一个是veth0,它的peer是veth1

操作:

# ip netns add netns1

# ip link add veth0 type veth peer name veth1

# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default

link/ether f8:b1:56:d8:da:0a brd ff:ff:ff:ff:ff:ff

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default

link/ether 02:42:82:ad:fa:6c brd ff:ff:ff:ff:ff:ff

14: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

link/ether 7a:f0:93:10:6f:69 brd ff:ff:ff:ff:ff:ff

15: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

link/ether 9e:dd:2b:54:78:31 brd ff:ff:ff:ff:ff:ff

# ip link set veth1 netns netns1

# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default

link/ether f8:b1:56:d8:da:0a brd ff:ff:ff:ff:ff:ff

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default

link/ether 02:42:82:ad:fa:6c brd ff:ff:ff:ff:ff:ff

15: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

link/ether 9e:dd:2b:54:78:31 brd ff:ff:ff:ff:ff:ff

# ip netns exec netns1 ip link show

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

14: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000

link/ether 7a:f0:93:10:6f:69 brd ff:ff:ff:ff:ff:ff

# ip netns exec netns1 ip addr add 10.1.1.1/24 dev veth1

# ip addr add 10.1.1.2/24 dev veth0

以上是 Docker网络基础 的全部内容, 来源链接: utcz.com/z/511285.html

回到顶部