侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解Docker中VLAN网络模式的配置

Docker  /  管理员 发布于 7年前   373

前言

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络 方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Docker网络模式选择

目前已有不少文章介绍了Docker的网络模型,但是在实际应用中还是有不少坑和需要注意的点

在Docker应用到生产环境的时候,网络模型的选择主要有以下几种

     1、原生Bridge NAT模式

     2、Linux Bridge VLAN模式

     3、利用第三方的网络方案

原生的Bridge NAT模式

这是Docker原生的网络模式,每台主机的容器都在一个独立的子网中,外部访问必须通过主机端口映射的方式。同时不同主机间的容器间访问也必须通过这种主机端口映射的方式。换句话说,一台主机上的容器其实是不知道另外一台主机的容器的。这种方式是否可以用于生产,一开始我是忧郁的,同时之前有写文章写NAT的性能损耗比较大,在没有资源做完整测试的情况下,我们最初的方案就没敢用这个网络方案。但是最近测试自己测试的结果看,NAT的性能是可以接受的(QPS和Latency和VLAN的模式都比较接近),只要有合适的方案将不同主机的容器联通就可。如用Mesos+Marathon+Bamboo+HAProxy的方式就可以的。

Linux Bridge VLAN模式

这是我考虑Docker网络模型一开始就想决定好的,主要有几方面的原因:

     1、NAT的方式一开始不敢用

     2、其它第三饭的工具还不太成熟

     3、一开始容器的数量不可能太多(因为VLAN的模式受限于VLAN的整体数量,只能4096个容器),如果按照一个主机10-16个容器算,可以支持到256台主机,这个还是可以接受的

     4、每个主机需要一个独立IP,并且可以互联互通

     5、运维管理要简单,毕竟我们的运维体系还是物理机体系的

     6、可以做到主机网络和VLAN网络的隔离

我们用的主机是CentosOS 7.X系列, 主机的网络配置如下:两个1G的网卡,通过Bond的方式绑在一起,然后配置主机一个虚拟网卡在VALN 1上,容器的Docker0的Bridge在另外一个VLAN 1上

网卡配置:

这里需要注意的是必须安装了bridge-utils, NetworkManager包

步骤

配置两个网卡,不要配置IP/GATEWAY等网络参数,增加MASTER=bond0以及SLAVE=yes

完整例子如:

TYPE=EthernetBOOTPROTO=noneDEFROUTE=yesPEERDNS=yesPEERROUTES=yesIPV4_FAILURE_FATAL=noIPV6INIT=noIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_PEERDNS=yesIPV6_PEERROUTES=yesIPV6_FAILURE_FATAL=noNAME=enp2s0f0UUID=7f6fa8e9-0177-46a8-b8ea-55c2187bea11DEVICE=enp2s0f0ONBOOT=yesMASTER=bond0SLAVE=yes

增加bond0网络配置/etc/sysconfig/network-scripts/ifcfg-bond0,并根据使用情况选择 mode值,内容如下。因为要在bond0上再配置VLAN所以没有配置IP等相关参数。如果配置了IP等参数则可以认为bond0就是一个普通网卡了。

DEVICE=bond0NAME=bond0TYPE=BondBONDING_MASTER=yesONBOOT=yesBOOTPROTO=noneBONDING_OPTS="miimon=100 mode=0"

可以通过cat /proc/net/bonding/bond0看配置的情况

在bond0上配置vlan,这里的vlan号为136,所以文件名为/etc/sysconfig/network-scripts/ifcfg-bond0.136,内容为:

VLAN=yesTYPE=EthernetDEVICE=bond0.136NAME=bond0.136PHYSDEV=bond0ONBOOT=yesBOOTPROTO=staticBRIDGE=docker0

因为后续需要将docker的bridge(docker0)挂在这个vlan上,所以TYPE必须是Ethernet,而且多了项配置BRIDGE=docker0

配置docker的bridge( /etc/sysconfig/network-scripts/ifcfg-docker0),名字也可以用别的,为了减少docker engine需要增加-b启动参数,所以用了默认的名字。同时没有给docker0配置IP,因为有另外一个vlan的ip来管理主机

