docker:编排与部署小神器Compose

1.docker-compose是什么

Compose是定义和运行多容器Docker应用程序的工具。 使用Compose,您可使用YAML文件来配置应用程序的服务。 而后,使用单个命令,您能够建立并启动配置中的全部服务。php

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

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

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

尚未彻底理解的朋友,用通俗的语言来讲:nginx

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

docker:编排与部署小神器Compose
从上图能够看到,这位compose哥们很是开心的把N多个容器抓在一块儿,根据本身的心情来编排部署。github

2.谈谈容器编排与部署

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

 Dockerfile做为整个机制的核心。这是一个很是了不得的创新,由于在Dockerfile中,不但可以定义使用者在容器中须要进行的操做,并且可以定义容器中运行软件须要的配置,因而软件开发和运维终于可以在一个配置文件上达成统一。运维人员使用同一个Dockerfile能在不一样的场合下“重现”与开发者环境中如出一辙的运行单元(Docker容器)出来。docker

2.1为何要使用Compose

docker:编排与部署小神器Compose
 先来想一下咱们平时是怎么样使用docker的?把它进行拆分一下:数组

一、docker search 镜像,是否是先查找一个镜像;
二、docker run -itd 镜像名称 ,而后在运行这个镜像;
三、而后若是你要在运行第二个镜像、第三个镜像.....等等镜像,你是否是又要docker search、docker run运行。服务器

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

 可是咱们写在 docker-compose.file 里面就很好了。你只须要写好后只运行一句:
docker-compose up -d

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

2.2了解下编排和部署

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

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

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

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

3.一探究竟~~ Compose原理

docker-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服务来更好的理解它。

4.compose编排LNMP服务

4.1 yaml

YAML是一种标记语言,可读性很强。相似于XML数据描述语言,语法比XML简单的多。YAML数据结构经过缩进来表示,连续的项目经过减号来表示,键值对用冒号分融,数组用括号括起来,hash用花括号括起来。详细了解的朋友能够参考 YAML百度百科 https://baike.baidu.com/item/YAML/1067697?fr=aladdin

YAML文件格式注意事项:

  1. 在缩排中空白字符的数目并非很是重要,只要相同阶层的元素左侧对齐就能够了(不过不能使用TAB字符);
  2. 一般开头缩进2个空格;
  3. 字符的后面缩进1个空格,好比冒号、逗号、横杆;
  4. 支持#注释;
  5. 容许在文件中加入选择性的空行,以增长可读性;

docker-compose中YAML经常使用的字段:

docker:编排与部署小神器Compose

4.2 目录结构

咱们先来看下所须要的文件、目录结构是怎样的:

[root@ganbing /]# tree  compose_lnmp/
compose_lnmp/
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf
│   └── data
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.1.tar.gz
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   ├── php-5.6.31.tar.gz
│   └── php.ini
└── wwwroot
    ├── index.html
    └── index.php

其实看过笔者 docker:Dockerfile构建LNMP平台 这篇文章的朋友,应该对这个目录结构很熟悉,是否是发现nginx、php这两个目录和我以前写的《docker:Dockerfile构建LNMP平台》中的目录结构是同样的,无非这里多了两个目录:
mysql目录>>conf目录>>my.cnf(mysql默认配置)
mysql目录>>data目录(用于后期挂载到mysql容器)

wwwroot目录>>index.html和index.php这两个首页,用于部署成功后进行访问测试

4.3 安装docker-compose

下载最新版本安装,下载时间可能比较长

[root@ganbing ~]# curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

[root@ganbing ~]# chmod  +x /usr/local/bin/docker-compose

或者用pip安装:pip install docker-compose

docker-compose用法

Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

docker-compose经常使用命令:
build  构建或重建服务
kill   杀掉容器
logs  显示容器的输出内容
port  打印绑定的开放端口
ps   显示容器
pull  拉取服务镜像
restart 重启服务
rm  删除中止的容器
run  运行一个一次性命令
scale 设置服务的容器数目
exec 在容器里搪行命令
start 开启服务
stop 中止服务
up  建立并启动容器

