首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Docker教程:Docker Compose入门

了解如何使用Docker的本地服务配置和部署工具来测试和调试多容器应用程序。

容器意味着在现代软件堆栈中提供组件隔离。 将数据库放在一个容器中,将Web应用程序放在另一个容器中,并且可以将它们全部缩放,管理,重新启动并独立换出。 但是开发和测试一个多容器应用程序并不像一次使用一个容器。

Docker Compose由Docker创建,用于简化开发和测试多容器应用程序的过程。 这是一个令人想起Docker客户端的命令行工具,它接收一个特殊格式的描述符文件,将应用程序从多个容器中组装出来,并在单个主机上一起运行。 (Docker Swarm或Kubernetes等工具在多台主机上部署多容器应用程序。)

在本教程中,我们将逐步介绍定义和部署一个简单的多容器Web服务应用程序所需的步骤。 虽然Docker Compose通常用于开发和测试,但它也可用于部署生产应用程序。 为了讨论这个问题,我们将专注于开发和测试场景。

Docker Compose示例

最小的Docker Compose应用程序由三个组件组成:

1. 要构建的每个容器镜像的Dockerfile。

2. Docker Compose将用于从这些镜像启动容器并配置其服务的YAML文件docker-compose.yml。

3. 构成应用程序本身的文件。

在我们的示例中,我们将创建一个测试Web消息系统,使用Bottle web框架以Python编写,并配置为将数据存储在Redis中。 如果在生产应用程序中使用,这将是可怕的不安全和不切实际(更不用说动力不足!)。 但关键是要展示这些作品是如何融合在一起的,并为你提供一个可以自己进一步充实的骨架。