TYPE=bridgeVLAN=yesDEVICE=docker0SLAVE=bond0.136NAME=docker0ONBOOT=yesBOOTPROTO=none

Docker的配置

按机器用途类型,修改 Docker 启动文件 /usr/lib/systemd/system/docker.service,内容如下:

      在 ExecStart=/usr/bin/docker daemon -H fd:// 这行后面加上:

   --fixed-cidr=172.20.56.16/28 --default-gateway=172.20.56.1 --registry-mirror=http://registry.xxxx.com:5000 --insecure-registry=docker.xxx.com:5000 --storage-driver=overlay --ip-forward=false --iptables=false --log-driver=journald   (注释:"--fixed-cidr="后面填写的是该机器容器IP子网段;"--default-gateway="后面填写的是容器IP子网网关;"--registry-mirror="后面填写的是生产环境的docker registry域名。)

这里有几个坑:

     1、对于Docker的存储,不要使用默认的方式,而是要使用overlay,同时是配合CentOS 7.X

     2、因为开始安装机器的时候网络配置不是Bond的模式,需要配置好bond后需要清理下原有的配置

          修改 /etc/sysctl.conf 文件,把 “net.ipv4.ip_forward” 的值修改为1

          不需要在/etc/sysconfig/network文件上配置gateway

          创建文件 /etc/modules-load.d/bonding.conf,内容如下:bonding

     3、默认情况,安装好docker后,并没有docker用户组和docker用户,必须使用root之行,如果不用root则需要:

          创建docker用户组:sudo groupadd docker

          把当前用户加入docker用户组,例如当前使用的是apps用户:sudo usermod -aG docker apps

          创建docker用户并加入docker用户组:sudo useradd docker -g docker

          修改“/var/lib/docker”目录及其子目录的owner和group:sudo chown -R docker:docker

          退出并重新登录,刷新当前用户的权限。

          最大的坑是我们在某些主机上安装一些平台服务如Zookeeper,如果容器想访问这些配置为容器的主机上的服务是访问不通,,这个弄好了好久都没有办法,找网络的同事,从交换机配置等来看都没有问题,然后在老罗的指导下做以下尝试:

              - 在主机上启动tcpdump,然后在主机上抓取来自于容器的ping包,可以发现主机收到了容器发来的ICMP包,但是容器没有收到任何响应,ping总是超时,难道是主机抛弃了ICMP包?

                    a、打开火星文检测看看是否有包进来: sudo sysctl net.ipv4.conf.bond0/51.log_martians=1 (bond0/51为对应bond0.51的网卡)可以看到有包进来说明有来源不明的数据包。

                    b、从以上两点可以想到网络上我们配置了两个不同的网卡,不同的网断,原理上他们应该是各自隔离的,及访问网段1的数据要从网段1的网卡进来,如果从网段2进来,Linux认为是非法包

                    d、据其原因,是因为Linux的RP(Reverse Path)过滤的问题,在这种情况下,需要将这台主机的RP关闭就可

sudo sysctl net.ipv4.conf.bond0/51.rp_filter=0sudo sysctl net.ipv4.conf.bond0/52.rp_filter=0sudo sysctl net.ipv4.conf.all.rp_filter=0sudo sysctl net.ipv4.conf.bond0.rp_filter=0

第三方网络Plugin

目前比较好的选择是以下几种,不过还在摸索中

    Calico, http://projectcalico.org/

    Contiv, http://docs.contiv.io

总结

以上就是Docker中VLAN网络模式配置的详细介绍,希望这篇文章的全部内容对大家学习或者使用Docker能有所帮助,如果有疑问大家可以留言交流。


  • 上一条:
    阿里云CentOS 6.5 安装Docker详细步骤
    下一条:
    Docker如何同时启动多个服务
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤(0个评论)
    • 在MacBook下laravel项目多php版本docker开发环境配置方案(0个评论)
    • 在docker环境中部署docker部署elk架构流程步骤(1个评论)
    • docker compose跟Dockerfile的区别浅析(0个评论)
    • Ubuntu 22.04系统中安装podman流程步骤(1个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2020-06
    • 2021-05
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-11
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客