Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:

  • bridge:docker默认的网络驱动。如果未指定驱动程序,则这是需要创建的网络类型。当应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。
  • host:对于独立的容器,删除容器和Docker主机之间的网络隔离,并直接使用主机的网络(若启用特权容器,将可以直接修改宿主机网络设置)。host仅适用于Docker 17.06及更高版本上的swarm群集服务。
  • overlay:Overlay networks将多个Docker守护程序连接在一起,并使swarm群集服务能够相互通信。还可以使用Overlay networks来促进swarm群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略无需在这些容器之间执行OS级别的路由。
  • macvlan:Macvlan网络允许为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan在处理期望直接连接到物理网络的传统应用程序时,使用该驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由
  • none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用,none不适用于swarm集群服务。

 

选择不同的场景:

  1. 当多个容器在同一个Docker主机上进行通信时,用户定义的桥接网络是最佳选择。
  2. 当网络堆栈不应与Docker主机隔离时,主机网络最佳,但您希望隔离容器的其他方面。
  3. 不同Docker主机上运行的容器进行通信时,或当多个应用程序使用swarm服务协同工作时,覆盖网络overlay是最佳选择。
  4. 当您从VM设置迁移或需要您的容器看起来像网络上的物理主机(每个都具有唯一的MAC地址)时,Macvlan网络是最佳的。
  5. 第三方网络插件允许您将Docker与专用网络堆栈集成

bridge网络

桥接网络适用于在同一个Docker守护程序宿主机上运行的容器之间通信。

对于在不同Docker守护程序宿主机上运行的容器之间的通信,可以在操作系统级别管理路由,也可以使用overlay网络

启动Docker时,会自动创建默认桥接网络(也称为bridge),并且除非另行指定,否则新启动的容器将连接到该桥接网络。还可以创建用户自定义网桥,用户定义的网桥优于默认bridge网桥

 

用户定义的网桥与默认网桥之间的差异:

  • 用户定义的桥接网络可在容器化应用程序之间提供更好的隔离和互操作性

连接到同一个用户自定义的网桥的容器会自动将所有端口相互暴露(互操作性),而不会向外界显示任何端口

  • 用户定义的桥接器在容器之间提供自动DNS解析

默认网桥上的容器只能通过IP地址相互访问(或启动容器时使用--link选项连接到另一个容器,这样两个容器也可相互通信,不推荐再使用)。在用户定义的桥接网络上,容器可以通过主机名相互解析

  • 容器可以在运行中随时与用户自定义的bridge网络连接和分离

在容器的生命周期中,可以动态地将其与用户自定义的网络连接或断开。而从默认桥接网络中删除容器,则需要停止容器并使用不同的网络选项重新创建容器

  • 每个用户定义的网络都会创建一个可配置的网桥

如果容器使用默认桥接网络,则可以对其进行配置,但所有容器都使用相同的设置,如MTU和iptables规则。此外,配置默认桥接网络发生在Docker服务之外,并且需要重新启动Docker。

  • 默认桥接网络上的相互链接容器(使用--link选项互联)共享环境变量

最初,在两个容器之间共享环境变量的唯一方法是使用--link选项链接,用户定义的网络无法实现这种类型的变量共享,但有更好的方法来共享环境变量:

    • 多个容器可以使用Docker volume挂载包含共享信息的文件或目录。
    • 可以使用docker-compose一起启动多个容器,并且compose文件可以定义共享变量。
    • 可以使用swarm服务而不是独立容器,并利用secretsconfigs共享。

 

使用docker network create创建和配置用户定义的网桥。如果不同的应用程序组具有不同的网络要求,则可以在创建时单独配置每个用户定义的网桥。

1、管理用户自定义网络

docker  network  create  \

--subnet  172.20.0.1/16 \

  --ip-range  172.20.0.1/24 \

  --gateway  172.20.0.1 \

my-net

可以指定子网,IP地址范围,网关和其他选项

docker  network  rm  my-net                                       #删除用户定义的桥接网络

