docker使用macvlan获取独立ip

docker使用macvlan获取独立ip

docker启动的容器会获取一个docker分配的内网ip,一般是172开头。现在想让容器内获取一个与宿主机同级别的ip,在路由器看来是两个独立的设备。

这里需要使用linux的 macvlan功能,他可以把物理网卡虚拟出来一个,让其拥有独立的mac地址,在路由器看来就是独立的设备。

docker macvlan的官方文档

操作

  1. 使用docker命令创建一个macvlan的网络
    该命令会创建一个macvlan类型的network,同时指定子网和网关,parent表示绑定的物理网卡,macvlan-net未网络的名字

    1
    2
    3
    docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=enp2s0 macvlan-net

    docker network ls #使用这个命令查看我们常见出来的network
  2. 启动docker容器,指定刚才创建的网络,并且指定了其IP地址(IP需要没有被使用)

    1
    docker run --network=macvlan-net --rm --ip=192.168.1.200 --name=my-container -it alpine:latest /bin/sh

上述两条命令执行完成后,容器启动起来后,可以测试网络是正常的。
同时打开路由器或光猫后台,能够看到192.168.1.200 作为一台独立的设备连接进来了。

解决与宿主机不通的问题

但是但是,基于安全考虑在Linux上macvlan与宿主机之间是不互通的。假设宿主机ip是 192.168.1.2他和 192.168.1.200之间相关ping不通。

但是两个macvlan之间是互通的,因此我们可以这么做。

1
2
3
4
5
6
# 使用linux命令创建一个macvlan-shim,同样绑定的物理网卡上
sudo ip link add macvlan-shim link enp2s0 type macvlan mode bridge
# 为macvlan-shim绑定一个ip,要求ip没有被使用过,并且与上面docker创建的不同
sudo ip addr add 192.168.1.210 dev macvlan-shim
# 启动该macvlan
sudo ip link set macvlan-shim up

做完这些,这样我们宿主机上就有了三个网卡了:

  • enp2s0 物理网卡,ip 192.168.1.2
  • macvlan-net 网卡,其中ip是 192.168.1.200 被分配给了docker容器内使用
  • macvlan-shim 网卡,其中ip是 192.168.1.210,宿主机使用

宿主机ip与两个macvlan是不通的,但是macvlan之间可以通。

宿主机上添加一条路由表,表明192.168.1.200走macvlan-shim这个网卡,
又因为macvlan-shim网卡与macvlan-net是通的,他能找到 192.168.1.200这台机器,因此宿主机与容器网络打通了。

1
sudo ip route add 192.168.1.200 dev macvlan-shim

拆除

不想要了把上面的配置都还原。

1
2
3
4
5
6
7
8
9
# 移除宿主机的macvlan
sudo ip link set macvlan-shim down # 下线接口
sudo ip addr delete 192.168.1.210/32 dev macvlan-shim #移除ip
sudo ip link delete macvlan-shim #移除macvlan

# 移除docker的macvlan
docker stop <xxx> # 停止容器
docker network ls #查看网络接口
docker network rm macvlan-net #移除docker的macvlan

docker compose配置

使用compose方式配置network,可以按照下面模板做修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
my_debian:
container_name: my_debian
image: debian:latest
privileged: true
restart: unless-stopped
tty: true
networks:
macvlan_network:
ipv4_address: 192.168.1.200
networks:
macvlan_network:
driver: macvlan
driver_opts:
parent: enp2s0
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1

docker使用macvlan获取独立ip
https://www.huangchaoyu.com/2533120124.html
作者
hcy
发布于
2025年5月14日
更新于
2025年5月15日
许可协议