0 前置要求
- 宿主机系统要求:Linux 内核版本 3.9 以上,本文使用 Ubuntu Server 22.04
- 已安装 Docker,安装教程参考:Docker 官方安装指南
- 宿主机网络配置:建议使用静态 IP,配置方法见Ubuntu 静态 IP 配置教程
1 原理解释
macvlan 是一种网络虚拟化技术,它允许在物理网络接口上创建多个虚拟网络接口,每个接口都有独立的 MAC 地址和 IP 地址。主要特点:
- 每个虚拟接口都有独立的 MAC 地址
- 支持直接配置 IP 地址
- 实现容器间的网络隔离和通信
- 适用于需要容器与宿主机在同一网段的场景
2 配置步骤
查看宿主机网络信息
输入
ip a
输出
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:62:2f:df brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.0.4/24 brd 192.168.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe62:2fdf/64 scope link
valid_lft forever preferred_lft forever
其中 ens33 是我们的目标挂载网卡的名称,192.168.0.4 是宿主机的 IP 地址,子网掩码为 24 位。
创建 Docker 网络
docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=ens33 docker-macvlan
参数说明:
- –subnet :指定网络子网
- –gateway :设置网关地址
- -o parent :指定父网络接口
- docker-macvlan :网络名称
为容器配置 IP 地址
这里我们使用 Nginx 镜像进行试验,如果你没有下载 Nginx 镜像,可以使用以下命令下载:
docker pull nginx
然后使用以下命令创建容器
docker run --name nginx-server --net docker-macvlan --ip 192.168.0.99 -d nginx
3 测试
宿主机 ping 通容器
在其余任一一个非宿主机且和宿主机相互能 ping 通的机器上,都可以 ping 通容器的 IP 地址。
输入
ping 192.168.0.99
输出
正在 Ping 192.168.0.99 具有 32 字节的数据:
来自 192.168.0.99 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.0.99 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.0.99 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.0.99 的回复: 字节=32 时间<1ms TTL=64
192.168.0.99 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms
注意事项
- 默认情况下,宿主机无法直接 Ping 通 macvlan 网络中的容器
- 如需宿主机与容器互通,请参考:
解决 Docker macvlan 网络与宿主机通讯问题 - 确保 IP 地址不冲突,建议使用 DHCP 范围外的地址