跳到主要内容

Macvlan 网络

macvlan 是一种 Docker 网络模式,可以让容器直接连接到物理网络,而不是通过 Docker 守护进程的 NAT 网络。也就是说,容器可以直接获得一个物理网络的 IP 地址,就像一个真实的物理机器一样。可以直接监听物理网络上的端口,也可以直接访问物理网络上的服务。

但是,主机连不上 macvlan 网络上的容器,据官网介绍,这是为了安全考虑。

但是一定要连也不是不可以,咱可以用别的方法绕过限制。运行下面的命令:

ip link add docker-macvlan link eth0 type macvlan mode bridge
ip addr add 192.168.1.2 dev docker-macvlan
ip link set docker-macvlan up
ip route add 192.168.1.3 dev docker-macvlan

这几行命令的意思是:

  1. 创建一个 macvlan 网络接口 docker-macvlan,连接到 eth0 网卡,模式为 bridge
  2. docker-macvlan 分配一个 IP 地址,这个地址随意选,只需要和主机在同一个网段的没有别的设备使用的地址即可。这个地址不会被广播到局域网,因此不会被路由器发现。
  3. 启用 docker-macvlan 网络接口。
  4. 添加一个路由规则,让主机可以访问 docker-macvlan 网络上的容器。这里的 IP 要替换成 macvlan 网络上的容器的 IP 地址,有几个写几个。

这样,主机就可以访问 macvlan 网络上的容器了。

但是这个命令是临时的,重启后就没了,所以建议添加一个 oneshot 的 systemd 服务,开机自动执行这几行命令。

创建一个文件 /etc/systemd/system/docker-macvlan.service,内容如下:

[Unit]
Description=Setup docker macvlan network
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c /usr/local/bin/docker-macvlan.sh

[Install]
WantedBy=multi-user.target

然后创建一个文件 /usr/local/bin/docker-macvlan.sh,内容如下:

#!/usr/bin/env bash

ip link add docker-macvlan link eth0 type macvlan mode bridge
ip addr add 192.168.1.2 dev docker-macvlan
ip link set docker-macvlan up
ip route add 192.168.1.3 dev docker-macvlan

启用这个服务:

systemctl enable docker-macvlan