一:docker-compose 简介
Docker Compose的前身是Fig,它是一个定义及运行多个Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系( link,网络容器-net-from或数据容器-volume-from)按先后顺序启动所定义的容器。
Compose是Docker 的服务编排工具,主要用来构建基于Docker的复杂应用,Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
Compose适用于所有环境:生产,开发,测试以及CI工作流程。使用Compose基本上是个三步过程:
1:使用Dockerfile定义应用程序的环境,以便在任何地方进行复制。e
2:在docker-compose.yml.中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
3:运行docker-compose开始并运行整个应用程序。
docker-compose官方文档: https://docs.docker.com/compose/overview/e
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, dockerrun运行。
上面" docker run -itd镜像名称“这只是最小的动作,如果你要映射硬盘,设置nat,网络或者映射端口等等。就要做更多的docker操作,这显然是非常没有效率的,况且如果你要大规模部署,是不是觉得就很麻烦了。
但是我们写在 docker-compose里面就很好了。你只需要写好后只运行一句;edocker-compose up -d
三:编排和部署
编排,即 orchestration,它根据被部署的对象之间的耦合关系,以及被部署对象环境的依赖,制定部署流程中各个动作的执行顺序,部署过程所需要的依赖文件的存储位置和获取方式,以及如何验证部署成功。这些信息都会在编排工具中以指定的格式(比如配置文件或者特定的代码)来要求运维人员定义并保存起来,从而保证这个流程能够随时在全新的环境中可靠有序地重现出来。
部署,即 deployment,它是指按照编排所指定的内容和流程﹐在日标机器上执行编排指定环境初始化,存放指定的依赖和文件,运行指定的部署动作,最终按照编排中的规则米确认联署成功。<
这么来解释吧,编排是一个指挥家,他的大脑里存储了整个乐曲的演奏流程,对于每一个小节每一段音乐的演奏方式、开始、结束他都了然于胸;部署就是整个乐队,他们严格按照指挥家的意图用乐器来完成乐谱的执行,在需要时开始演奏,又在适当的时机停止演奏。最终,两者通过协作就能把每一位演奏者独立的演奏通过组合、重叠、衔接来形成高品位的交响乐。
四: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 如何实现上述编排与部署的原理,下面和大家分享一个通过compose来编排部署LNMP服务来更好的理解它。
五:compose 应用案例
1:安装docker-compose
《1》:rz
《2》:mv docker-compose /usr/bin/
《3》:chmod +x /usr/bin/docker-compose
《4》: docker-compose version
2:docker-compose用法
docker-compose [-f <arg> …] [options][COMMAND][ARGS…]
docker-compose 常用选项
- --verbose 输出更多调试信息
- --version 打印版本并推迟
- -f,--file FILE 使用特定的compose版本文件,默认为docker-compose.yml
- -p,--project-name NAME 指定项目名称,默认使用目录名称
docker-compose 常用命令
- build 构建或重建服务
- kill 杀掉容器
- logs 显示容器的输出内容
- port 打印绑定的开发端口
- PS 显示容器
- pull 拉取服务镜像
- restart 充气服务
- rm 删除停止的容器
- run 运行一个一次性命令
- scale 设置服务的容器数目
- exec 切换到容器内
- start 开发服务
- stop 停止服务
- up 创建并启动容器
其实这些常用命令跟docker的命令功能是一样的 。
3:Yaml 简介
YAML是一种标记语言,可读性很强。类似于XML 数据描述语言,语法比 XML简单的多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分割,数组用括号插起来,hash 用花括号插起来。
YAML文件格式注意事项:
在缩排中空白字符的数日并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
- 通常开头缩进2个空格;c
- 字符的后面缩进1个空格,比如冒号、逗号、横杆;
- <支持#注释;
- 允许在文件中加入选择性的空行,以增加可读性;
《1》:rz
《2》:unzip compose_lnmp-190606.zip
《3》:cd compose_lnmp/
《4》: ls
《5》:cat nginx/run.sh
《6》:rz
《7》:docker load < mysql_5.6.tar
《8》:cd compose_lnmp/
《9》:docker-compose up -d
《10》:验证