最近在做项目的时候,有的服务是在 docker 容器中启动的,有的是启动的jar包,有的在不同服务器上启动的。
如果要实现其他服务器来访问 docker 容器中的服务,用常规的方法是无法实现的。
查阅资料,发现 macvlan 可以实现这一个功能,使得容器与宿主机在同一局域网内
这个方式有一个弊端:官网说这种模式只支持 Linux 系统下的 docker,对于 Windows 和 Mac 系统下不支持。
ifconfig 查看启用的是哪个网卡[root@master ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:e8:8d:ac:47 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 1.1.2.50 netmask 255.255.255.0 broadcast 1.1.2.255
inet6 fe80::ad6c:9992:474c:ef8 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f8:48:89 txqueuelen 1000 (Ethernet)
RX packets 3965 bytes 365231 (356.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 428 bytes 47705 (46.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
从返回的信息可以看到,我的虚拟机启用的是 ens33
将待修改虚拟机的网络适配器模式设置为 桥接模式,并选中 复制网络物理连接状态。如下图所示:
详情可参考:虚拟机NAT模式集群改为桥接模式集群

Linux 系统网卡开启混杂模式在终端输入
ip link set ens33 promisc on
开启网卡接口 ens33 的混杂模式,ens33 为第一步中查看的网卡名称
Linux 系统网卡是否开启成功混杂模式,使用 ifconfig 查看[root@master ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:e8:8d:ac:47 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 1.1.2.50 netmask 255.255.255.0 broadcast 1.1.2.255
inet6 fe80::ad6c:9992:474c:ef8 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f8:48:89 txqueuelen 1000 (Ethernet)
RX packets 3965 bytes 365231 (356.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 428 bytes 47705 (46.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
从返回的信息可以看到, ens33 多出了 PROMISC 标识。
[root@master ~]# docker network create -d macvlan --subnet 1.1.2.0/16 --gateway 1.1.2.1 -o parent=ens33 my_create_net
-–subnet 填写的是与网卡网段一致的IP
--gateway 填写的是网关地址
parent= 填写需要连接到宿主机物理网络的对应网卡名称
my_create_net 是用户自己命名的网络名称
执行成功之后,返回一串类似于下面的字符串
314b3bcd8b60e225f964f85fc31291ddd9c397e8900cdd4e0f1a44fd2be261ec
docker 容器 了启动需要注意, --network 或者 net 选项得写第二步中设置的名称(我的是my_create_net )
其他机器上和 docker 两者之间,可以互相 ping 通了
注意事项:
若是第三步未操作,那么当重启 docker 容器之后,会出现容器莫名的访问不了的状况。
ip link set ens33 -promisc on #取消混杂模式