【Docker】5. Docker高级网络配置

·  阅读 68

Docker网络服务

加入Docker中一个容器运行着Tomcat,有一个容器运行着MySQL,由于容器和容器之间的隔离性,这两个容器的数据是相互访问不到的。如果要二者进行通信,那么就需要配置Docker网络服务。

Docker允许通过外部访问容器或容器互联的方式来提供网络服务。

容器互联的方式现在Docker已经不推荐使用了,新版的Docker支持高级网络配置来设置网络通信。

Docker通信机制

当 Docker 启动时,会自动在主机上创建一个 bridge 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会挂载到它的网口之间进行转发。

20210908161031.png

可以粗略的总结容器与宿主机之间的通信依靠的就是这个bridge,但是不准确。

20210909084439.png

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 (opens new window)中定义)中的一个地址给 bridge 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 bridge 网桥,名称以 veth 开头(例如 vethAQI2QT,veth是virtual Ethernet的简写)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

注意:在Linux的开源标准中,所有操作系统都必须有eth0作为默认网卡。(CentOS 7例外,CentOS 7将eth0改成了ens33

构建网桥

上面描述的这种通信方式好不好呢?

有一个缺点,所有容器都运行在同一个网桥上(默认bridge),如果某些容器频繁的传输数据,会对另外其他容器的带宽造成影响。从实战的角度来说,我们不能让Docker中所有容器都运行在同一个网桥上,所以我们通常不使用默认bridge,我们应该基于应用,自己构建网桥。

20210908172526.png

构建规则:一个项目构建一个网桥,项目和项目之间不能跨项目通信。

命名规则:网桥的名字和项目名保持一致。

Docker网络相关命令

1. 查看所有网桥

docker network ls
复制代码

2. 创建网桥

docker create 网桥名称
复制代码

上面这个命令是简写形式,详细写法为

docker create -d bridge 网桥名称
复制代码
  • -d bridge表示指定网桥为bridge方式。

注意:当前Docker中并不只有bridge这一种配置方式,但是bridge是官方推荐的,也是默认的配置方式。

3. 容器指定网桥

docker run --network 网桥名称 镜像名:镜像版本 | 镜像ID
复制代码

注意:

  1. 一旦容器创建了之后,Docker会给该容器分配一个IP,如果同时指定了network,Docker就会将该容器的名称和IP进行映射(Host解析成域名)。这样以来,如果就算容器的IP变了,也无所谓,通信时直接访问容器名称(域名)代替IP就行了。
  2. 创建容器时指定的网桥必须事前已经创建完毕,该命令不能自动创建网桥。

4. 删除网桥

docker network rm 网桥名称
复制代码

5. 查看网桥详细信息

docker inspect 网桥名称
复制代码

注意:该命令不仅可以查看指定网桥的详细信息,还可以看到在该网桥上所有容器的IP等信息。

分类:
后端
标签:
分类:
后端
标签: