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


    最近在做项目的时候,有的服务是在 docker 容器中启动的,有的是启动的jar包,有的在不同服务器上启动的。

    如果要实现其他服务器来访问 docker 容器中的服务,用常规的方法是无法实现的。

    查阅资料,发现 macvlan 可以实现这一个功能,使得容器与宿主机在同一局域网

    这个方式有一个弊端:官网说这种模式只支持 Linux 系统下的 docker,对于 WindowsMac 系统下不支持。

    官网地址

    1、使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    从返回的信息可以看到,我的虚拟机启用的是 ens33

    2、设置虚拟机的网络连接模式

    将待修改虚拟机的网络适配器模式设置为 桥接模式,并选中 复制网络物理连接状态。如下图所示:

    详情可参考:虚拟机NAT模式集群改为桥接模式集群

    在这里插入图片描述

    3、设置 Linux 系统网卡开启混杂模式

    在终端输入

    ip link set ens33 promisc on
    
    • 1

    开启网卡接口 ens33 的混杂模式,ens33 为第一步中查看的网卡名称

    4、查看 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    从返回的信息可以看到, ens33 多出了 PROMISC 标识。

    5、使用命令创建网络

    [root@master ~]# docker network create -d macvlan --subnet 1.1.2.0/16 --gateway 1.1.2.1 -o parent=ens33 my_create_net
    
    • 1

    -–subnet 填写的是与网卡网段一致的IP

    --gateway 填写的是网关地址

    parent= 填写需要连接到宿主机物理网络的对应网卡名称

    my_create_net 是用户自己命名的网络名称

    执行成功之后,返回一串类似于下面的字符串

    314b3bcd8b60e225f964f85fc31291ddd9c397e8900cdd4e0f1a44fd2be261ec
    
    • 1

    6、此时可以按照常规的操作方式,启动 docker 容器 了

    启动需要注意, --network 或者 net 选项得写第二步中设置的名称(我的是my_create_net

    其他机器上和 docker 两者之间,可以互相 ping 通了

    注意事项:

    若是第三步未操作,那么当重启 docker 容器之后,会出现容器莫名的访问不了的状况。

    ip link set ens33 -promisc on    #取消混杂模式
    
    • 1
  • 相关阅读:
    Java 读写锁 ReadWriteLock 原理与应用场景详解
    计算机毕业设计ssm基于ssm的高校党建平台f80yq系统+程序+源码+lw+远程部署
    python 操作windows的Wlan
    【问题】MobaXterm Sftp 超时自动退出
    Vuex、localStorage和sessionStorage:如何选择合适的数据存储方式?
    http协议连接方式 —— 短连接和长连接(请求头Connection属性)
    Kotlin协程:线程的桥接与切换
    数据库-MySQL-基础(5)- DQL
    使用QTableView实现九九乘法表
    基于微信小程序的电影院买票选座系统
  • 原文地址:https://blog.csdn.net/qq_45083975/article/details/126437324