Docker使用Macvlan

学习到了个新技术

为了完成导师布置给我的任务,需要实现内网中模拟多台设备,并且这些设备都要有IP地址和各自的MAC地址
刚开始,我想到了使用虚拟来实现这个任务,但是后来发现,这个方案不行,太消耗资源了,而且部署起来也不怎么灵活
找着找着,突然发现了Linux的Macvlan技术,这个技术可以实现内网中模拟多台设备,并且这些设备都要有IP地址和各自的MAC地址
经过实验后,成功的实现了要求,为此记录下这个新学习到的技术

Macvlan简介

以下是 Macvlan的介绍:
Macvlan是一种虚拟局域网技术,当需要为同一网络接口分配多个 IP 地址时,即可使用该技术。其本质是将物理网络接口分割为多个拥有独立 IP 地址的子接口。系统会根据随机生成的 MAC 地址来分配对应的IP地址,Macvlan 网络类型允许预先配置连接实例到父接口的预设参数,通过这种方式,实例网卡只需简单地将网络选项设置为所连接的网络名称,而无需了解任何底层配置细节即可完成网络连接
简而言之,Macvlan 可以将一个网卡分成多个网卡,而且这些网卡是互相隔离的,在其他网络设备看来,这些网卡是独立的,它们拥有独立的 IP 地址和 MAC 地址

Docker使用Macvlan

做一个简单的实验,在一个网卡上生成三个网卡,在这些网卡上分别使用 Docker 搭建 Nginx 服务器来验证是否搭建成功
首先,验证设备是否支持 Macvlan

1
2
3
4
5
6
# 检查内核是否加载了 macvlan 模块
lsmod | grep macvlan

# 如果没有输出,尝试加载模块
sudo modprobe macvlan
lsmod | grep macvlan # 再次检查

如果设备支持,则继续

首先编辑在一个空目录中编辑 Dockerfile

1
2
3
4
5
6
7
8
9
10
FROM ubuntu:22.04

RUN apt-get update && \
apt-get install -y nginx && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

这 个Dockerfile 安装了 Nginx 和 curl,并设置了一个默认的端口映射,Nginx 是为了验证是否搭建成功,curl 是为了验证能否正常访问互联网

然后再编辑 docker-compose.yaml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
version: '233'

services:
phone1:
build: .
container_name: phone1
networks:
default_net:
macvlan_net:
ipv4_address: 192.168.242.101 # 替换为可用IP
dns:
- 114.114.114.114

phone2:
build: .
container_name: phone2
networks:
default_net:
macvlan_net:
ipv4_address: 192.168.242.102 # 替换为可用IP
dns:
- 114.114.114.114

phone3:
build: .
container_name: phone3
networks:
default_net:
macvlan_net:
ipv4_address: 192.168.242.103 # 替换为可用IP
dns:
- 114.114.114.114

networks:
default_net:
driver: bridge

macvlan_net:
driver: macvlan
driver_opts:
parent: ens33 # 替换为主机网络接口
ipam:
config:
- subnet: "192.168.242.0/24"
gateway: "192.168.242.1"

这个 docker-compose.yml 文件定义了两个网络,default_net 和 macvlan_net,default_net 是一个 bridge 网络,用于访问互联网,macvlan_net 是一个 macvlan 网络,也就是实验需要验证的网络
编辑完成后后,即可启动容器

1
docker compose up -d --build

待容器创建完成后,可以通过命令查看容器是否正常启动

1
docker ps

此时可以看到创建的三个容器已经在运行了,再通过命令查看 Docker 网络

1
docker network ls

此时可以看到两个网络,default_net 和 macvlan_net,且 Driver 分别是 bridge 和 macvlan
使用另外一台同局域网的设备,浏览器分别访问 192.168.242.101、192.168.242.102 和 192.168.242.103,可以成功访问到三个 Nginx 服务器

随意选择一个容器,进入容器内部,使用 curl 命令访问外网,可以正常访问

1
2
3
docker exec -it phone1 /bin/bash

curl https://www.baidu.com

通过 Macvlan 技术,实现了内网中模拟多台设备,并且这些设备都要有IP地址和各自的MAC地址
如果应用到我自己的 NAS 上,可以解决我的多个 qBittorrent 下载器使用不同端口的问题,这样就可以解决端口冲突导致不得不更换使用其他端口的问题了
学到了新的技术并且可以解决实际问题,非常的高兴♫꒰・◡・๑꒱