问题介绍

最近在做将项目放入docker容器中启动,运行。项目中需要开启DHCP服务,不运行不知道,一运行就发现问题了,由于docker容器和其宿主机不在一个广播域内,所以在容器中启动的DHCP服务收不到宿主机局域网内的广播报文,就无法正常进行DHCP服务的工作

方案

通过查阅资料和官方文档,发现macvlan这种网络模式可以是容器直接连接到物理网络,解决我们的问题。但是官网同时说了这种模式只支持Linux系统下的docker,对于windows和Mac系统下不支持。但是我是需要运行在windows系统下的,所以我采用的方式是在windows下安装一个Linux虚拟机,然后在虚拟机中运行docker。
官网链接:https://docs.docker.com/network/network-tutorial-macvlan/

步骤

1.开启虚拟机网卡的混杂模式(对于直接在Linux系统下的不需要此步骤)
在VirtualBox下选择安装的虚拟机,点击设置,选择左侧网络菜单,选择网卡进行如下配置。

连接方式:连接方式需要选择桥接网卡,使虚拟机和windows宿主机在同一局域网内
界面名称:在windows cmd窗口执行ipconfig /all ,查看对应物理网卡的描述,在界面名称选择需要桥接的物理网卡
混杂模式:选择全部允许(如果在启动后修改混杂模式,建议进行重启后尝试;我在虚拟机启动中修改混杂模式为拒绝后,发现ping立马不通,再改回全部允许也ping不通,需要重启)

docker 容器和宿主机同一个网段 docker macvlan与宿主机同网段_docker 容器和宿主机同一个网段


docker 容器和宿主机同一个网段 docker macvlan与宿主机同网段_docker_02

2.设置Linux系统网卡开启混杂模式

在终端输入ip link set enp0s8 promisc on 开启网卡接口enp0s8的混杂模式,enp0s8根据实际配置网卡填写

在终端输入ifconfig查看是否开启混杂模式,显示有PROMISC即为混杂模式已开启

docker 容器和宿主机同一个网段 docker macvlan与宿主机同网段_docker 容器和宿主机同一个网段_03


3.创建docker network,启动容器

docker network create -d macvlan --subnet=192.168.50.0/24 --gateway=192.168.50.1 -o parent=enp0s8 mymacvlan

–subnet 填写enp0s8网卡网段 parent= 填写需要连接到宿主机物理网络的对应网卡

docker 容器和宿主机同一个网段 docker macvlan与宿主机同网段_IP_04


执行命令 docker run -itd --network=mymacvlan --ip=192.168.50.20 --name=centos-test centos 进行启动容器

–network:指定为上面创建的网络

–ip:指定IP地址,如果不指定的话会自动分配。建议自己指定,可避免IP地址冲突问题

启动完成后,通过docker exec 进入容器中,进行操作,查看IP地址,ping windows,使用tcpdump抓包进行查看能否收到DHCP广播包。发现能ping通windows和与windows相通的机器,能抓包到DHCP包。大功告成。

容器和Linux宿主机是不能ping通的

docker 容器和宿主机同一个网段 docker macvlan与宿主机同网段_DHCP_05


至此,就已经完成了需要容器和其宿主机某一网卡在同一局域网内,可以接收宿主机的物理网络啦。在使用此种方式启动时,可以不用映射端口,可以直接使用容器IP+端口进行访问了。