docker-网桥
使用桥接网络
在网络方面,桥接网络是链路层设备,它在网络段之间转发流量。
网桥可以是硬件设备或在主机内核中运行的软件设备。
Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。
Docker桥驱动程序会自动在主机中安装规则,以便不同网桥上的容器无法直接相互通信。
桥接网络适用于在同一个 Docker守护程序主机上运行的容器。
启动Docker时,会自动创建默认桥接网络(也称为bridge
),并且除非另行指定,否则新启动的容器将连接到该网络。
还可以创建用户定义的自定义网桥。用户定义的网桥优于默认bridge
网络。
用户定义的网桥与默认网桥之间的差异
-
用户定义的桥接器可在容器化应用程序之间提供更好的隔离和互操作性。
连接到同一个用户定义的网桥的容器会自动将所有端口相互暴露,而不会向外界显示任何端口。这使得容器化应用程序可以轻松地相互通信,而不会意外地打开对外界的访问。
想象一下具有Web前端和数据库后端的应用程序。外部世界需要访问Web前端(可能在端口80上),但只有前端本身需要访问数据库主机和端口。使用用户定义的网桥,只需要打开Web端口,并且数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的网桥访问它。
如果在默认桥接网络上运行相同的应用程序堆栈,则需要打开Web端口和数据库端口,并使用 每个的标记
-p
或--publish
标记。这意味着Docker主机需要通过其他方式阻止对数据库端口的访问。 -
用户定义的桥接器在容器之间提供自动DNS解析。
默认网桥上的容器只能通过IP地址相互访问,除非您使用被认为是遗留的
--link
选项。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。想象一下与前一点相同的应用程序,具有Web前端和数据库后端。如果你打电话给你的容器
web
和db
,Web容器可以在连接到数据库容器db
,无论应用程序堆栈运行在哪个Docker主机上.如果在默认桥接网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧
--link
标志)。这些链接需要在两个方向上创建,因此可以看到这对于需要通信的两个以上容器而言变得复杂。或者,可以操作/etc/hosts
容器中的文件,但这会产生难以调试的问题。 -
容器可以在运行中与用户定义的网络连接和分离。
在容器的生命周期中,可以动态地将其与用户定义的网络连接或断开连接。要从默认桥接网络中删除容器,需要停止容器并使用不同的网络选项重新创建容器。
-
每个用户定义的网络都会创建一个可配置的网桥。
如果容器使用默认桥接网络,则可以对其进行配置,但所有容器都使用相同的设置,例如MTU和
iptables
规则。此外,配置默认桥接网络发生在Docker本身之外,并且需要重新启动Docker。使用创建和配置用户定义的网桥
docker network create
。如果不同的应用程序组具有不同的网络要求,则可以在创建时单独配置每个用户定义的网桥。 -
默认桥接网络上的链接容器共享环境变量。
最初,在两个容器之间共享环境变量的唯一方法是使用
--link
标志链接它们。用户定义的网络无法实现这种类型的变量共享。但是,有更好的方法来共享环境变量。一些想法:
连接到同一用户定义的网桥的容器有效地将所有端口相互暴露。对于可以访问不同网络上的容器或非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
默认情况下,来自连接到默认网桥的容器的流量 不会转发到外部世界。要启用转发。
-
配置Linux内核以允许IP转发。
$ sysctl net.ipv4.conf.all.forwarding=1
-
将策略的
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"]
}