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 , -dbridge用于管理网络的驱动程序
--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"] }





 

 

 

 

 

转载于:https://www.cnblogs.com/wwchihiro/p/9300694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值