docker使用macvlan获取独立ip docker启动的容器会获取一个docker分配的内网ip,一般是172开头。现在想让容器内获取一个与宿主机同级别的ip,在路由器看来是两个独立的设备。
这里需要使用linux的 macvlan功能,他可以把物理网卡虚拟出来一个,让其拥有独立的mac地址,在路由器看来就是独立的设备。
docker macvlan的官方文档
操作
使用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
启动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