docker网桥
在组网方面,网桥网络是一种链路层设备,用于转发网段之间的流量。网桥可以是在主机内核中运行的硬件设备或软件设备。
在Docker方面,网桥网络使用软件网桥,允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络的容器的隔离。Docker Bridge驱动程序自动在主机中安装规则,使不同网桥网络上的容器无法直接通信。
网桥网络适用于运行在同一个Docker守护进程主机上的容器。对于运行在不同Docker守护进程主机上的容器之间的通信,可以在操作系统级别管理路由,也可以使用覆盖网络。
启动Docker时,将自动创建默认网桥网络(也称为网桥),除非另有指定,否则新启动的容器将连接到该网络。还可以创建用户定义的自定义网桥网络。用户定义的网桥网络优于默认的网桥网络。
一、用户定义的网桥和默认网桥之间的差异
用户定义的网桥在集装箱化应用程序之间提供更好的隔离和互操作性。
连接到同一用户定义的桥接网络的容器会自动将所有端口相互公开,而不会将任何端口对外公开。这使得集装箱化的应用程序可以轻松地相互通信,而不会意外地打开对外部世界的访问。
设想一个具有Web前端和数据库后端的应用程序。外部世界需要访问Web前端(可能在端口80上),但只有后端本身需要访问数据库主机和端口。使用用户定义的网桥,只需要打开Web端口,数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的网桥访问它。
如果在默认网桥网络上运行相同的应用程序堆栈,则需要使用-p或–publish标志分别打开Web端口和数据库端口。这意味着Docker主机需要通过其他方式阻止对数据库端口的访问。
二、用户定义的网桥提供容器之间的自动DNS解析。
默认网桥网络上的容器只能通过IP地址访问彼此,除非您使用–link选项,这被认为是遗留的。在用户定义的网桥网络上,容器可以通过名称或别名相互解析。
想象一下与前一点相同的应用程序,它有一个Web前端和一个数据库后端。如果您调用容器web和db,web容器可以连接到db处的db容器,不管应用程序堆栈运行在哪个docker主机上。
如果在默认网桥网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧的–link标志)。这些链接需要在两个方向上创建,因此您可以看到,需要通信的两个以上容器会使这变得复杂。或者,您可以操作容器中的/etc/hosts文件,但这会产生难以调试的问题。
三、容器可以动态地连接和从用户定义的网络上分离。
容器的生存期内,您可以随时将其连接或断开与用户定义的网络的连接。要从默认网桥网络中删除容器,需要停止容器并使用不同的网络选项重新创建它。
四、每个用户定义的网络创建一个可配置的网桥。
如果容器使用默认网桥网络,则可以对其进行配置,但所有容器使用相同的设置,如MTU和IPTables规则。此外,配置默认网桥网络发生在Docker本身之外,需要重新启动Docker。
使用Docker Network Create创建和配置用户定义的网桥网络。如果不同的应用程序组具有不同的网络需求,则可以在创建时分别配置每个用户定义的网桥。
五、默认网桥网络上的链接容器共享环境变量。
最初,在两个容器之间共享环境变量的唯一方法是使用–link标志链接它们。这种类型的变量共享在用户定义的网络中是不可能实现的。然而,有更好的方法来共享环境变量。一些想法:
多个容器可以使用Docker卷装载包含共享信息的文件或目录。
可以使用docker compose一起启动多个容器,compose文件可以定义共享变量。
您可以使用Swarm服务而不是独立的容器,并利用共享的秘密和配置。
连接到同一用户定义的桥接网络的容器有效地将所有端口相互公开。要使不同网络上的容器或非Docker主机能够访问某个端口,必须使用-p或–publish标志发布该端口。
六、管理用户定义的网桥
使用docker network create命令创建用户定义的网桥网络。
docker network create my-net
您可以指定子网、IP地址范围、网关和其他选项。
docker network create --help for details.
使用docker network rm命令删除用户定义的网桥网络。如果容器当前已连接到网络,请先断开它们。
docker network rm my-net
当您创建或删除用户定义的网桥或连接或断开容器与用户定义的网桥时,Docker使用操作系统特定的工具来管理基础网络基础设施(例如添加或删除网桥设备或在Linux上配置IPtables规则)。这些细节应被视为实施细节。让Docker为您管理用户定义的网络。
七、将容器连接到用户定义的桥
创建新容器时,可以指定一个或多个网络标志。此示例将nginx容器连接到我的网络。它还将容器中的端口80发布到Docker主机上的端口8080,以便外部客户机可以访问该端口。任何其他连接到我的网络的容器都可以访问我的nginx容器上的所有端口,反之亦然。
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
要将正在运行的容器连接到现有用户定义的网桥,请使用docker network connect命令。以下命令将已在运行的nginx容器连接到已存在的my net网络:
$ docker network connect my-net my-nginx
##(四)从用户定义的网桥断开容器连接
要断开正在运行的容器与用户定义的网桥的连接,请使用docker network disconnect命令。以下命令将我的nginx容器与我的网络断开连接。
$ docker network disconnect my-net my-nginx
八、使用IPv6
如果需要docker容器的ipv6支持,则需要在创建任何ipv6网络或分配容器ipv6地址之前启用docker守护进程上的选项并重新加载其配置。
创建网络时,可以指定–ipv6标志以启用ipv6。您不能有选择地禁用默认网桥网络上的IPv6支持。
九、启用从Docker容器到外部世界的转发
默认情况下,来自连接到默认网桥网络的容器的流量不会转发到外部世界。要启用转发,需要更改两个设置。这些不是docker命令,它们影响docker主机的内核。
#####1.配置Linux内核以允许IP转发。
sysctl net.ipv4.conf.all.forwarding=1
#####2.将iptables转发策略的策略从drop更改为accept。
sudo iptables -P FORWARD ACCEPT
这些设置不会在重新启动时保持不变,因此您可能需要将它们添加到启动脚本中。
十、使用默认网桥网络
默认桥接网络被视为Docker的遗留细节,不建议用于生产使用。配置它是一种手动操作,它有技术缺陷。
1.将容器连接到默认网桥网络
如果不使用–network标志指定网络,并且确实指定了网络驱动程序,那么默认情况下,容器将连接到默认网桥网络。连接到默认网桥网络的容器可以通信,但只能通过IP地址进行通信,除非它们使用legacy–link标志进行链接。
2.配置默认网桥网络
要配置默认网桥网络,请在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"]
}
重新启动Docker以使更改生效。
十一、将IPv6与默认网桥网络一起使用
如果将Docker配置为支持IPv6,则默认网桥网络也会自动配置为支持IPv6。与用户定义的网桥不同,您不能有选择地在默认网桥上禁用IPv6。