docker-网桥

使用桥接网络

在网络方面,桥接网络是链路层设备,它在网络段之间转发流量。

网桥可以是硬件设备或在主机内核中运行的软件设备。

Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。

Docker桥驱动程序会自动在主机中安装规则,以便不同网桥上的容器无法直接相互通信。

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

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

还可以创建用户定义的自定义网桥。用户定义的网桥优于默认bridge 网络。

 

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

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

    连接到同一个用户定义的网桥的容器会自动将所有端口相互暴露,而不会向外界显示任何端口这使得容器化应用程序可以轻松地相互通信,而不会意外地打开对外界的访问。

    想象一下具有Web前端和数据库后端的应用程序。外部世界需要访问Web前端(可能在端口80上),但只有前端本身需要访问数据库主机和端口。使用用户定义的网桥,只需要打开Web端口,并且数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的网桥访问它。

    如果在默认桥接网络上运行相同的应用程序堆栈,则需要打开Web端口和数据库端口,并使用 每个的标记-p--publish标记。这意味着Docker主机需要通过其他方式阻止对数据库端口的访问。

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

    默认网桥上的容器只能通过IP地址相互访问,除非您使用被认为是遗留--link选项在用户定义的桥接网络上,容器可以通过名称或别名相互解析。

    想象一下与前一点相同的应用程序,具有Web前端和数据库后端。如果你打电话给你的容器webdb,Web容器可以在连接到数据库容器db,无论应用程序堆栈运行在哪个Docker主机上.

    如果在默认桥接网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧--link 标志)。这些链接需要在两个方向上创建,因此可以看到这对于需要通信的两个以上容器而言变得复杂。或者,可以操作/etc/hosts容器中文件,但这会产生难以调试的问题。

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

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

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

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

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

  • 默认桥接网络上的链接容器共享环境变量

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

    • 多个容器可以使用Docker卷装入包含共享信息的文件或目录。

    • 可以一起启动多个容器docker-compose,并且compose文件可以定义共享变量。

    • 可以使用swarm服务而不是独立容器,并利用共享机密和 配置

连接到同一用户定义的网桥的容器有效地将所有端口相互暴露。对于可以访问不同网络上的容器或非Docker主机的端口,必须使用or 标志发布该端口-p--publish

 

创建一个网络

用法

docker network create [OPTIONS] NETWORK

选项

名字,速记 默认 描述
--attachable  
启用手动容器附件
--aux-address   网络驱动程序使用的辅助IPv4或IPv6地址
--config-from  
复制配置的网络
--config-only  
创建仅配置网络
--driver , -d bridge 用于管理网络的驱动程序
--gateway   主子网的IPv4或IPv6网关
--ingress  
创建swarm路由网状网络
--internal   限制对网络的外部访问
--ip-range   从子范围分配容器ip
--ipam-driver   IP地址管理驱动程序
--ipam-opt   设置IPAM驱动程序特定选项
--ipv6   启用IPv6网络
--label   在网络上设置元数据
--opt , -o   设置驱动程序特定选项
--scope  
控制网络的范围
--subnet   表示网络段的CIDR格式子网

 

命令 描述
docker network connect
将容器连接到网络
docker network create
创建一个网络
docker network disconnect
断开容器与网络的连接
docker network inspect
显示一个或多个网络的详细信息
docker network ls
列出网络
vdocker network prune 删除所有未使用的网络
docker network rm
删除一个或多个网络

指定高级选项

创建网络时,默认情况下,Engine会为网络创建不重叠的子网。

此子网不是现有网络的细分。它纯粹用于ip寻址目的。

可以覆盖此默认值并使用该--subnet选项直接指定子网值

在 bridge网络上,只能创建一个子网:

$ docker network create --driver=bridge --subnet=192.168.0.0/16 br0

此外,还可以指定--gateway --ip-range--aux-address 选项。

$ docker network create \
  --driver=bridge \
  --subnet=172.28.0.0/16 \
  --ip-range=172.28.5.0/24 \
  --gateway=172.28.5.254 \
  br0

如果省略该--gateway标志,则引擎会从首选池中为您选择一个标记。对于overlay网络和支持它的网络驱动程序插件,可以创建多个子网。此示例使用两个/25 子网掩码来遵守单个覆盖网络中不超过256个IP的当前指导。每个子网有126个可用地址。

$ docker network create -d overlay \
  --subnet=192.168.1.0/25 \
  --subnet=192.170.2.0/25 \
  --gateway=192.168.1.100 \
  --gateway=192.170.2.100 \
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
  my-multihost-network

确保子网不重叠。如果他们这样做,网络创建失败,引擎返回错误。

桥驱动器选项

创建自定义网络时,默认网络驱动程序(即bridge)具有可以传递的其他选项。以下是用于docker0网桥的那些选项和等效的docker守护程序标志:

选项当量描述
com.docker.network.bridge.name - 创建Linux网桥时要使用的网桥名称
com.docker.network.bridge.enable_ip_masquerade --ip-masq 启用IP伪装
com.docker.network.bridge.enable_icc --icc 启用或禁用Inter Container连接
com.docker.network.bridge.host_binding_ipv4 --ip 绑定容器端口时的默认IP
com.docker.network.driver.mtu --mtu 设置容器网络MTU

以下参数可以传递给docker network create任何网络驱动程序,再次使用它们的近似等价物docker daemon

选项
当量描述
--gateway - 主子网的IPv4或IPv6网关
--ip-range --fixed-cidr 分配范围内的IP
--internal - 限制对网络的外部访问
--ipv6 --ipv6 启用IPv6网络
--subnet --bip 网络子网

例如,让我们使用-o--opt选项在发布端口时指定IP地址绑定:

$ docker network create \
    -o "com.docker.network.bridge.host_binding_ipv4"="172.19.0.1" \
    simple-network

默认情况下,来自连接到默认网桥的容器的流量 不会转发到外部世界。要启用转发

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

    $ sysctl net.ipv4.conf.all.forwarding=1
    
  2. 将策略的iptables FORWARD策略更改DROP为 ACCEPT

    $ sudo iptables -P FORWARD ACCEPT

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

创建新容器时,可以指定一个或多个--network标志。此示例将Nginx容器连接到my-net网络。它还将容器中的端口80发布到Docker主机上的端口8080,因此外部客户端可以访问该端口。连接到my-net 网络的任何其他容器都可以访问my-nginx容器上的所有端口,反之亦然。

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

要将正在运行的容器连接到现有的用户定义的桥,请使用该 docker network connect命令。以下命令将已在运行的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

将容器连接到默认桥接网络

如果未使用该--network标志指定网络,并且指定了网络驱动程序,则默认情况下容器将连接到默认bridge网络。连接到默认bridge网络的容器只能通过IP地址进行通信,除非它们使用--link标志进行链接 

配置默认网桥

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

{
  "bip": "192.168.1.5/24",
  "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"]
}





 

 

 

 

 

posted @ 2018-07-12 17:32  wwchihiro  阅读(475)  评论(0编辑  收藏  举报