跳转至

容器间通信

# 查看网络模式
docker network ls
"""
NETWORK ID     NAME      DRIVER    SCOPE
e01de21fde14   bridge    bridge    local
28abc4c947b8   host      host      local
d58fdf42ccb2   none      null      local
"""

# 创建容器网络,-d指定网络模式,默认bridge桥接方式
docker network create [-d bridge] test-net

# 运行web容器,-p指定端口映射到容器内服务的默认端口
# 映射后可以使用<宿主机IP:4000>访问
# 指定网络模式: --network="bridge/host/none/container"

docker run -d -p <IP>:4000:80] <镜像> <命令>  # 也可以-P随机指定端口映射

# 查看容器端口映射
docker port <容器ID>
"""
80/tcp -> 0.0.0.0:8089
80/tcp -> :::8089
"""

虚拟网卡:veth,成对出现

虚拟交换机:Linux Bridge(网桥),docker0,网桥是根据 MAC 地址做二层转发的,网桥不允许给接入的设备设置 IP 地址,但与物理交换机不同的是,它允许给自己设置 IP 地址。如果数据包的目的 MAC 地址为网桥本身,并且网桥有设置了 IP 地址的话,那该数据包即被认为是收到发往创建网桥那台主机的数据包,此数据包将不会转发到任何设备,而是直接交给上层(三层)协议栈去处理

虚拟路由器:Linux 内核

安装 Docker 时会自动在宿主机上创建一个名为 docker0 的网桥,并默认有三种网络模式:bridgehostnone

除此之外 Docker 还支持由用户自行创建的网络:containermacvlanoverlay

比较常用的模式为:bridgehostcontainer

桥接模式(默认)

docker run --network=bridge

桥接模式下,Docker 会为新容器分配独立的网络名称空间,创建好 veth pair,一端接入容器,另一端接入到 docker0 网桥上。Docker 为每个容器自动分配好 IP 地址,默认配置下地址范围是 172.17.0.0/24,docker0 的地址默认是 172.17.0.1,并且设置所有容器的网关均为 docker0,这样所有接入同一个网桥内的容器直接依靠二层网络来通信,在此范围之外的容器、主机就必须通过网关来访问,具体过程笔者在介绍 Linux Bridge 时已经举例详细讲解过。

20220105231419

主机模式

docker run --network=host

主机模式下,Docker 不会为新容器创建独立的网络名称空间,这样容器一切的网络设施,如网卡、网络栈等都直接使用宿主机上的真实设施,容器也就不会拥有自己独立的 IP 地址。此模式下与外界通信无须进行 NAT 转换,没有性能损耗,但缺点也十分明显,没有隔离就无法避免网络资源的冲突,譬如端口号就不允许重复。

空置模式

docker run --network=none

空置模式下,Docker 会给新容器创建独立的网络名称空间,但是不会创建任何虚拟的网络设备,此时容器能看到的只有一个回环设备(Loopback Device)而已。提供这种方式是为了方便用户去做自定义的网络配置,如自己增加网络设备、自己管理 IP 地址,等等。

容器模式

docker run --network=container:指定共享网络的容器名称

容器模式下,新创建的容器将会加入指定的容器的网络名称空间,共享一切的网络资源,但其他资源,如文件、PID 等默认仍然是隔离的。两个容器间可以直接使用回环地址(localhost)通信,端口号等网络资源不能有冲突。

问题:当某个容器网络出错,但不允许在这个容器内安装工具排查问题时要怎么办?

  • 方法1:用container模式共享网络,在另一个容器里安装工具排查即可
  • 方法2:只要能切换到目标容器命名空间上即可

该模式下的一些应用

20220105233908

MACVLAN 模式

docker network create -d macvlan

此网络允许为容器指定一个副本网卡,容器通过副本网卡的 MAC 地址来使用宿主机上的物理设备,在追求通信性能的场合,这种网络是最好的选择。Docker 的 MACVLAN 只支持 Bridge 通信模式,因此在功能表现上与桥接模式相类似。

Overlay 模式

docker network create -d overlay

Docker 说的 Overlay 网络实际上就是特指 VXLAN,这种网络模式主要用于 Docker Swarm 服务之间进行通信。然而由于 Docker Swarm 败于 Kubernetes,并未成为主流,所以这种网络模式实际很少使用。


最后更新: 2022-03-07