Docker 配置网络使用bridge网络的方法
就网络而言,桥接网络(bridgenetwork,也叫网桥)是一种链路层设备,用于转发网段之间的流量。bridge可以是硬件设备或在主机内核中运行的软件设备。
对Docker而言,桥接网络使用允许容器连接到同一个桥接网络来通信的软件网桥,同时提供与未连接到该桥接网络的容器的隔离。Dockerbridge驱动程序自动在主机中安装规则使不同桥接网络上的容器不能直接相互通信。
桥接网络用于在同一个Docker守护进程上运行的容器通信。对于不同Docker守护进程的容器,可以在操作系统层级管理路由或使用overlay网络来实现通信。
启动Docker时,会自动创建默认的桥接网络,新启动的容器如果没有特别指定都会连接到这个默认桥接网络。也可以创建用户自定义的桥接网络,且用户自定义的桥接网络比默认的优先级要高。
1.用户自定义bridge和默认bridge的差别
1.1用户定义网桥提供更好的隔离和容器化应用之间的互操作性
连接到同一个用户自定义网桥的容器会自动互相暴露所有端口,并且不会暴露到外部。这会让容器化应用之间的通信更方便,而不会意外开放进入外部世界。
假设一个应用包含web前端和数据库后端。外部需要访问前端(可能是80端口),但是只有前端需要访问数据库后端。使用用户自定义网桥,只需要将前端的端口暴露到外部,数据库应用不需要开启任何端口,因为web前端可以通过用户自定义网桥直接访问到。
如果在默认网桥上运行同一个应用堆栈,需要同时打开web前端和数据库后端的端口,每次都需要使用-p或--publish标志。在意味着Docker主机需要通过其他方式来限制对数据库后端端口的访问。
1.2用户自定义bridge提供容器间自动DNS解析(automaticDNSresolution)
默认网桥上的容器只能通过IP地址互相访问,除非你使用--link选项,这被认为是遗留的。在用户自定义网桥中,容器之间可以通过名字会别名互相访问。
这里还是用上面的例子分析,web前端和数据库后端。如果容器称为web和db,web容器可以连接到db上的db容器(thewebcontainercanconnecttothedbcontaineratdb),不管这个应用堆栈运行在哪个Docker主机上。
如果在默认网桥上运行相同应用堆栈,需要人工创建容器之间的连接(使用遗留的--link)标志。这些连接需要双向创建,所以当需要通信的容器个数大于2个时复杂度会呈指数增长。或者,你可以编辑容器内的/etc/hosts文件,但这会产生难以调试的问题。
1.3容器可以在运行中与用户自定义网络连接和断开
在一个容器的生命周期中,可以在容器运行中将容器与用户自定义网络连接和断开。要从默认网桥中移除容器,需要停止容器并且通过不同的网络选项重新创建。
1.4每个用户自定义网络创建一个可配置的桥
如果你的容器使用默认网桥,你可以配置它,但是所有容器都使用了相同设置,例如MTU和iptables规则。此外,对默认网桥的配置发生在Docker之外,需要重启Docker。
用户自定义网桥通过dockernetworkcreate来创建和配置。如果应用程序的不同分组有不同的网络需求,可以独立配置每个用户自定义网桥,就像独立创建一样。
1.5默认网桥中连接的容器共享环境变量
最初,在两个容器之间共享环境变量的唯一方法是使用--link标志连接它们。用户自定义网络中无法使用这种类型的变量共享方式。然而,共享环境变量有更好的方式。一些想法:
- 多个容器可以使用Dockervolume卷挂载用于共享信息的同一个文件或目录。
- 可以通过docker-compose同时启动多个容器,compose文件可以定义共享变量。
- 可以使用swarm服务代替独立的容器,可以利用swarm的共享的secrets和configs。
连接到同一个用户自定义网桥的容器可以有效地将所有端口暴露给对方。要使不同网络上的容器或非Docker主机访问到容器的端口,该端口必须使用-p或--publish标志来发布。
2.管理用户自定义网桥
通过dockernetworkcreate命令创建用户自定义网桥:
$dockernetworkcreatemy-net
可以指定子网subnet,IP地址段,网关和其他选项。查看dockernetworkcreate命令参考手册或通过dockernetworkcreate--help命令查看详情。
通过dockernetworkrm命令删除用户自定义的网桥。如果容器仍然连接到网络,需要先断开连接才能删除这个网桥。
$dockernetworkrmmy-net
到达发生了什么?
当你创建或删除用户自定义网桥,或将容器从用户自定义网桥连接或断开,Docker使用特定于操作系统的工具来管理底层网络架构(例如增删网桥设备或配置Linux上的iptables规则)。这些是具体的实现细节。让Docker替你管理你的用户自定义网桥就好了。
3.连接容器到用户自定义网桥
创建新容器时可以指定一个或多个--network标志。下面的例子将Nginx容器连接到my-net网络。同时还将容器的80端口发布到Docker主机的8080端口,这样外部的客户端就可以访问这个端口了。任何其他连接到my-net的网络的容器都可以访问这个网络中其他容器的所有端口,反之亦然。
$dockercreate--namemy-nginx\ --networkmy-net\ --publish8080:80\ nginx:latest
使用dockernetworkconnect命令将运行中的容器连接到已经存在的用户自定义网桥。下面的命令将运行中的my-nginx容器连接到已经存在的my-net网络:
$dockernetworkconnectmy-netmy-nginx
4.断开容器到用户自定义网络的连接
使用dockernetworkdisconnect命令断开运行中的容器到一个用户自定义网桥的连接。下面的命令将会断开my-nginx容器到my-net网络的连接:
$dockernetworkdisconnectmy-netmy-nginx
5.使用IPv6
如果需要Docker容器支持IPv6,则需要在创建任何IPv6网络或为容器分配IPv6地址之前,在Docker守护进程中开启选项并重新加载配置。
创建网络时指定--ipv6标志可以开启IPv6。默认网桥上不能有选择地禁用IPv6。
6.开启容器到外部的访问
默认情况下,从容器发送到默认网桥的流量,并不会被转发到外部。要开启转发,需要改变两个设置。这些不是Docker命令,并且它们会影响Docker主机的内核。
配置Linux内核来允许IP转发
$sysctlnet.ipv4.conf.all.forwarding=1
改变iptables的政策,FORWARD政策从DROP变为ACCEPT
$sudoiptables-PFORWARDACCEPT
这些设置在重新启动时失效,因此可能需要将它们添加到启动脚本中。
7.使用默认网桥
默认桥接网络被视为Docker的遗留细节,不建议用于生产用途。配置默认网桥是一个手动操作,并且它有技术上的缺点。
7.1将容器连接到默认网桥
如果没有通过--network标志声明网络,并且指定了网络驱动程序,则默认情况下容器已连接到默认网桥。连接到默认桥接网络的容器可以进行通信,但只能通过IP地址进行通信,除非它们使用遗留标志--link进行链接。
7.2配置默认网桥
要配置默认网桥,需要在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使变更生效。
7.3通过默认网桥使用IPv6
如果Docker被配置为支持IPv6(查看使用IPv6),则默认网桥会被自动配置为支持IPv6。不像用户自定义网桥,不能在默认网桥中选择性的关闭IPv6。
8.后续步骤
通过独立的网络教程
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。