码头工人网络之桥模式

本篇将讲述Docker网络的一些概念,以便您在设计和部署应用程序时充分利用到这些功能。

Docker 网络之bridge模式

首先,Docker的网络子系统是可插拔驱动式的,默认情况下存在或支持多种网络接口,如bridge、host、overlay、macvlan以及none类型的网络接口。

接下来,我们先来探讨下bridge(桥接)网络模式

bridge是docker默认的网络模式,如果不指定类型,则这是您正在创建的网络类型,bridge模式会为每一个容器分配一个Network Namespace、IP等,并将容器的网络连接到一个网桥(docker0)上。

特点:同一个宿主机上所有容器默认会在同一个网段(默认网段:172.17.0.0/16)下,且相互之间可以通信以及访问外部网络(前提是宿主机可以访问外部网络)。

网桥就是在多个网段之间转发流量的链路层设备。网桥可以是运行在主机内核中的软件或者硬件设备。

Docker使用的是软件网桥,允许连接在同一网桥的容器间进行通信,同时提供与未连接到网桥网络的容器进行隔离。Docker网桥会自动设置相关规则(用iptables),不同网桥上的容器不能直接相互通信。

网桥适用于在同一个Docker守护程下的容器。对于在不同Docker守护进程下运行的容器之间的通信,可以在宿主机上添加路由,也可以使用overlay网络。

当启动Docker daemon时,会自动创建默认的网桥网络(docker0)并且还会启动iptables来设置您的访问规则。您可以创建用户自定义的网桥网络,用户自定义的网桥网络优于默认的网桥(docker0),特点如下:

1、用户自定义的网桥在容器化应用程序之间提供了更好的隔离性和互操作性。

连接在同一网桥下的容器同属一个网络,因此所有端口可以互访,但对外部网络是不公开的,这使得容器化应用程序可以轻松地相互通信,同时提高了安全性。

想象一下,一个带有web前端和后端,另外还有数据库的应用架构(用户<-->web入口<-->后端应用<-->数据库)。外部网络只需要访问web前端(如80端口),但只有后端应用需要访问数据库。若使用用户自定义的网桥,只需要对外开放web端口,数据库不需要对外开放任何端口,前后端都可以通过用户自定义的网桥来访问数据库。

2、用户自定义的网桥提供了容器之间的自动DNS解析。

在默认网桥上创建的容器,相互访问时只能通过IP地址,除非您使用--link选项,但--link是需要在容器的两个方向上创建,对于需要通信的两个以上的容器,这会变得复杂。而在用户自定义的网桥网络上,容器间可以通过名称或别名相互解析。

回想一下,在使用物理主机或者VM主机时,我们应用程序的配置文件中一般用hosts中的主机名称或者IP,而现在在容器中,使用自定义网络,我们只要改写成容器名就好了,不需要太关注主机名称或者IP,是不是很开森。

3、使用用户自定义网桥的容器,支持随时断开或连接到不同的(用户自定义)网络。

在容器的生命周期中,您可以动态切换容器间的网络连接,比如,您创建了自定义my-net01和my-net02桥接网络,这两个网络中的容器可以互相动态切换的。如果您是通过默认网桥创建的容器,也可以切换到自定义网桥中,而不必删除容器重建。

注:这里在实际验证过程中,貌似与官方文档描述有出入。

4、每个用户自定义的网络都是创建了一个可配置的网桥。

如果所有容器都使用默认网桥网络,虽说可以修改配置,但所有容器都使用相同的设置,例如MTU和iptables规则。此外,配置默认网桥网络需要重启Docker进程。

若是使用docker network create创建和配置用户自定义的网桥网络。如果不同的应用程序组有不同的网络需求,则可以在创建每个用户定义的网桥时分别对其进行配置。

5、使用默认网桥的容器之间可共享环境变量。

起初,在两个容器之间共享环境变量的唯一方法是使用--link。这种类型的变量共享在用户自定义的网络中是不可能的。然而,现在却有更好的方法来共享环境变量。

(1)、多个容器可以使用Docker的卷(Volume)来装载包含共享信息的文件或目录。

(2)、多个容器可以使用docker compose来一起启动,compose文件中可以定义共享变量。

(3)、可以使用swarm服务来代替独立的容器,并共享密钥和配置。

管理自定义网桥网络

1、使用docker network ls 查看默认支持网络

码头工人网络之桥模式