容器通信
当项目大规模使用 Docker 时,容器通信的问题也就产生了。
要解决容器通信问题,必须先了解很多关于网络的知识。
我们需要了解Docker 的网络知识,以满足更高的网络需求。
1. 默认网络
装 Docker 以后,会默认创建三种网络,可以通过 docker network ls 查看
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f869d1c3534a bridge bridge local
1543d4d4b945 host host local
d06a4fca4238 none null local
| 网络模式 | 简介 |
|---|---|
| bridge | 为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式。 |
| host | 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。 |
| none | 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。 |
| container | 新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。 |
1.1 bridge 网络模式
在该模式中,Docker 守护进程创建了一个虚拟以太网桥 docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。
veth是linux的一种虚拟网络设备,它有点类似于两张网卡中间用一条网线连着,veth设备总是成对出现,通常用来连接不同网络命名空间(下面开始简称NS),一端连着NS1的内核协议栈,另一端连着NS2的内核协议栈,一端发送的数据会立刻被另一端接收。

比如我运行一个基于 busybox 镜像构建的容器 bbox01,查看 ip addr:
busybox 被称为嵌入式 Linux 的瑞士军刀,整合了很多小的 unix 下的通用功能到一个小的可执行文件中

然后宿主机通过 ip addr 查看信息如下:

通过以上的比较可以发现,证实了之前所说的:守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,以类似 vethxxx 这样的名字命名。
同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关

本文详细介绍了Docker中的三种网络模式(bridge、host、none)以及container网络模式,包括它们的工作原理、创建和连接网络的方法,以及如何实现容器之间的通信,特别是通过自定义网络和DockerDNS进行通信的限制和解决方案。
最低0.47元/天 解锁文章
1566

被折叠的 条评论
为什么被折叠?



