前言
我们在使用docker时,大多数情况下容器网络都是用的bridge,然后通过端口映射暴露服务。但有些场景我们想为容器添加单独的ip,这个时候macvlan网络就排上用场了。
使用
创建
docker network create \
--driver=macvlan \
--gateway=192.168.3.1 \
--subnet=192.168.3.0/24 \
--ip-range=192.168.3.240/28 \
-o parent=eth0 vnet
使用命令docker network ls
查看
后续在创建容器时通过参数
--network vnet
指定使用该网络即可。为了能够使用固定的ip,可以在创建容器时通过参数--ip 192.168.3.x
指定容器ip,然后通过docker inspect container_name
可以看到分配到了正确的ip容器和宿主机访问问题
使用上述网络的容器,虽然可以和局域网内的其他设备互相访问,但是却无法和宿主机互相访问,ping命令会返回no route to host,貌似是出于安全考虑。如果要解决这个问题,需要在物理网卡上再创建一个macvlan来实现。这里直接放脚本
#!/bin/bash
ip link add net-shim link eth0 type macvlan mode bridge
ip addr add 192.168.3.239/32 dev net-shim # 这里是宿主机的virtual ip
ip link set net-shim up
ip route add 192.168.3.240/28 dev net-shim # 这里是上面创建docker网络时执行的ip range
然后在宿主机上就可以通过容器ip直接访问,在容器中需要访问宿主机需要通过虚拟ip访问。
建议在路由器上设置一下DHCP的范围,避免造成ip冲突。