Docker的网络类型及驱动器

计算机如果不能够联网,其价值就要大打折扣。类似的,一个Docker容器也需要通过网络访问其他资源,或者被其他资源访问。这就涉及到Docker容器实例的网络,也与Docker宿主机的网络息息相关。

总的来说,Docker的网络是一个通过多种网络驱动器(driver)实现的Docker子系统。根据网络驱动器的不同,Docker提供了不同特性的网络,Docker容器实例也因加入不同的网络而具有不同的网络访问特性。

目前(Docker v18.03),Docker Engine内置支持如下几种类型的网络。

  • host类型的网络
  • bridge类型的网络
  • overlay类型的网络
  • macvlan类型的网络
  • none类型的网络

Docker Engine启动时,即默认创建如下三个网络。

[root@myhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
bc096d60cb79        bridge              bridge              local
ba805516b064        host                host                local
5a9904b67539        none                null                local
  • bridge网络,该网络的名字为bridge,bridge类型的网络
  • host网络,该网络的名字为host,host类型的网络
  • none网络,该网络的名字为none,none类型的网络

1. host网络

host网络就是Docker宿主机的网络,是Docker Engine启动即默认创建的网络之一。host网络的网络驱动器为host,即创建网络时,使用-d=host表示创建的是host类型的网络。

注意,Docker Engine启动时默认创建的3个网络中有一个host类型的网络,其名称也是host。后续创建容器实例时,使用--net=host表示创建的容器实例加入到默认的host网络中。

加入到该网络中的所有容器实例,容器实例与容器宿主机之间没有网络隔离,所以容器实例都直接使用宿主机的网络,拥有与宿主机一样的IP,使用的是宿主机的端口。即所有容器实例的使用网卡都是宿主机的网卡,所有容器实例的IP都是宿主机的IP。一个宿主机上的所有容器实例,默认都是相通的,彼此之间通过localhost即可互相访问。不同的容器实例使用的网络端口(其实就是宿主机的端口)必须不同,否则会因冲突而无法启动容器实例。

2. bridge网络

Docker Engine启动即默认创建的网络之一。bridge网络的网络驱动器为bridge,即-d=bridge

该网络支持在同一个宿主机上的各个容器实例之间的通信。bridge网络是一个独立的网络空间,在网络空间内部的各个容器实例能够直接通信。各个容器实例都是连接到一个网桥,即docker0。docker0通过iptables维护了一个NAT路由表,能够连接bridge网络与宿主机的网卡。外部请求到达宿主机的网卡后,根据“宿主机IP:宿主机端口”与“容器实例IP:容器实例端口”之间的映射关系,进行NAT转发,从而实现外部请求与容器实例之间的通信。当然,这要求在启动容器实例的时候即通过--publish建立端口映射关系。

新创建的容器实例默认就会加入bridge网络,即容器实例默认连接到docker0。创建容器实例可以通过使用--network指定加入到其他已有的网络。

也可以另外创建一个定制的bridge网络,创建的bridge网络会覆盖默认的bridge网络。默认的bridge网络不支持服务的DNS自动发现,即一个容器实例要通过容器实例的name找到容器实例的IP,就无法使用该网络。定制的bridge网络,最大的好处是默认即支持服务的自动发现。

docker0作为bridge网络的网关,默认IP为172.17.0.1,默认子网172.17.0.0/16。在bridge网络中,新创建的容器实例会按照顺序获取网络IP,如172.17.0.2,172.17.0.3,...。所以重启容器实例后,容器的IP可能就变化了。

3. none网络

none网络是Docker Engine启动即默认创建的网络之一。none网络的网络驱动器为none,即-d=none

none网络是一个完全隔离的自治网络,甚至与Docker宿主机的网络都不通,必须手工配置网卡后才能够使用。

加入到该网络的容器实例,往往要在后续设置中加入到其他的第三方网络。

4. overlay类型的网络

overlay类型的网络的网络驱动器为overlay,即-d=overlay

该类型的网络适用于Docker宿主机集群中的各个独立的容器实例之间通信。为集群中的Docker容器实例提供跨多个Docker Engine的网络连接。

5. macvlan类型的网络

macvlan类型的网络的网络驱动器为macvlan,即-d=macvlan

该类型的网络适用于容器实例需要与宿主机的MAC地址直接通信,无需端口映射,也无需NAT,容器实例的eth0直接与宿主机的物理网卡通信。容器实例可以被赋予公共IP,并从宿主机外部直接访问。

在某些历史遗留应用中,只能通过MAC通信,与之通信的容器实例也必须拥有MAC地址。这时容器实例就如同真实的物理设备一样。

6. 其他remote网络

相对于Docker Engine内置支持的几种网络,其他通过第三方驱动器创建的网络都被统称为remote类型的网络。

第三方网络驱动器都是以网络插件的方式提供。截至目前,通过官方认证的网络插件如下:

  • Weaveworks提供的Weave Net
  • Cisco Systems提供的Contiv Network Plugin
  • Infoblox提供的Infoblox IPAM Plugin

下面以Weave Net为例简单说明。

  • 安装Weave Net插件

            docker plugin install store/weaveworks/net-plugin:2.5.0 --grant-all-permissions

  • 查看插件

            docker plugin ls

  • 创建网络myweavenet

            docker network create --driver=store/weaveworks/net-plugin:2.5.0 myweavenet

 

参考链接:

https://success.docker.com/article/networking

https://docs.docker.com/network/

https://docs.docker.com/v17.09/engine/userguide/networking/

https://store.docker.com/search?category=network&q=&type=plugin

你可能感兴趣的:(Docker)