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"|"Pid"'"Pid": 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: eth0@if55: <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: eth0@if55: <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

Docker 网络命名空间相关推荐

  1. docker(十一):网络命名空间

    一.网络命名空间应用docker实例 1.创建busybox容器test1,并且一直运行 sudo docker run -d --name test1 busybox /bin/sh -c &quo ...

  2. 谈谈 Docker 网络

    基于近期学习的 Docker 内容,整理与 Docker 网络相关的知识. 实验环境:Centos 7.4 Docker 版本如下: Client:Version: 18.03.1-ceAPI ver ...

  3. linux网络命名空间详解,Linux Network Namespace (netns) 详解

    Linux Network Namespace (netns) 详解 Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间 ...

  4. linux网络命名空间详解,『中级篇』 Linux网络命名空间(25)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』 Linux网络命名空间(25) docker底层技术,非常重要的关于namespace,network的names ...

  5. Docker网络和服务发现

    [编者的话] 本文是<Docker网络和服务发现>一书的全文,作者是Michael Hausenblas.本文介绍了Docker世界中的网络和服务发现的工作原理,并提供了一系列解决方案. ...

  6. Docker 网络基础原理

    网络基础 网络分层模型 公有IP和私有IP Public IP:互联网上的唯一标识,可以访问internet Private IP:不可在互联网上使用,仅供机构内部使用 A类10.0.0.0--10. ...

  7. docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

    本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...

  8. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  9. docker网络--理解linux底层实现机制、docker网络模式

    1. Linux网络基础 Linux内核具有非常成熟和高性能的TCP / IP堆栈实现.Docker网络使用linux内核的网络堆栈作为低级原语来创建高级网络驱动程序.简而言之,Docker网络就是 ...

最新文章

  1. [ATC 17] StreamBox: 面向多核机器上的针对Records的无序到达的实时流处理系统
  2. NodeJs连接Mysql数据库
  3. bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
  4. TensorFlow2.0(六)--超参数搜索
  5. 会涨价么?苹果iPad和MacBook拟采用三星OLED屏幕
  6. 如何协助 MySQL 实现 Oracle 高级分析函数
  7. python手机版做小游戏代码大全-12岁的少年教你用Python做小游戏
  8. python-一些文件相关的操作
  9. 程序员应该有的一些好习惯!
  10. LODOP属性和方法
  11. LQA: Time of day is written with a “dot” not a “colon” (13.14 not 13:14)
  12. WKWebView 播放下载的本地mp4文件
  13. 华硕主板固态硬盘不识别_华硕主板认不到固态硬盘怎么办?
  14. 【STemWin】STM32F429IG单片机用LTDC驱动正点原子7寸RGB彩色触摸屏,并裸机移植STemWin图形库
  15. 电脑怎么装免费office
  16. 成功解决设置vive cosmos无线套件遇到的三个问题
  17. VsCode 刷 LeetCode解决办法
  18. Web3D虚拟人捏脸
  19. #【精华】转换大写人民币
  20. linux下mplayer卸载,Linux下播放器之Mplayer安装心得

热门文章

  1. C语言 函数指针和指针函数区别 - C语言零基础入门教程
  2. 程序猿 - 超实用的工具、素材、学习网站分享
  3. jq之slideup()
  4. jq之callback
  5. BugkuCTF-MISC题妹子的陌陌
  6. Linux文件的三种时间属性
  7. rodbc 连接oracle,R語言 使用RODBC連接oracle數據庫
  8. ctf mysql hash传递_分享个 CTF 小工具 bruteHASH
  9. mysql galera haproxy_安装配置Haproxy代理MySQL Galera集群
  10. java规定日期格式输出_Java格式化输出日期百分比时间等