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
这几行命令的意思是:
- 创建一个
macvlan
网络接口docker-macvlan
,连接到eth0
网卡,模式为bridge
。 - 为
docker-macvlan
分配一个 IP 地址,这个地址随意选,只需要和主机在同一个网段的没有别的设备使用的地址即可。这个地址不会被广播到局域网,因此不会被路由器发现。 - 启用
docker-macvlan
网络接口。 - 添加一个路由规则,让主机可以访问
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