不用端口映射,Macvlan让Docker容器可以IP直连。
其优点如下:
独立IP、维护方便、不占用主机端口号、使用容器默认端口
拥有稳定的IP后,容器间跨主机通信成为可能,因为无论是物理机、虚拟机、容器都是物理网络的一等公民,容器间通信时直接指定IP即可。
其缺点如下:
网络环境需要支持混杂模式,公有云不支持。
部分大规模应用集群、内网IP地址是稀缺资源。
默认容器端口对外暴露,需要在内网构建应用防火墙/网关决定哪些IP的哪些端口允许外界访问,哪些不允许。
一、Macvlan配置操作
1、确认网卡
[root@cs79-mysql:~]# ifconfig
ens33: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 10.10.10.142 netmask 255.255.255.0 broadcast 10.10.10.255
inet6 fe80::20c:29ff:fe11:6ab7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:11:6a:b7 txqueuelen 1000 (Ethernet)
RX packets 501 bytes 44467 (43.4 KiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 347 bytes 65559 (64.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、开启网卡的混杂模式
[root@cs79-mysql:~]# ip link set ens33 promisc on
[root@cs79-mysql:~]# ifconfig ens33 promisc
3、创建macvlan 虚拟网络
docker network create -d macvlan \
--subnet=10.10.10.0/24 \
--ip-range=10.10.10.0/24 \
--gateway=10.10.10.2 \
-o parent=ens33 \
macvlan142
##
-d macvlan 指定网络模式
--subnet=10.10.10.0/24 设置子网掩码
--ip-range=10.10.10.0/24 设置容器允许的ip范围
--gateway=10.10.10.2 设置网关,物理网卡的网关
-o parent=ens33 设置上一级网卡(或虚拟网卡)名称
4、加入macvlan网络
docker run -itd --name tomcat-1 --ip=10.10.10.190 --network macvlan31 tomcat
docker run -itd --name tomcat-2 --ip=10.10.10.191 --network macvlan31 tomcat
docker run -d --name mongodbtest -h mongodbtest -v /home/share:/media -v /home/mongodb:/data --privileged=true --restart=always --ip=10.10.10.190 --network macvlan142 centos7.6-my /usr/sbin/init
二、如何解决宿主机ping不同容器的IP问题
默认情况下各个macvlan之间可以通讯,但是不能与宿主机进行通讯!! 主要原因:为了安全而禁止互通
如宿主机ping容器的ip,尽管他们属于同一网段,但也是ping不通的,反过来也是。
如何解决这个问题:设置虚拟 IP(做路由实现通信)
环境说明=========
宿主机: 10.10.10.142
容器:10.10.10.190
虚拟 IP(做路由实现通信):10.10.10.8
宿主机物理网卡名称:ens33
# 添加一个虚拟接口桥接到物理网卡
ip link add macvlan-proxy link ens33 type macvlan mode bridge
# 给虚拟接口配置ip
ip addr add 10.10.10.8/32 dev macvlan-proxy
# 启用虚拟接口
ip link set macvlan-proxy up
# 添加到容器网络的静态路由规则
ip route add 10.10.10.190/32 dev macvlan-proxy
此时,就可以实现宿主机和容器通信了
使用 ifconfig 查看是否有 macvlan-proxy 的网卡出现:
macvlan-proxy: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.10.8 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::b085:9ff:fe78:b482 prefixlen 64 scopeid 0x20<link>
ether b2:85:09:78:b4:82 txqueuelen 1000 (Ethernet)
RX packets 8 bytes 1282 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 936 (936.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用 route -n 查看是否有相关路由出现
10.10.10.190 0.0.0.0 255.255.255.255 UH 0 0 0 macvlan-proxy
最后修改时间:2023-06-09 09:31:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




