Docker   发布时间:2019-11-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Docker 网络之进阶篇大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

https://www.cnblogs.com/sparkdev/p/6286081.html" target="_blank">Docker 基础 : 网络配置》一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段。时过境迁,随着 docker 的快速发展,其网络架构也在不断的演进。本文主要介绍 docker 的 CNM 网络模型以及新引入的 network 子命令。

CNM 定义了构建容器虚拟化网络的模型,同时还提供了可以用于开发多种网络驱动的标准化接口和组件。Libnetwork 和 docker daemon 及各个网络驱动的关系可以通过下图形象的表示:

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/ac9394c7d92a807a4c17d12b048aa3df.png" >

沙盒(sandboX)、端点(endpoint)网络(network) 3 种组件。Libnetwork 中内置的 5 种驱动则为 libnetwork 提供了不同类型的网络服务。下面分别对 CNM 中的 3 个核心组件和 libnetwork 中的 5 种内置驱动进行介绍。

  • 沙盒:一个沙盒包含了一个容器网络栈的信息。沙盒可以对容器的接口(interfacE)、路由和 DNS 设置等进行管理。沙盒的实现可以是 Linux network namespace、FreeBSD Jail 或者类似的机制。一个沙盒可以有多个端点和多个网络。
  • :一个端点可以加入一个沙盒和一个网络。端点的实现可以是 veth pair、Open vSwitch 内部端口或者相似的设备。一个端点可以属于一个网络并且只属于一个沙盒。
  • :一个网络是一组可以直接互相联通的端点。网络的实现可以是 Linux bridge、VLAN等。一个网络可以包含多个端点。

bridge 驱动:这是 docker 设置的默认驱动。当使用 bridge 驱动时,libnetwork 将创建出来的 docker 容器连接到 docker0 网桥上。对于单机模式,bridge 驱动已经可以满足基本的需求了。但是这种模式下容器使用 NAT 方式与外界通信,这就增加了通信的复杂性。:使用 host 驱动的时候,libnetwork 不会为容器创建网络协议栈,即不会创建独立的 network namespace。Docker 容器中的进程处于宿主机的网络环境中,相当于容器和宿主机共用同一个 network namespace,容器共享使用宿主机的网卡、IP 和端口等资源。Host 模式很好的解决了容器与外界通信的地址转换问题,可以直接使用宿主机的 IP 进行通信,不存在虚拟化网络带来的开销。但是 host 驱动也降低了容器与容器之间、容器与宿主机之间网络的隔离性,引起网络资源的竞争和冲突。因此可以认为 host 驱动适用于对容器集群规模不大的场景。:overlay 驱动采用 IETF 标准的 VXLAN 方式,并且是 VXLAN 中被普遍认为最适合大规模的云计算虚拟化环境的 SDN controller 模式。在使用的过程中,还需要一个额外的配置存储服务,比如 Consul、etcd 或 ZooKeeper 等。并且在启动 docker daemon 的时候需要添加额外的参数来指定所使用的配置存储服务地址。:这个驱动实际上并未做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,是 libnetwork 实现了驱动的插件化,更好地满足了用户的多样化需求。用户只要根据 libnetwork 提供的协议标准实现其接口并注册即可。:使用这种驱动的时候,docker 容器拥有字段的 network namespace,但是并不为 docker 容器进行任何网络配置。也就是说,这个容器除了 network namespace 自带的 loopBACk 网卡外,没有任何其它网卡、IP、路由等信息,需要用户为该容器添加网卡、配置 IP 等。这种模式如果不进行特定的配置是无法正常使用网络的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/d922ec2a5643794ACB0de9a66b08e714.png" >

在本例中,我使用 docker 默认的 bridge 驱动创建了一个网络拓扑应用:

  • BACkend network 为后端网络,frontend network 则为前端网络,两个网络互不连通。

BACkend 和 frontend 的两个网络:

BACkend $ docker network create frontend $ docker network

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/7bad1a825ce13a487258b380fdec74fe.png" >

BACkend 和 frontend 之外,还有三个网络 bridge、host 和 none。这三个网络是 docker daemon 默认创建的,我们无法通过 docker network rm 命令进行删除。并分别把 con1 和 con2 加入到 BACkend 网络中,把 con3 加入到 frontend 网络中:

$ docker run -it --name con1 --BACkend busybox $ docker run -it --name con2 --BACkend busybox $ docker run -it --name con3 --net frontend busybox

BACkend 网络中,所以两者可以连通。但是 con3 和 con2 不在一个网络中,所以它们之间不能连通。

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/620c0b5148562f0a192f4f5092948e32.png" >

BACkend 同在一个 IP 段的 IP 地址,这个网卡就是 CNM 模型中的端点。然后我们通过下面的命令把 con2 也加入到 frontend 网络中:

$ docker network connect frontend con2

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/bb6410647a63959e11688b7a789d79c9.png" >

title="Docker 网络之进阶篇" alt="Docker 网络之进阶篇" src="https://cn.js-code.com/res/2019/02-09/09/1cdaad6f902cb1ced4a05d1df9032a03.png" >

可知,docker network connect 命令会在所连接的容器中创建新的网卡,以完成容器与所指定网络的连接

完全可以依据 CNM 标准来实现自定义的网络驱动。

考:

大佬总结

以上是大佬教程为你收集整理的Docker 网络之进阶篇全部内容,希望文章能够帮你解决Docker 网络之进阶篇所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: