docker:编排与部署小神器>>Compose概念篇

docker-compose是什么

Compose是定义和运行多容器Docker应用程序的工具。 使用Compose,您可以使用YAML文件来配置应用程序的服务。 然后,使用单个命令,您可以创建并启动配置中的所有服务。

Compose适用于所有环境:生产,开发,测试以及CI工作流程。使用Compose基本上是一个三步过程:

  1. 使用Dockerfile定义应用程序的环境,以便在任何地方进行复制。
  2. 在docker-compose.yml中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
  3. 运行docker-compose并撰写开始并运行你的整个应用程序。

可以参考docker-compose官方说明详细了解:https://docs.docker.com/compose/overview/

还没有完全理解的朋友,用通俗的语言来说:

docker-compose 是用来做docker 的多容器控制,docker-compose 是一个用来把 docker 自动化的东西,有了 docker-compose 你可以把所有繁复的 docker 操作全都一条命令,自动化的完成。来看看下面这张图你也许又能更好的理解了:


从上图可以看到,这位compose哥们非常开心的把N多个容器抓在一起,根据自己的心情来编排部署。

谈谈容器编排与部署

?Docker有很多优势,但对于运维或开发者来说,Docker最大的有点在于它提供了一种全新的发布机制。这种发布机制,指的是我们使用Docker镜像作为统一的软件制品载体,使用Docker容器提供独立的软件运行上下文环境,使用Docker Hub提供镜像统一协作,最重要的是该机制使用Dockerfile定义容器内部行为和容器关键属性来支撑软件运行。

?Dockerfile作为整个机制的核心。这是一个非常了不起的创新,因为在Dockerfile中,不但能够定义使用者在容器中需要进行的操作,而且能够定义容器中运行软件需要的配置,于是软件开发和运维终于能够在一个配置文件上达成统一。运维人员使用同一个Dockerfile能在不同的场合下“重现”与开发者环境中一模一样的运行单元(Docker容器)出来。

为什么要使用Compose


?先来想一下我们平时是怎么样使用docker的?把它进行拆分一下:

1、docker search 镜像,是不是先查找一个镜像;
2、docker run -itd 镜像名称 ,然后在运行这个镜像;
3、然后如果你要在运行第二个镜像、第三个镜像.....等等镜像,你是不是又要docker search、docker run运行。

?上面“ docker run it 镜像名称 ”这只是最小的动作, 如果你要映射硬盘,设置nat网络或者映射端品,等等…你就要做更多的 docker 操作, 这显然是非常没有效率的,况且如果你要大规模部署,是不是觉得就很麻烦了。

?但是我们写在 docker-compose.file 里面就很好了。你只需要写好后只运行一句:
?docker-compose up -d

?一切都是那么的简单!!!

了解下编排和部署

编排,即orchestration,它根据被部署的对象之间的耦合关系,以及被部署对象环境的依赖,制定部署流程中各个动作的执行顺序,部署过程所需要的依赖文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式(比如配置文件或者特定的代码)来要求运维人员定义并保存起来,从而保证这个流程能够随时在全新的环境中可靠有序地重现出来。

部署,即deployment,它是指按照编排所指定的内容和流程 ,在目标机器上执行编排指定环境初始化,存放指定的依赖和文件,运行指定的部署动作,最终按照编排中的规则来确认联署成功。

这么来解释吧,编排是一个指挥家,他的大脑里存储了整个乐曲的演奏流程,对于每一个小节每一段音乐的演奏方式、开始、结束他都了然于胸;部署就是整个乐队,他们严格按照指挥家的意图用乐器来完成乐谱的执行,在需要时开始演奏,又在适当的时机停止演奏。最终,两者通过协作就能把每一位演奏者独立的演奏通过组合、重叠、衔接来形成高品位的交响乐。

而在Compose的世界里,编排和部署的组合结果,就是一朵“容器云”。

一探究竟~~ Compose原理

docker-compose的调用过程扁平的像一张纸,仅用一张简单的模块图就足够解释明白,如下图所示:

?首先,用户执行的docker-compose up指令调用了命令行中的启动方法。功能很简单明了,一个docker-compose.yml定义了一个docker-compose的project,docker-compose操作提供的命令行参数则作为这个project的启动参数交由project模块去处理。

?其次,如果当前宿主机已经存在与该应用对应的容器,docker-compose将进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose就会执行service模块的容器重启方法,否则就将直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项定义参数都是从docker-compose up 指令和docker-compose.yml中传入的。

?接下来,启动容器的方法也很简洁,这个方法中完成了一个Docker容器启动所需的主要参数的封装,并在container模块执行启动。该方法所支持的参数我想大多数朋友过是有所了解的。

?最后,container模块会调用docker-py客户端执行向Docker daemon发起创建容器的POST请求,再往后就是Docker处理的范畴了,相信看过我这篇文章 Docker:架构拆解请添加链接描述 的朋友就明白了。