要一次获得所有部分,请下载并将此docker-compose-example.zip(http://www.infoworld.com/cms/mediaResource/asset?id=156685)文件解压缩到工作目录中。 将需要安装最新版本的Docker; 我使用了17.12.01版本,这是当时最新的稳定版本。 请注意,本教程应该适用于Docker for Windows,Docker for Mac以及Docker的传统Linux版本。

包中包含的Dockerfile非常简单:

FROM python:3

ENV PYTHONBUFFERED1

ADD./code

ADD requirements.txt/code/

WORKDIR/code

RUN pip install-r requirements.txt

CMD python app.py

这组命令描述了一个使用stock python:3镜像作为其基础的镜像,并使用两个文件(都包含在.zip包中):requirements.txt和app.py. 前者被Python用来描述应用程序的依赖关系; 后者是Python应用程序本身。

docker-compose.yml文件的元素值得仔细检查:

version:‘3’

services:

redis:

image:redis

web:

build:.

command:python3 app.py

volumes:

-.:/code

ports:

-“8000:8000”

depends_on:

-redis

version行指定要使用的Docker Compose文件格式的版本。 Docker Compose经过了多次修订,每次修订都与特定版本的Docker引擎相关联; 版本3是本文的最新版本。

services部分定义了此特定容器堆栈使用的各种服务。 在这里,我们定义了两个服务:redis(使用redis容器映像运行Redis服务)和web(我们的Python应用程序)。 每个服务描述符都提供有关服务的详细信息:

1. build:描述构建时应用的配置。它可以只是一个路径名,如这里所示,或者它可以提供诸如Dockerfile之类的细节(而不是目录中的默认Dockerfile)或参数在构建过程中传递给Dockerfile。

2. command:启动容器时运行的命令。这将覆盖容器的Dockerfile中提供的CMD语句(如果有的话)。

3. volumes:要为此服务装入的卷的任何路径。您还可以将卷指定为顶级配置选项,并在docker-compose.yml文件中重复使用跨多个容器定义的卷。

4. ports:容器的端口映射。您可以使用如此处所示的简单格式,或更详细的描述使用哪种协议的格式。

5. depends_on:描述服务之间的依赖关系的顺序。在这里,因为Web依赖于Redis,所以当Docker Compose启动应用程序时,必须首先调用Redis。

服务中还有更多可用的选项,但这几个足以让一个基本项目开始。

基本的Docker Compose命令

将示例应用程序解压到工作目录后,下一步就是构建它并使其作为单个基本实例运行。 通过这个过程,我们可以了解Docker Compose的大部分主要命令,并了解它们在项目上下文中的使用方式。

请注意,所有这些命令都从包含docker-compose.yml文件的目录以及该项目的其他文件运行。

docker-compose build

第一个使用新的Compose项目运行的命令build,根据项目的Dockerfile为需要从头开始构建的项目组装任何图像。 在这种情况下,依赖于图像的项目的任何部分(Redis)都不在此处处理。

构建过程的结果会回传给控制台。 如果一切顺利,你应该在键入时在本地镜像列表中看到新镜像:

为我们的示例应用程序成功运行docker-compose构建的输出。 请注意Dockerfile中的每个步骤是如何详细记录的。

docker-compose up

up命令设置网络并从堆栈中的所有映像启动容器,如docker-compose.yml文件中所述。 请注意,如果需要本地不存在的镜像,则会在此阶段停用。

容器运行后,将看到正在运行的容器的详细信息回传到控制台。 控制台仍然连接到容器,因此您可以通过按Ctrl-C来停止正在运行的应用程序堆栈。

应用程序启动完成后,将Web浏览器指向http:// localhost:8000。 将看到一个原始消息应用程序的网页,允许您为三个人(David,Krista和Adi)中的任何一个人留言并阅读发送给他们的消息。 Web前端由Python脚本提供; 数据在Redis中被保存为简单的键值对。

docker-compose down

down命令取消用于运行应用程序的容器和网络组件。 运行docker-compose之后按Ctrl-C可终止所有运行的实例,但不执行任何清理。 当您希望停止并删除通过运行创建的网络,卷和映像时(例如,在一天的测试会话结束时,或者清除桌面以使用新应用程序时),可以使用它。

docker-compose up --no-start

如果你想设置一个Docker Compose应用程序,但你不想启动它(例如,如果你想以非交互方式运行它)使用--no-start而不是刚刚启动。 最初,Docker Compose有一个叫做create的命令来执行这个功能,但它已经被弃用了,以支持使用--no-start标志。

docker-compose up --scale

如果你想在启动应用程序时启动多个服务副本,则可以使用deploy在Docker Compose文件中声明它,或者在运行Compose时使用--scale开关。 我们的应用程序不需要此功能,但当你需要测试运行多个服务实例的应用程序的行为时,--scale开关可派上用场。

docker-compose start/restart/stop/pause/unpause

启动,重新启动和停止命令允许启动,重新启动或停止已使用up -–no --start命令准备好的Docker Compose应用程序。 在执行时,他们立即将控制台的控制权交还给用户,而不是将控制台附加到容器上。 暂停和取消暂停命令允许您暂停和继续执行容器,而不是完全停止或重新启动它们。

额外的Docker Compose命令

其他一些Docker Compose命令对调试或监视正在运行的应用程序很有用:

• config:验证并转储用于当前项目的Docker Compose文件。 这会让你在尝试构建或部署过程之前清除它包含的任何可能的错误。

• events:流式传输到项目中每个容器的控制台事件。 使用--json标志将结果打印为JSON(对于ad hoc管道到文件中很有用)。

• port:在正在运行的服务实例上打印端口绑定的公共端口。 如果您需要发现连接哪个端口以获取服务,这很有用。

最后,许多其他命令(如exec,images,logs,kill,rm,ps,pull,push和top)都会与你在Docker主客户端中找到的相同功能相呼应。

Docker Compose和分布式应用程序包

一旦你创建了使用Docker Compose创建的多容器应用程序,下一步就将投入生产。正如Dockerfile可以内置到映像中以创建容器一样,Docker Compose文件可以内置到映像中以创建整个应用程序堆栈。

Docker的最新版本引入了分布式应用程序包或DAB的概念。这个特性仍然被认为是实验性的,可以让你从Docker Compose文件创建一个DAB,该文件可以作为分布式多容器应用程序部署到Docker Swarm集群。

要生成DAB,首先将创建的容器图像推送到注册表,以便稍后可由任何运行应用程序的系统获取它们。然后使用Compose文件在目录中运行docker-compose包。这将产生一个可以部署到Docker Swarm或其他支持DAB格式的服务的映像。

如何进行下一步将取决于你计划如何部署生产应用程序。例如,Docker Swarm就像Docker Enterprise一样直接接受Docker Compose应用程序。另一方面,Kubernetes不支持Docker Compose格式,但有工具可将Docker Compose文件转换为Kubernetes Resources文件并生成其他Kubernetes工件。

无论你的生产目的地是什么,当你继续开发多容器Docker应用程序时,你创建的Docker Compose文件将继续对测试有用,这也是最重要的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180227A1FIVX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券