了解如何使用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文件将继续对测试有用,这也是最重要的。
领取专属 10元无门槛券
私享最新 技术干货