总结思考

  大家想想,仅仅使用Compose,就可以构建自己的容器云吗?答案显然是否定的。docker-compose解决的问题局限在“编排”二字,甚至连“部署”范畴都涉足甚少,而在一个能够服务于大众的云平台中,编排与部署也仅仅是其中的一个组成部分而已。来一起分析一下它的局限制会有哪些:

  1. docker-compse是面向单宿主机部署的,这是一种部署能力的欠缺。在更多的场合下,管理员需要面对大量物理服务器(或者虚拟机),这时如果要实现基于docker-compose的容器自动化编排与部署,管理员就得借助成熟的自动化运维工具(ansible、puppet、chef、saltstack)来负责管理多个目标主机,将docker-compose所需的所有资源(配置文件、用户代码)交给目标主机,然后在目标主机上执行docker-compose指令。
  2. 同样网络和存储也比较棘手,Docker不能提供跨宿主机的网络,完全面向Docker daemon的docker-compose当然也不支持。这意味着管理员必须部署一套类似于Open vSwich的独立网络工具,而且管理员还需要完成集成工作。当好不容易把容器编排都安排妥当之后,又会发现容器还处在内网环境中,于是负载均衡、服务发现等一堆问题就面临而来了,这些问题很快能消耗掉工程师所有的耐心。

那么,是否有一种能够提供完善的面向服务器集群的Docker编排和部署方案呢?Docker官方给出的答案是Compose同Machine和Swarm联动,其实还有大家近期经常听到了kubernetes(k8s)。后期笔者会更新出这些内容和大家一起来讨论。

原文地址:http://blog.51cto.com/ganbing/2083806

时间: 2024-07-31 09:24:55

docker:编排与部署小神器>>Compose概念篇的相关文章

部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了

部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 ? momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Docker+Harbor(或 Pouch 等同类平台)之上都不好意思说自己的互联网公司.当然这些技术也不适用于全部公司,技术在迭代,平台也一样,把我使用的工具和大家分享下,一起成长(文章中扩展可按需Google). Docker docker的架构图如下: 从图中可以看出几个组成部分 docker c

深入浅出Docker(四):Docker的集成测试部署之道

1. 背景 敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心.迭代.循序渐进的开发理念.在这样的场景下引入Docker技术,首要目的就是使用Docker提供的虚拟化方式,给开发团队建立一套可以复用的开发环境,让开发环境可以通过Image的形式分享给项目的所有开发成员,以简化开发环境的搭建.但是,在没有Docker技术之前就已经有类如Vagrant的开发环境分发技术,软件开发者一样可以创建类似需求的环境配置流程.所以在开发环境方面,Docker技术的优势并不能很好

在Docker容器中部署Web应用

本文直接讲解如何在Docker容器中实战部署一个Web应用程序,关于Docker相关的概念和如何安装Docker请参考相关资料完成. 第一步:工具准备 演示如何在Docker容器中部署一个Java Web应用程序,需要准备的软件工具包括:jre,tomcat和webapp应用.另外,为了实现在容器启动时自动启动webapp,需要编写一个脚本工具完成该工作. 安装jre,请参考:http://www.wikihow.com/Install-Java-on-Linux 安装tomcat,请参考:ht

基于Jenkins,docker实现自动化部署(持续交付)

前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此,传统的人工部署已经心有余而力不足.持续集成,持续部署,持续交互对于微服务开发来说,是提高团队整体效率不可或缺的一环.合理的使用CI,CD能够极大的提高了生产效率,也提高了产品的交互质量.本文不对三个概念做过多的介绍,有兴趣可以读读这篇文章:The Product Managers' Guide to

Docker私有仓库部署和管理

Docker私有仓库部署和管理 本章结构: Harbor介绍 部署Harbor所依赖的Docker Compose服务 部署Harbor服务 Harbor日常操作管理 Harbor管理生命周期 Harbor介绍 Harbor是VMware公司开源的企业级Docker Registry项目 Harbor的优势 基于角色控制 基于镜像的复制策略 支持LDAP目录服务/AD域服务 图像删除和垃圾收集 图形UI(可以访问Web界面) 审计 RESTful API Harbor架构组成 Proxy: 通过

Docker 入门 到部署Web 程序

最近阿里的面试官问我Docker是做什么用的,我记得之前360和美团,京东的都问过,但是一直没时间看,最近有时间了,系统的学习了一下Docker,在此做一下记录,方便各位看官学习交流 一.Docker概述: Docker: 本意是码头工人,言外之意是集装箱: Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码: Docker是:“一次封装,到处运行”,因为docker决绝了应用环境的问题,安装了docker的平台就能跑“doc

spring-boot项目的docker集成化部署(一)

目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker集成化部署 前言 据说流行的微服务和docker一起,更配哦!接下来,使用简单spring-boot项目演示docker的集成化部署的案例,在看过微笑的博客觉得不过瘾,自己动手,下面的方案与Devops的方式比较接近:希望搭建理解这种思路. 基本思路与方案 开发者push到git服务器 Jenkin

Docker集群部署SpringCloud应用

docker环境准备 # linux下的安装,自行百度 # windows docker toolbox下载地址 https://download.docker.com/win/stable/DockerToolbox.exe # 创建myvm3 这个虚拟机内存尽量大,6g以上最好 # https://0eenj1uv.mirror.aliyuncs.com这个是阿里云加速器的地址. docker-machine create --virtualbox-memory "6144" --

基于docker、kubernetes部署openstack到atomic系统上

声明: 本人阅读笔记,翻译类文章仅作意译.如有不对之处,请指出. 需要更本源的理解,请自行阅读英文. 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! 基于docker.kubernetes部署openstack到atomic系统上 openstack的服务定义,是不是看起来很简洁? openstack的实际组件构成,是不是看起来很复杂? 所有的openstack