目录
overlay
Overlay 网络是一种网络虚拟化技术,它将容器网络流量封装在宿主机网络之上,从而允许容器跨主机通信。Overlay 网络使用封装协议(如 VXLAN)来封装原始网络包,使其能够在底层物理网络中传输。
consul
在 Docker 中使用 Overlay 网络时,可以通过 Consul 保存网络状态信息,以实现服务发现和配置管理。Consul 提供了键值存储、健康检查和服务发现等功能,可以帮助管理和维护分布式系统中的服务状态。
部署测试环境
环境信息
主机名 | IP地址 | 操作系统版本 |
consul | 192.168.0.128 | ubuntu-20.04.5 LTS |
docker-node01 | 192.168.0.129 | ubuntu-20.04.5 LTS |
docker-node02 | 192.168.0.130 | ubuntu-20.04.5 LTS |
下载consul镜像
docker search consul
docker pull progrium/consul
启动consul容器
docker run -d --restart always -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server --bootstrap -ui-dir /ui
下面是对 docker run
命令中各个参数的解释:
-d
: 在后台运行容器,并打印容器 ID。--restart always
: 如果容器退出,总是重新启动容器。-p 8400:8400
: 将容器的 8400 端口映射到宿主机的 8400 端口。-p 8500:8500
: 将容器的 8500 端口映射到宿主机的 8500 端口。-p 8600:53/udp
: 将容器的 8600 端口映射到宿主机的 53 端口,并指定传输协议为 UDP。这是用于 DNS 查询的。-h node1
: 设置容器的主机名为node1
。progrium/consul
: 使用progrium/consul
镜像来创建容器。-server
: 指定当前节点为 Consul 服务器节点。--bootstrap
: 启动一个 Consul 服务器节点,并引导整个集群。-ui-dir /ui
: 指定 UI 文件所在的目录,用于启动 Consul 的 Web UI。
容器生成以后可以用浏览器访问验证服务是否正常运行,访问http://192.168.0.128:8500
加入consul服务器
三台服务器开启2376端口
ufw allow 2376
在另外两台docker节点修改docker启动文件,consul为安装了consul的那台主机
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 后面加上
--cluster-store=consul://192.168.0.128:8500 --cluster-advertise=ens33:2376
重启docker
systemctl daemon-reload
systemctl restart docker
查看是否加入成功
192.168.0.128:8500/ui在主页的key/value下的docker下nodes看到其他节点的IP
测试
在任意一台创建一个overlay的网络,这个网络是全局,任意一台机器都可以看到
docekr network create -d overlay my_ovnet
docker network ls
创建容器时指定网络
docker run -dit -name test1 --network my_ovnet busybox
docker run -dit -name test2 --network my_ovnet busybox
Docker 跨网络 Overlay 的优势和注意事项如下:
优势:
-
跨主机通信:Overlay 网络允许容器在不同的宿主机上进行通信,这对于分布式应用程序和微服务架构非常关键。
-
封装和隔离:Overlay 网络使用网络虚拟化技术(如 VXLAN)来封装容器流量,提供了良好的隔离性,不同的 Overlay 网络之间的容器默认无法直接通信。
-
动态和可扩展:Overlay 网络可以动态地添加或移除宿主机,网络可以自动适应集群的变化。
-
服务发现和负载均衡:在 Docker Swarm 模式下,Overlay 网络支持自动服务发现和负载均衡,使得服务部署和访问更加简单。
-
安全性:Overlay 网络的封装提供了额外的安全性,因为容器流量在传输过程中被封装,不易被外部网络监控或篡改。
注意事项:
-
网络性能:由于 Overlay 网络对容器流量进行了封装,可能会对网络性能产生一定影响,尤其是在高负载或大规模集群中。
-
配置要求:Overlay 网络需要 Docker Swarm 集群的支持,并且要求所有宿主机都能够互相通信。
-
加密通信:为了提高安全性,Overlay 网络支持对容器间通信进行加密,但这可能会增加网络开销。
-
复杂性:Overlay 网络的配置和管理相对复杂,尤其是对于大规模或高度动态的环境。
-
与外部网络的通信:Overlay 网络中的容器默认无法与外部网络进行通信。如果需要与外部网络通信,可以使用 Docker 的
ingress
网络,或者通过配置网络策略来实现。 -
依赖外部键值存储:在 Docker Swarm 模式下,Overlay 网络依赖于外部键值存储系统(如 Consul、Etcd 或 ZooKeeper)来存储网络状态信息。
macvlan
Docker 中的 Macvlan 网络是通过在宿主机的网络接口上创建虚拟网络接口来实现的。这些虚拟接口(称为 Macvlan 接口)可以分配给容器,使每个容器看起来像是直接连接到物理网络上的独立设备。Macvlan 是 Linux 内核的一项功能,因此Macvlan 需要内核版本 3.9 或更高版本的支持。
接着上次环境继续
节点开启网卡混杂模式
ip link set ens33 promisc on
ip link show ens33
创建macvlan网络
node1
docker network create -d macvlan --subnet 10.1.1.0/24 --gateway 10.1.1.1 -o parent=ens33 my_mac
此命令用于创建一个新的 Macvlan 网络。下面是命令中各部分的含义:
docker network create
:这是 Docker 的子命令,用于创建一个新的网络。-d macvlan
:-d
选项用于指定网络驱动。这里使用macvlan
,表示将使用 Macvlan 网络驱动来创建网络。--subnet 10.1.1.0/24
:这个选项指定了网络的 IP 地址范围。在这个例子中,网络将使用 10.1.1.0 到 10.1.1.255 的 IP 地址,子网掩码为 255.255.255.0。--gateway 10.1.1.1
:这个选项指定了网络的默认网关。在这个例子中,网关的 IP 地址是 10.1.1.1。-o parent=ens33
:-o
选项用于指定 Macvlan 网络的父接口。parent=ens33
表示父接口是宿主机上的ens33
网络接口。my_mac
:这是新创建的 Macvlan 网络的名称。
node2
两个节点一致使用同一网络
docker network create -d macvlan --subnet 10.1.1.0/24 --gateway 10.1.1.1 -o parent=ens33 my_mac
验证网络
分别在两个节点创建容器,验证网络是否互通
node1
docker run -it --name mac1 --network my_mac --ip 10.1.1.10 busybox /bin/sh
node2
docker run -it --name mac2 --network my_mac --ip 10.1.1.11 busybox /bin/sh
用子接口配置macvlan
分子接口
1、ip link add link ens33 name ens33.100 type macvlan mode bridge
此命令用于在 Linux 系统中创建一个 Macvlan 网络接口的。下面是该命令的各个部分及其含义:
ip link add
:这个命令用于创建新的网络接口。link ens33 name ens33.100
:这里指定了一个新的接口名ens33.100
,它将连接到已存在的网络接口ens33
。type macvlan
:macvlan
是一个 Linux 内核模块,用于创建虚拟网络接口,并将其连接到物理网络接口。mode bridge
:指定macvlan
接口的工作模式为bridge
。在这种模式下,macvlan
接口被视为一个网络桥接器,可以连接到其他macvlan
接口或物理网络接口。
2、ip addr add 192.168.0.126/24 brd + dev ens33.100
此命令用于在 Linux 系统中为网络接口分配 IP 地址的。下面是该命令的各个部分及其含义:
ip addr add
:这个命令用于向现有的网络接口分配 IP 地址。192.168.0.126/24
:这表示分配的 IP 地址为192.168.0.126
,子网掩码为255.255.255.0
,即/24
子网。brd +
:brd
选项用于设置广播地址。这里的+
表示自动计算广播地址,即192.168.0.255
。dev ens33.100
:指定分配 IP 地址的网络接口为ens33.100
,这是之前通过ip link add
命令创建的 Macvlan 网络接口。
3、ip link set dev ens33.100 up
此命令用于在 Linux 系统中启用一个网络接口。下面是该命令的各个部分及其含义:
ip link set
:这个命令用于设置网络接口的状态。dev ens33.100
:指定要设置状态的网络接口为ens33.100
,这是之前通过ip link add
命令创建的 Macvlan 网络接口。up
:指定要将ens33.100
接口的状态设置为启用。
ip link add link ens33 name ens33.200 type macvlan mode bridge
ip addr add 192.168.0.127/24 brd + dev ens33.200
ip link set dev ens33.200 up
创建macvlan网络
docker network create -d macvlan --subnet 10.1.1.0/24 --gateway 10.1.1.1 -o parent=ens33.100 mynet01
docker network create -d macvlan --subnet 10.1.2.0/24 --gateway 10.1.2.1 -o parent=ens33.100 mynet02
创建容器指定网络
测试互通
Docker 跨网络 Macvlan 的优势和注意事项如下:
优势:
-
高性能和低延迟:由于 Macvlan 容器直接连接到物理网络,它们能够提供与物理机相同的网络性能,这意味着较低的网络延迟和较高的数据传输速率。
-
独特的 MAC 和 IP:每个 Macvlan 容器都有自己的 MAC 地址和 IP 地址,这对于需要固定网络标识的应用程序非常重要。
-
网络隔离:Macvlan 提供了基于 Layer 2 的网络隔离,不同的 Macvlan 网络之间的容器默认无法直接通信,增强了安全性。
-
直接路由:Macvlan 容器的网络流量可以直接路由到物理网络,无需额外的网络封装或转换。
-
易于集成:Macvlan 网络易于与现有的网络基础设施集成,因为它们使用标准的网络协议和地址。
注意事项:
-
物理网络接口要求:Macvlan 需要宿主机上的物理网络接口支持,且这些接口必须处于 UP 状态。
-
IP 地址管理:由于 Macvlan 容器使用物理网络的 IP 地址,因此需要确保 IP 地址的分配不会与网络上的其他设备发生冲突。
-
网络配置:创建 Macvlan 网络可能需要在宿主机上进行额外的网络配置,例如关闭父接口的 DHCP 客户端服务。
-
有限的网络隔离:Macvlan 网络上的容器与物理网络上的其他设备共享相同的广播域,因此网络隔离主要依赖于 Layer 3(IP)防火墙规则。
-
宿主机兼容性:并非所有的 Linux 发行版都默认支持 Macvlan,需要确保宿主机的内核版本支持 Macvlan。
-
动态网络变化:在 Docker Swarm 环境中,使用 Macvlan 网络时,需要注意容器在不同宿主机之间的迁移可能会导致网络配置的变化。
-
安全性:由于 Macvlan 容器直接暴露在物理网络上,因此需要确保适当的安全措施,如防火墙规则和网络安全策略,以保护容器和宿主机。