暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何让docker 不用端口映射,用IP直连?

原创 鸿惊九天 2023-06-09
1281
不用端口映射,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论