docker网络(二)--bridge

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1083062043/article/details/88756138

使用桥接网络

在网络方面,桥接网络是在网络段之间转发流量的链路层设备。网桥可以是硬件设备或在主机内核中运行的软件设备。

就Docker而言,桥接网络使用软件桥,该桥接器允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。Docker桥驱动程序自动在主机中安装规则,以便不同网桥上的容器无法直接相互通信。

桥接网络适用于在同一个 Docker守护程序主机上运行的容器。对于在不同Docker守护程序主机上运行的容器之间的通信,您可以在操作系统级别管理路由,也可以使用覆盖网络

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

管理用户定义的桥

使用此docker network create命令可以创建用户定义的桥接网络。

$ docker network create my-net

您可以指定子网,IP地址范围,网关和其他选项。有关详细信息,请参阅 docker network create reference或输出docker network create --help。

使用此docker network rm命令删除用户定义的桥接网络。如果容器当前已连接到网络, 请先断开它们 。

$ docker network rm my-net

真的发生了什么?
当您创建或删除用户定义的网桥或从用户定义的网桥连接或断开容器时,Docker使用特定于操作系统的工具来管理底层网络基础结构(例如iptables在Linux上添加或删除网桥设备或配置规则) )。这些细节应视为实施细节。让Docker为您管理用户定义的网络。

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

创建新容器时,可以指定一个或多个–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

使用IPv6

如果需要对Docker容器的IPv6支持,则需要 在创建任何IPv6网络或分配容器IPv6地址之前启用 Docker守护程序上的选项并重新加载其配置。

创建网络时,可以指定–ipv6标志以启用IPv6。您无法在默认bridge网络上有选择地禁用IPv6支持。

启用从Docker容器转发到外部世界

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

  • 配置Linux内核以允许IP转发。
$ sysctl net.ipv4.conf.all.forwarding=1
  • 将策略的iptables FORWARD策略更改DROP为 ACCEPT。
$ sudo iptables -P FORWARD ACCEPT

这些设置在重新启动时不会持续存在,因此您可能需要将它们添加到启动脚本中。

使用默认桥接网络

默认bridge网络被视为Docker的遗留细节,不建议用于生产。配置它是一种手动操作,它有 技术缺点

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

如果未使用该–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"]
}

重新启动Docker以使更改生效。

猜你喜欢

转载自blog.csdn.net/qq1083062043/article/details/88756138