其实这些经常使用命令用docker的命令功能是同样的。

4.4 一键部署lnmp平台

咱们先来看下/compose_lnmp目录下的docker-compose.yml文件:

[root@ganbing compose_lnmp]# ls
docker-compose.yml  mysql  nginx  php  wwwroot

[root@ganbing compose_lnmp]# cat docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: ganbing
      MYSQL_PASSWORD: ganbing123

networks:
  lnmp:

能够看到一份标准配置文件应该包含 version、services、networks 三大部分,共有三级标签,每一级都是缩进两个空格。下面来详细说明一下里面的内容:

  1. version: '3'
    这是定义compose的版本号为version 3,能够参考官方文档详细了解具体有哪些版本 https://docs.docker.com/compose/compose-file/

  2. services:
    nginx:这是services下面的二级标签,名字用户本身定义,它将是服务运行后的名称;
    hostname: nginx 这是定义容器的主机名,将写入到/etc/hostname中;
    build:
     context: ./nginx 指定nginx服务的上下文路径;
     dockerfile:Dockerfile 指定经过上面指定路径中的Dockerilfe来构建;
    ports:
     - 80:80 端口映射没什么好说的;
    networks:
     -lnmp 指定的网络环境
    volumes:把宿主机的/wwwroot目录绑定到容器中的/usr/local/nginx/html目录;

php:这个二级标签服务和下面的内容跟nginx差很少;

mysql:这个二级标签服务也和nginx、php差很少,惟一不一样的是多了个images标签、还有定义了些环境变量。
image: mysql:5.6 它是经过mysql:5.6镜像来构建mysql服务器,前面nginx、php都指定了上下文经过Dockerfile来构建的。
environment:
 MYSQL_ROOT_PASSWORD:定义root用户密码变量为123456;
 MYSQL_DATABASE:定义了数据变量为wordpress;
 MYSQL_USER:定义了普通用户变量为ganbing;
 MYSQL_PASSWORD:定义了普通用户密码变量为ganbing123;

三、networks:
   lnmp: 至关于执行docker network create lnmp命令了;

最后来运行docker-compose命令来启动:

[root@ganbing /]# cd compose_lnmp/

[root@ganbing compose_lnmp]# docker-compose  -f docker-compose.yml  up -d

来查看一下是否启动完成:

[root@ganbing compose_lnmp]# docker-compose ps
       Name                      Command               State           Ports          
-------------------------------------------------------------------------------------
composelnmp_mysql_1   docker-entrypoint.sh --cha ...   Up      0.0.0.0:3306->3306/tcp 
composelnmp_nginx_1   ./sbin/nginx -g daemon off;      Up      0.0.0.0:80->80/tcp     
composelnmp_php_1     ./sbin/php-fpm -c /usr/loc ...   Up      9000/tcp

从上面能够看出这3个服务都是UP状态,运行 docker-compose ps必需要在有docker-compose.yml文件目录下执行才能够。

一样,还能够用docker ps来查看:
docker:编排与部署小神器Compose

在来访问一下nginx服务index.html静态页面,经过暴露的nginx 80端口来访问:
docker:编排与部署小神器Compose

在前面咱们在docker-compse.yml中的nginx服务把宿主机/wwwroot绑定到了容器/usr/local/nginx/html目录中,因此咱们能够修改下宿主机中/wwwroot/index.html的内容来验证一下:

[root@ganbing /]#echo "add test" >> /compose_lnmp/wwwroot/index.html

修改而后测试能够看到index.html修改了:
docker:编排与部署小神器Compose

接下来访问下index.php页面是否正常,从下面能够看到也是没问题的:
docker:编排与部署小神器Compose

既然用docker-compose编排部署LNMP平台搞定了,只要你弄懂了原理和方法,用docker-compose编排部署其它服务也是同样的,只不过是思路的问题。

5.总结思考

  你们想一想,仅仅使用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)。后期笔者会更新出这些内容和你们一块儿来讨论。

喜欢个人文章,请点击最上方右角处的《关注》支持一下!

相关文章
相关标签/搜索