docker 网络理论知识点 - CNM 和命名空间

Network

1 network namespace

1.1 动手小实验

网络命名空间。linux kernel 提供的网络虚拟化的功能。创建多个隔离的网络空间。每个空间内 firewall, ether card, router table,协议栈 都是独立的,就像单独主机。

Namespace是Linux提供的一种对于系统全局资源的隔离机制;从进程的视角来看,同一个namespace中的进程看到的是该namespace自己独立的一份全局资源,

【实验】动手实现一下下面

image.png

# 创建namespace
ip netns add ns1
ip netns add ns2
ip netns exec ns1 ip a

创建一条 veth pair 连接:

ip link add veth-ns1 type veth peer name veth-ns2

可以发现此时多了两个网络接口:

image.png

两个接口 interface 的名字分别为: veth-ns1 veth-ns2

把他们分配给两个 namespace:

ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2

插上了:

image.png

ns2 也一样。

下面给他俩分配 ip address:

ip netns exec ns1 ip a add 192.168.1.1/24 dev veth-ns1
ip netns exec ns1 ip a add 192.168.1.2/24 dev veth-ns2

让网卡UP:

ip netns exec ns1 ip link set dev veth-ns1 up
ip netns exec ns2 ip link set dev veth-ns2 up

可以 ping 通了:

image.png

ns2 也一样。

2 回到 docker

CNM 容器网络模型。一种规范。沙盒sadbox + 终端endpoint + 网络network

sadbox -> namespace
endpoint -> veth interface 网卡

网桥和 router 的区别: 网桥用于同构网络,同网段通信;router用于异构网络,不同网段通信。

image.png

image.png

如上图。注意,C身上的两个终端(网卡)是不能通信的,除非有内部路由器。

2.1 driver and docker0

2.2 network

image.png

上图第一个是 “单机桥接网络”。

你可以自己给 docker 添加 network. docker run 时还可以连:

	-network network    Connect a container to a network

DRIVER 驱动就是代码实现。

2.3 网桥 docker0

bridge network 是由 Bridge driver 驱动创建的,并创建一个默认网桥 docker0。

现实生活中真实的网桥长这样:

image.png
让我们看看名为 bridge 的 network:

docker network inspect bridge

image.png

几个重要字段:

{
	"Name": "bridge",
	"Driver": "bridge",
	"IPAM": {
		"Config": [
			{
				"Subnet": "172.17.0.0/16",
				"Gateway": "172.17.0.1"
			}
		]
	},
	"Containers": {
		"79a86.............":{
			"Name": "container0",
			"IPv4Address": "172.17.0.2/16"
		},
		"d61ee3.............":{
			"Name": "container0",
			"IPv4Address": "172.17.0.2/16"
		}
	},
	"Options": {
		"com.docker.network.bridge.name": "docker0"
	}
}

该网络中有两个container, 用的 docker0 做的网桥。

bridge network 是由 Bridge driver 创建的,并创建一个默认网桥 docker0。 container 与网桥间通过 veth pair 连接, 网桥与外网间通过 NAT 网络地址转换技术 连接。

image.png

我们还可以把容器们布置成这种结构:

image.png

inspect可以看到如下信息, 就不截图了。

containerIP Addr
bb1-interface1172.17.0.2/16
bb2-interface1172.17.0.3/16
bb2-interface2172.18.0.2/16
bb3-interface1172.18.0.3/16

3 总结

一个 network namespace 就代表一个独立的主机,一个容器就对应一个 namespace,所以一个容器就代表了网络中的一个独立主机。

CNM 是规范,Libnetwork 是规范的实现。Driver 是 Libnetwork 中不同网络模式的实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值