Docker Compose简介

2,101 阅读5分钟

在之前的文章中我们介绍了Docker相关的基础知识以及如何创建一个镜像并以一个容器实例来运行这个镜像;众所周知,目前微服务的开发模式逐渐成为主流的开发模式,在我们的实际开发流程中,大概开发流程是这样的,首先我们针对特定业务需求完成一个微服务的开发工作,然后我们利用docker将微服务打包成一个镜像(image), 然后将镜像发布到我们的私有镜像仓库中,最后我们可以在多个环境中以容器的形式来运行这个镜像。如果针对一个微服务的部署这种方式看起来还算不错,但是现实开发中我们开发的绝对不是一个微服务,因此我们将面对的可能是多个微服务的部署工作,针对多个微服务的部署如果我们还按照以上的方式来进行,那对于运维人员来说会有很多重复性的工作,针对这种情况,Docker内置的Compose组件为我们解决了这个问题。在实际动手操作之前让我们先了解一下compose的定义。

Compose定义:

compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docker官方给Compose的定位是:Defining and running multi-container Docker applications,其前身是开源项目Fig。在之前的介绍中,我们可以通过Dockerfile模板文件来定义一个单独的应用容器。但是在我们实际的开发过程中,我们经常会碰到需要多容器相互配合来完成某项任务,针对这种情况compose应运而生。它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

在Compose中有一个非常重要的概念:服务。

在分布式应用中,应用的不同部分称为"服务"。例如,假设有一个视频共享网站,它可能提供用于在数据库中存储应用程序数据的服务,用于在用户上传一些内容后在后台进行视频转码的服务,用于前端的服务等。在Compose中一项服务仅运行一个镜像,但它会编制镜像的运行方式:例如使用的端口,容器的多少个从节点应运行才能使服务的容量满足其需求等。扩展服务就是更改运行该软件的容器实例数,并将多个计算资源分配给进程中的服务。所有以上这些设置我们都可以通过定义一个docker-compose.yml(该文件与Dockerfile文件不同,Dockerfile文件必须命名为Dockerfile,而该文件的文件名可以自行定义,官方给的命名为docker-compose,我们就用官方的命名规则来命名)文件来实现。

Compose的安装:

Docker Desktop for Windows 和 Docker Toolbox已经包含了对Compose组件的安装,因此我们不必再单独进行安装,我们可以通过使用docker-compose --version指令来查看当前机器上的compose版本,如图所示:


编写docker-compose.yml文件

该部分会用到之前文章中已经push到docker hub镜像仓库中的镜像文件。让我们来创建第一个docker-compose.yml文件,文件内容如下图所示:


该文件中主要定义了以下几项:

version定义了我们当前compose文件格式的版本。

Services是服务的根节点,下方定义的就是我们要包含在这个compose中的所有的服务,本次示例我们只包含一个服务,web表示的是我们定义的服务的名称,大家可以根据自己service的含义来命名。

image表示的是当前service的镜像仓库地址

ports表示的是将容器的80端口与主机的5000端口mapping

networks表示的是配置容器连接的网络

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

我们进入到该文件所在的目录,并在cmd中通过docker指令docker-compose up来执行该文件,如图所示:


我们通过浏览器访问http://localhost:5000,如图所示:


这样我们就通过compose发布并运行了我们的一个service(一个镜像的容器实例)

大家可能已经意识到目前我们在compose文件中定义的内容和单独执行docker run指令其实是没有太大区别的,确实在compose中定义的单个服务的相关指令关键字和docker run指令中包含的关键字在含以上都是类似的,但是通过执行docker run指令一次只能创建出来一个image的一个容器实例,通过compose我们可以创建出来一组容器实例,我们管每一个容器实例叫做一个service,而compose正是对这一个个service进行了编排,包括service之间的依赖关系,启动顺序,所需要消耗的资源等等。在本篇我们只是单独的介绍了compose的基本用法和基本指令,大家可以通过地址对更多的compose关键字进行学习。

希望本篇文章能够更好的帮助大家理解docker compose的概念。如果有任何问题都可以给我留言。

注意: 由于google对定义的yml文件格式要求的十分严格,因此大家在编写自己的yml文件时一定要格外小心注意,这里给大家提供一个在线的yml文件格式校验器,大家可以对自己的yml文件进行校验。

相关资料:

yeasy.gitbooks.io/docker_prac…


上一篇(标记本地镜像并上传到镜像库中)

下一篇(Docker Swarm Mode简介)