• Docker技术使用场景主要特性等相关资源整理
  • OpenStack与Docker集成:使用openstack管理docker
  • Docker的隔离性和安全性问题
  • docker使用的技术之Container内核原理介绍
  • Docker详细的应用与实践架构举例说明
  • ​基于Docker的大数据开发实践
  • ​docker之轻量虚拟化技术——docker实战分享
  • 什么是docker?Docker技术详细介绍
  • 基于Docker容器的云计算平台搭建实战
  • docker和VM虚拟机的区别以及如何用docker搭建基础设施
  • ​Docker容器术语以及docker的特点
  • Docker & Docker Hub
  • Introduction to Swarm, a Docker-native clustering system
  • Docker、Kubernetes、Neutron中的网络简介
  • ​James Turnbull:《The Docker Book》
  • Docker on AWS:Running Containers in the Cloud
  • Introduction docker Container Security
  • docker应用之利用Docker构建自动化运维
  • Docker基本原理简介和详细安装步骤介绍
  • Docker 基础用法和常用命令及选项介绍
  • Docker 端口映射,端口绑定操作介绍
  • Docker 四种网络模式及网络配置详细介绍
  • docker下通过Dockerfile指令构建镜像的指令选项介绍
  • ​Docker 容器数据管理,链接容器,构建私有库
  • Docker容器分析----好处和缺点介绍
  • 如何实现 coreos 下Docker 与分布式数据库结合
  • 应对 Docker 网络功能难题的挑战与思考
  • Docker着手将容器部署到私有云与公有云
  • 为现在和未来改善Docker安全
  • Docker容器与企业存储的结合思考
  • Docker监控以及cAdvisor和Prometheus监控工具的对比
  • ​有关Docker的八个令人难以置信的事实
  • ​部署 Docker 前必须问自己的四个问题
  • 程序猿,千万别说你不了解Docker!
  • 将要改变IT世界的的docker技术是什么?
  • Docker支持更深入的容器日志分析
  • Docker宣布支持Windows 10和Azure Windows Server
  • Docker 1.12.0到底有哪些不同之处
  • 云计算之Docker容器技术如何落地?
  • Docker v1.12.0-rc5 普通版实验版本下载,高级容器引擎
  • 针对Docker容器的监控指标
  • ​Docker 的步伐:DevOps 与 OS 化
  • 八个问题帮你快速了解Docker
  • ​什么是Docker以及docker的 诞生技术演进
  • ​Docker v1.12.1-rc1各种版本发布下载,高级容器引擎
  • ​Docker 1.12.0 改进了服务的负载均衡参数
  • Windows下Docker应用部署相关问题详解
  • Docker1.12 引擎使用体验 ​
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • ​Windows Server 2016提供Docker原生运行的企业级支持
  • ​传统应用的docker化迁移
  • Docker携手Windows Server
  • Docker扁平化网络设计与实现
  • Plesk 中操作和设置 Docker 容器
  • 如何通过 Docker 在 Linux 上托管 .NET Core
  • Docker 1.12.4应用容器引擎发布及下载地址
  • Docker v1.13.0 应用容器引擎正式版发布及下载地址
  • docker源码分析之容器日志处理与log-driver实现
  • 如何在win7,win8下面启动docker
  • win7,win8安装Docker具体过程
  • win7, win8安装docker需要了解的概念
  • win7,win8安装docker的依赖条件
  • Docker Toolbox 介绍
  • Arch下面安装启动及删除docker介绍
  • Debian 7(Wheezy)下面如何安装docker
  • Debian 8(Jessie )下面如何安装docker
  • 红帽RHEL下如何删除docker详细步骤介绍
  • 红帽RHEL下面设置docker服务自动启动
  • linux下不使用sudo命令执行docker的操作步骤
  • 红帽redhat下通过脚本和yum安装docker容器引擎的详细步骤
  • 红帽RHEL下安装docker依赖性检查
  • Ubuntu Vivid 15.04 下面安装docker的详细步骤
  • Ubuntu Trusty 14.04 (LTS) 下面安装docker及依赖关系检查
  • Ubuntu Raring 13.04 和 Saucy 13.10 (64 bit)下面安装docker
  • Ubuntu Precise 12.04 (LTS) (64-bit)下面安装docker
  • Docker支持的安装方式
  • 通过docker ps命令检查运行中的docker镜像
  • 关于docker入门教程
  • 通过docker search命令搜索可用docker镜像
  • 在docker容器中运行hello world!
  • 在docker容器中通过apt-get安装新的程序
  • 通过docker commit命令保存对docker容器的修改
  • 通过docker run命令运行新的docker镜像
  • 准备学习docker: docker version命令查看版本
  • 什么是Docker?Docker通常用于如下场景
  •  
    当前位置:  教程>docker中文入门学习手册

    Docker扁平化网络设计与实现

     
        发布时间:2017-2-20  


        本文导语:  Docker扁平化网络设计与实现研发背景众所周知,Docker容器跨主机互访一直是一个问题,Docker官方为了避免网络上带来的诸多麻烦,故将跨主机网络开了比较大的口子,而由用户自己去实现。目前Docker跨主机的网络实现...

       Docker扁平化网络设计与实现

    研发背景


    众所周知,Docker容器主机互访一直是一个问题,Docker官方为了避免网络上带来的诸多麻烦,故将跨主机网络开了比较大的口子,而由用户自己去实现。目前Docker跨主机的网络实现方案也有很多种,主要包括端口映射ovs、 fannel等。

       Docker扁平化网络设计与实现

    但是这些方案都无法满足我们的需求:端口映射服务内的内网IP会映射成外网的IP,这样会给开发带来困惑,因为他们往往在跨网络交互时是不需要内网IP的;而ovs与fannel则是在基础网络协议上又包装了一层自定义协议,这样当网络流量大时,却又无端的增加了网络负载。最后我们采取了自主研发扁平化网络插件,也就是说让所有的容器统统在大二层上互通。


    Docker原生四种网络模式

    目前,基于Docker的网络模式有很多种,接下来就简单的对BridgeHostContainer、None模式进行介绍。


    A. Bridge模式

    该模式为Docker的默认网络模式,Docker daemon 会在宿主机上建立一个默认的网桥docker0, 相信大家对docker0非常熟悉,但是在跨容器通信当中它却没有派上用场,因为默认的docker0的地址都是内网地址,而且启动后容器虽然也桥接在docker0上,但是容器的默认网关却依然无法设置,这就是docker原生默认网络的一个弊端。当然了,他却实现了在当先宿主机的网络隔离,拥有自己的namespace, 网卡和IP,具体的桥接原理我将在后面继续说明


    B. Host模式

    该模式其实就是和当前宿主机共享网络空间,而Docker本身并没有进行网络隔离,说的通俗点,也就是说容器其实都是和宿主机拥有相同的IP, 而如何具体区分各个容器的呢?那就是通过端口映射,在启动Docker容器的时候来指定-p参数来进行设置端口映射。虽然这种方式在某种程度上也可以达到跨宿主机容器访问的目的,但是,却丧失了Docker网络隔离的意义,而且端口映射同样给微服务迁移带来一些麻烦,无法像非虚拟环境那样的平滑迁移,而是要考虑到很多端口转换的问题。


    C. Container模式

    顾名思义,此模式会共享另一个容器的网络命名空间,但是会限制在一台宿主机上,依然无法实现容器间跨主机通信的功能。


    D. None模式

    该模式是容器拥有自己的网络命名空间,自己的网路,自己的网卡,不和外界有任何瓜葛,容器网络完全独立,换句话说就是容器不需要网络功能,这种模式适用于容器包含写数据磁盘卷的一些任务。这种模式依然无法实现我们的跨宿主机容器网络通信的功能。


    自研Docker Overlay网络模式

    目前Overlay网络模式主要是由隧道和路由两种方式实现,一种是对基础网络协议进行封包,另一种是配置更复杂的路由配置实现容器间跨主机的网络通信。其实,以上两种或多或少的都会给我们网络的实现带来了复杂性以及性能上的损耗,因为当我们拥有庞大的业务集群以后,这些复杂度和性能损耗都是不能忽视的。

    插件原理如下:

       Docker扁平化网络设计与实现

    1.创建Docker自定义网络

    docker network create 
    --opt=com.docker.network.bridge.enable_icc=true
    --opt=com.docker.network.bridge.enable_ip_masquerade=false
    --opt=com.docker.network.bridge.host_binding_ipv4=0.0.0.0
    --opt=com.docker.network.bridge.name=br0
    --opt=com.docker.network.driver.mtu=1500
    --ipam-driver=talkingdata

    --subnet=容器IP的子网范围, 例:172.18.0.0/17

    --gateway=br0网桥使用的IP,也就是宿主机的地址, 例:172.18.0.5

    --aux-address=DefaultGatewayIPv4=容器使用的网关地址mynet

    我们首先需要创建一个br0自定义网桥,这个网桥并不是通过系统命令手动建立的原始Linux网桥,而是通过Docker的create network命令来建立的自定义网桥,这样避免了一个很重要的问题就是我们可以通过设置DefaultGatewayIPv4参数来设置容器的默认路由,这个解决了原始Linux自建网桥不能解决的问题. 用Docker创建网络时我们可以通过设置subnet参数来设置子网IP范围,默认我们可以把整个网段给这个子网,后面可以用ipam driver(地址管理插件)来进行控制。还有一个参数gateway是用来设置br0自定义网桥地址的,其实也就是你这台宿主机的地址啦。


    2.IPAM

    这个驱动是专门管理docker 容器ip的, docker 每次启停与删除容器都会调用这个驱动提供的ip管理接口,然后ip接口会对存储ip地址etcd有一个增删改查的操作。此插件运行时会起一个unix socket, 然后会在docker/run/plugins 目录生成一个.sock文件,docker daemon之后会和这个sock 文件进行沟通去调用我们之前实现好的几个接口进行ip管理,以此来达到ip管理的目的,防止ip冲突


    3.桥接

    通过Docker命令去创建一个自定义的网络起名为“mynet”,同时会产生一个网桥br0,之后通过更改网络配置文件(在/etc/sysconfig/network-scripts/下ifcfg-br0、ifcfg-默认网络接口名)将默认网络接口桥接到br0上,重启网络后,桥接网络就会生效。Docker默认在每次启动容器时都会将容器内的默认网卡桥接到br0上,而且宿主机的物理网卡也同样桥接到了br0上了。其实桥接的原理就好像是一台交换机,Docker 容器和宿主机物理网络接口都是服务器,通过veth pair这个网络设备像一根网线插到交换机上。至此,所有的容器网络已经在同一个网络上可以通信了,每一个Docker容器就好比是一台独立的虚拟机,拥有和宿主机同一网段的IP,可以实现跨主机访问了。


    4.etcd

    我们可以设置1,3,5,7个节点为Etcd集群去集中管理Docker集群的IP,而且我们也将宿主机的地址进行了统一的管理,这样做同样也是为了避免IP的使用冲突导致线上Overlay iis7站长之家不可用。我们会通过自己开发的工具进行IP初始化,也就是说会传进来一个IP范围,然后工具会将所有的IP存进etcd中,每一个网络ID就是一个etcd目录,目录下就会分成已分配与未分配的IP地址池。etcd本身会提供Go语言API来访问etcd, 目前etcd还是相当稳定的,没有出现过什么问题。


    结语

    我们的Docker集群是采用Swarm进行管理的,Swarm相对K8S来说要简单的很多,但是在编排功能上也会有所欠缺,不过等Docker的新版本1.12发布以后,Swarm会集成到Docker内部,而且会增加许多的功能,我想那时这个问题就会迎刃而解了。管理Swarm的是采用第三方的管理图形界面软件shipyard,这款软件本身并不会兼容自定义网络,而且在设置每个容器使用的CPU核数时又会有BUG,我们对此开源软件进行了二次开发,解决了这些问题。现如今我们已经成功的在上面运行了YARN集群,网络性能也是没有什么问题的。


    参考

    https://docs.docker.com/engine/extend/plugins

    https://github.com/docker/libnetwork/blob/master/docs/ipam.md

    https://github.com/docker/go-plugins-helpers


    该Docker插件的开源地址:
    https://github.com/TalkingData/Shrike


    关于作者

    马超,TalkingData运维部研发工程师,精通GolangPython,五年技术工作经历,曾从事手机游戏服务端研发, 技术运营研发工程师。关注 平台稳定性(监控,问题发现及响应)和资源充分利用(虚拟化,容器)。




      您可能感兴趣的文章:

    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:Docker扁平化网络设计与实现
    相关文章推荐:


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3