Docker容器化组件架构

DellMcKenny 3年前
   <p>Containerization(容器化集装箱化)是以可移动可预测方法发布和部署应用程序的过程,它通过包装组件和它们的依赖,打包成一个标准的、隔离的、轻量的环境,称为容器Container,许多公司已经对设计应用和服务如何部署在分布式系统中非常感兴趣,这样能够让系统易于扩展伸缩,能够对付硬件与应用出现的故障问题。</p>    <p>Docker是一个容器化平台,用于简化和标准化各种环境的部署,大量的围绕Docker的软件生态环境已经建立。</p>    <h3>Docker和容器化</h3>    <p>Docker是最流行的容器化软件,Docker能够与许多开源项目集成管理和创建容器。</p>    <p><img src="https://simg.open-open.com/show/e2cc6e0edb1102d5bf32580a84291dbf.jpg"></p>    <p>在这张图中,你能够看到容器是如何与主机系统联系的,容器隔离了应用,操作系统资源已经被Docker抽象了隔离了,在上图右边,你能够看到容器能以层的概念建立,多个容器可以共享一个底层,降低资源的使用。</p>    <p>Docker的主要优点有:</p>    <ul>     <li>轻量资源使用:相对于虚拟化整个操作系统,容器只是在进程级别进行隔离,使用的还是主机内核kernel。</li>     <li>可移动:应用的所有依赖都打包到容器内部,这样可以运行在任何支持Docker的主机系统上。</li>     <li>可预测:主机并不关心容器内部运行什么,容器也不关系主机运行在什么平台上,是单机还是云平台都不关心,这些接口都是标准的,因此它们之间的交互行为都是可以预期的。</li>    </ul>    <p>一般情况下,当使用Docker设计一个应用或服务,它可以很好地将功能分离到容器中,一种设计策略称为面向服务架构,这会让你能够在将来方便独立地扩展和更新组件,正因为这些灵活性才使得人们对Docker在开发和部署上兴趣日益浓厚。</p>    <h3>服务发现</h3>    <p>服务发现是为了让容器扩展和灵活部署的一个整体策略,容器使用服务发现能够知道它所处的环境,这一切无需管理员介入,它们能够发现组件需要交互的连接信息,它们能够注册它们自己以便其他组件或工具知道它们已经变成随时可用,这些工具通常使用一个全局分布式配置存储实现任意配置。</p>    <p><img src="https://simg.open-open.com/show/3f75eafe296fe57bd382a1199cbd8797.jpg"></p>    <p>在上图中,你能看见应用将自己的连接信息注册到服务发现系统,一旦注册完毕,其他应用能查询服务发现以便明白如何连接到这个应用。</p>    <p>这些工具通常使用简单的key-value存储实现,分布在一个集群环境中,通常,key-value存储提供一个HTTPAPI来进行访问和数值设置,也有一些附加安全比如加密授权访问机制,分布式存储对于管理集群化的Docker主机是必要的,服务发现存储有以下功能:</p>    <ul>     <li>允许应用获得它们依赖的服务的连接方面数据。</li>     <li>能够让服务为上面目标注册连接信息。</li>     <li>提供全局访问,可存储任意配置数据。</li>     <li>存储集群管理需要的有关集群成员信息。</li>    </ul>    <p>一些流行的服务发现工具有:</p>    <ul>     <li>etcd:服务发现/ 全局分布式key-value存储</li>     <li>Consul:服务发现/ 全局分布式key-value存储</li>     <li>ZooKeeper:服务发现/ 全局分布式key-value存储</li>     <li>crypt:用于加密etcd项目</li>     <li>Confd:监视key-value存储实现服务改变和触发重配置。</li>    </ul>    <h3>网络工具</h3>    <p>容器化应用将自己定位在面向服务的设计,这样鼓励分离功能到离散组件,而这使得管理和扩展更加方便,它更需要确保组件之间的网络可靠性,Docker自己提供一个基础网络结构以便容器与容器,容器和主机之间的通讯。</p>    <p>Docker的原生网络能力提供将容器连接在一起的两种机制,第一个是将容器的端口暴露,映射到主机系统作为外部路由,你能选择主机端口让Docker映射,也可以让Docker随意选取,这种方式对于大部分情况都通用。</p>    <p>另外一种方式是允许容器使用Docker的"links"通讯,一个linked容器将会得到对方的连接信息,允许对方自动连接自己,前提是必须配置,这允许在同样主机上两个容器连接,这样无需事先知道服务所在的端口和IP地址。</p>    <p>Docker的网络基本层适合单机或相关的管理环境,Docker的生态系统已经有很多项目来聚焦网络功能,这些工具功能包括:</p>    <ul>     <li>跨多个主机简化和统一地址空间</li>     <li>虚拟专用网络提供各个组件之间的安全通讯</li>     <li>为每个主机每个应用建立子网通讯</li>     <li>创建通讯的macvlan接口</li>     <li>配置容器的自定义的 MAC 地址, 网关</li>    </ul>    <p>下面一些项目专门用于提高Docker网络功能:</p>    <ul>     <li>Flannel:为每个主机提供一个单独子网。</li>     <li>Weave:将所有容器组织在一个网络中.</li>     <li>Pipework:高级网络配置的网络工具集</li>    </ul>    <h3>调度、集群管理和流程编排</h3>    <p>当建立一个集群容器环境时,另外一个组件是调度,调度器负责启动容器。</p>    <p><img src="https://simg.open-open.com/show/03ff28462abff5b12e5857de40e2babc.jpg"></p>    <p>上图演示了简化的调度器设计,请求通过一个API或管理工具发出,调度器计算请求的条件和当前可用的主机,比如从一个分布式存储和服务发现中获取容器信息,这样可以见应用部署在最不繁忙的主机上。</p>    <p>主机的选择是调度器的核心功能,通常它有一个自动化管理功能,这些功能包括:</p>    <ul>     <li>根据要求调度同一主机上另外一个容器。</li>     <li>确保容器不会再放在同一主机上。</li>     <li>根据匹配标签或元数据放置一个主机上容器。</li>     <li>在最不繁忙的主机上放置容器。</li>     <li>启动在集群环境中每个主机的容器。</li>     <li>调度器负责装载容器到相关主机,然后启动 停止和管理。</li>    </ul>    <p>由于调度器必须与该组中每个主机交互,集群管理功能就必须了,这允许调度器获得成员信息,执行管理任务,流程编排combination一般是包含调度和管理主机功能的组合。</p>    <p>如下一些工具作为调度器:</p>    <ul>     <li>Fleet:调度器和集群管理工具</li>     <li>Marathon:调度器和服务管理工具</li>     <li>Swarm:调度器和服务管理工具</li>     <li>Mesos:服务抽象和主机资源统一调度</li>     <li>Kubernetes:高级调度器用于管理容器组</li>     <li>Compose:创建容器组的容器流程编排工具</li>    </ul>    <p>本文转自: <a href="/misc/goto?guid=4959713388213639605" rel="nofollow,noindex">http://weibo.com/p/23041893c106800102whjw</a></p>    <p> </p>    <p>来自:http://dockone.io/article/1668</p>    <p> </p>