docker使用macvlan配置网络,使容器与宿主机在同一局域网,广播域内

问题介绍

最近在做将项目放入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不通,需要重启)

在这里插入图片描述
在这里插入图片描述

2.设置Linux系统网卡开启混杂模式
在终端输入ip link set enp0s8 promisc on 开启网卡接口enp0s8的混杂模式,enp0s8根据实际配置网卡填写
在终端输入ifconfig查看是否开启混杂模式,显示有PROMISC即为混杂模式已开启
在这里插入图片描述
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 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通的
在这里插入图片描述
至此,就已经完成了需要容器和其宿主机某一网卡在同一局域网内,可以接收宿主机的物理网络啦。在使用此种方式启动时,可以不用映射端口,可以直接使用容器IP+端口进行访问了。

要实现在Docker容器中访问宿主机局域网,有几种方法可以尝试: 1. 使用host模式网络:通过在运行Docker容器使用`--network=host`选项,容器将共享主机网络命名空间,可以直接访问宿主机网络局域网。 2. 使用桥接模式网络:在创建Docker网络时,可以使用`docker network create`命令创建一个桥接网络,并指定子网和网关。将Docker容器连接到此网络后,可以设置容器的IP地址、网关和DNS服务器,使其能够访问宿主机局域网。例如,可以使用以下命令创建桥接网络,并将容器连接到此网络: ``` docker network create --subnet=<subnet> --gateway=<gateway> <network_name> docker run --name <container_name> --network=<network_name> -d <image_name> ``` 3. 使用主机网络的IP地址:找到宿主机网络接口的IP地址,在Docker容器使用此IP地址作为访问局域网的地址。通过在Docker容器中设置静态IP地址,可以实现直接访问宿主机网络局域网。例如,在Docker容器中执行以下命令来设置静态IP地址: ``` ifconfig eth0 <host_ip_address> netmask <netmask> route add default gw <gateway> echo "nameserver <dns_server>" > /etc/resolv.conf ``` 需要注意的是,以上方法中使用的具体命令和参数可能会因操作系统和Docker版本而有所不同。在实施前,建议先查阅相关文档和官方文档,以了解最适合您的环境的正确设置方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值