当创建或删除用户定义的网桥或从用户定义的网桥连接或断开容器时,Docker使用特定于操作系统的工具来管理底层网络基础结构(例如iptablesLinux上添加或删除网桥设备或配置规则)

 

2、将容器连接到用户定义的桥

创建新容器时,可以指定一个或多个--network标志

此示例将Nginx容器连接到my-net网络。它还将容器中的端口80发布到Docker宿主机上的端口8080,因此外部客户端可以访问该端口8080。连接到my-net网络的任何其他容器都可以访问my-nginx容器上的所有端口,反之亦然。

$ docker  create  --name  my-nginx \

  --network  my-net \

--publish  8080:80 \

  nginx:latest

docker  run

若要将正在运行的容器连接到现有的用户定义的桥,使用docker network connect命令(被连接的自定义bridge网络在创建时必须有--attachable选项,而默认的bridge网络默认可以被其他容器连接)

以下命令将已在运行的my-nginx容器连接到已存在的my-net网络

$ docker  network  connect  my-net  my-nginx

 

要断开正在运行的容器与用户定义的桥接器的连接,使用docker network disconnect命令。

以下命令将my-nginx容器与my-net网络断开连接。

$ docker  network  disconnect  my-net  my-nginx

 

示例:

docker network inspect  bridge

docker  run  -itd  --name alpine1 alpine

docker  run  -itd  --name alpine2 alpine

docker network inspect  bridge

进入两个容器中分别使用ip地址(通)、容器名(不通)、主机名(自己通,其他不通)互ping

docker  container  stop  alpine1  alpine2

docker  container  rm  alpine1  alpine2

快捷键:Ctrl+P+Q(在使用docker attach进入容器后退出容器,不不关闭容器,容器将继续运行)

 

docker  run -dit  --name alpine1  --network my-net  alpine

docker  run -dit  --name alpine2  --network my-net  alpine

docker  run -dit  --name alpine3  alpine

docker  run -dit  --name alpine4  --network my-net  alpine

此时进入alpine4中ping 各个容器的IP、主机名、容器名:

alpine4和alpine1及alpine2之间均是通的

alpine4和alpine3均不通

 

docker  network  connect  bridge  alpine4            #让alpine4连接到bridge网络上

此时进入alpine4  ping各个容器的IP、主机名、容器名:

alpine4和alpine1及alpine2之间均是通的

alpine4可ping通alpine3的IP,ping不通alpine3容器的容器名和主机名

由以上说明:

使用默认的bridge各个容器只能使用IP互通

使用自定义的bridge各个容器的IP、主机名、容器名均可互通

docker  network  disconnect  my-net  alpine4

 

docker  container  stop  alpine1 alpine2 alpine3 alpine4

docker  container  rm    alpine1 alpine2 alpine3 alpine4

docker  network    rm  my-net

 

 启用从Docker容器转发到外部网络

默认情况下,来自连接到默认网桥的容器的流量不会转发到外部(即容器的流量不能到达外网)。宿主机启用转发,需要更改两个设置。这些不是Docker命令,它们会影响Docker主机的内核。

  1. 配置Linux内核以允许IP转发。

$ sysctl  net.ipv4.conf.all.forwarding=1

  1. 将策略的iptables FORWARD策略更改DROP为ACCEPT。

$ sudo iptables  -P FORWARD  ACCEPT

 

默认bridge网络不建议用于生产用途

配置dockerd的默认网桥

配置默认bridge网络,请在daemon.json中指定选项。这是一个daemon.json指定了几个选项的示例。仅指定需要自定义的设置。

{

  "bip": "192.168.1.5/24",                                #默认docker0网桥被设置成该地址()

  "fixed-cidr": "192.168.1.5/25",                       #为容器分配的地址限制在这个小子网内

  "fixed-cidr-v6": "2001:db8::/64",

  "mtu": 1500,

  "default-gateway": "10.20.1.1",            

  "default-gateway-v6": "2001:db8:abcd::89",

  "dns": ["10.20.1.2","10.20.1.3"]

}

重新启动Docker以使更改生效

 

posted on 2019-03-07 15:04  苦咖啡~~  阅读(405)  评论(0编辑  收藏  举报