株洲网站建设服务,山东省建设工程招投标网站,关于加强机关网站建设,烟台网站推广广州公司Docker 用户可以通过与 CNM 的 Object 以及 API 的交互来管理对应容器的网络#xff0c;下面是一个典型的容器网络生命周期#xff1a; 1、Driver要向NetworkController注册。内置的Driver在Libnetwork内注册#xff0c;远程的Driver则通过Plugin mechanism注册。每一个Driv…Docker 用户可以通过与 CNM 的 Object 以及 API 的交互来管理对应容器的网络下面是一个典型的容器网络生命周期 1、Driver要向NetworkController注册。内置的Driver在Libnetwork内注册远程的Driver则通过Plugin mechanism注册。每一个Driver处理特定的networkType。 2、libnetwork.New()NetworkController通过libnetwork.New()创建用于Network的创建以及通过一些特定的Options配置Driver。 3、controller.NewNetwork()Network通过给这个API提供name和networkType来创建networkType参数用来选择特定的Driver并且将创建的Network和该Driver相关联。从此以后对于Network的任何操作都由Driver处理。controller.NewNetwork() 还有一个可选的options参数用于提供特定Driver的options和Labels。 4、network.CreateEndpoint()可以用于在给定的Network中创建一个新的Endpoint。同时该API还有一个可选的options参数供Driver使用。这个options既可以携带已知的labels也可以携带和特定Driver相关的labels。之后调用相应的Driver的driver.CreateEndpoint它可以为在一个Endpoint在Network中被创建时为它们保留IP地址。Driver会通过driverapi中定义的InterfaceInfo进行这些地址的赋值。IP地址将和endpoint暴露的端口用来完善Endpoint作为Service的定义。事实上Service endpoint不是其他什么东西仅仅只是一个网络地址以及该应用的容器监听的端口号。 5、endpoint.Join()用于将Endpoint与一个容器相连接。Join操作会先创建一个Sandbox如果对应的容器中还没有的话。Driver可以使用Sandbox Key来识别连接到同一个容器的多个Endpoint。这个API同样接受可选的options参数供Driver使用。 - 虽然这并不是Libnetwork直接的设计要求但是我们鼓励像Docker这样的用户在执行容器的Start()操作时即在容器可以操作之前调用endpoint.Join()。 - 另一个关于endpoint.join()这个API经常被提到的问题是为什么我们需要一个API创建Endpoint和另一个API来join endpoint。事实上Endpoint代表的是一个Service它可能有也可能并没有容器支持。当一个Endpoint被创建的时候会预留它所需的资源因此任何容器都能连接该Endpoint并且获得一个一致的网络行为。 6、endpoint.Leave()会在容器停止的时候被调用。Driver可以清除它在调用Join()时获取的状态。Libnetwork会在最后一个Endpoint离开的时候删除Sandbox。但是只要该Endpoint依旧存在Libnetwork会依然保有IP地址并且在有新的容器加入的时候进行重用。这保证了容器的资源在停止并重启的过程中能够重用。 7、endpoint.Delete()用于从一个Network中删除Endpoint。这将导致Endpoint的删除以及清空缓存的sandbox.Info。 8、network.Delete()用于删除Network。如果还有Endpoint连接到该网络Libnetwork是不允许对它进行删除的。 docker 常常使用 linux netns 实现网络资源隔离但使用 ip netns 命令却无法查看这是因为 docker 默认把创建的网络命名空间链接文件隐藏起来了导致 ip netns 命令无法读取可以通过下面的方法复现 docker 的 ip netns 命名空间。
# 创建一个带有桥接网络的 docker 容器
$ docker run -it -d --rm --name mytest --network bridge cirros /bin/sh
c093857c756028b4d4f37b16262d017239236bde22a3545f8769fd17366f183a
$ docker ps | grep mytest
c093857c7560 cirros /bin/sh 6 seconds ago Up 2 seconds mytest
# 可以通过 inspect 命令查看该容器的 ip 地址和进程号
$ docker inspect mytest |egrep IPAddress|PidPid: 14908,IPAddress: 172.17.0.2,# 通过进程号参考容器进程
$ ps -fp 14908
UID PID PPID C STIME CMD
root 14889 1676 0 11:42 containerd-shim -namespace moby \-workdir
/var/lib/containerd/io.containerd.runtime.v1.linux/moby/c093857c756028b4d4f37b16262d017239236bde22a3545f8769fd17366f183a \-address /run/containerd/containerd.sock \-containerd-binary /usr/bin/containerd \-runtime-root /var/run/docker/runtime-runc# 通过 nsenter 进入容器网络空间
$ nsenter --target 14908 --net ip a
1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
54: eth0if55: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UPlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 通过软连接容器命名空间实现在 ip netns 下显示
$ ls /proc/14908/ns/net
lrwxrwxrwx 1 root root 0 Jul 25 11:42 /proc/14908/ns/net - net:[4026532445]
$ ln -s /proc/14908/ns/net /var/run/netns/mytest# 最后检查一下
$ ip netns
mytest (id: 1)
$ ip netns exec mytest ip a
1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
54: eth0if55: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UPlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever