出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!
这篇文章是 Windows Dockerfile 系列文章中的一篇,我将介绍使用 Docker Compose 在 Docker 中运行、管理和升级分布式应用程序。 今天我将为大家带来本文的第一部分内容:使用 Docker Compose 在 Docker 中运行分布式应用程序。浏览 https://github.com/sixeyed/docker-on-windows 查看本系列教程的完整源码。
用 Docker Compose 组织分布式应用程序
我将在 Docker 中运行现有的 .NET Framework 应用程序、打包新的 .NET Core 应用程序以及在容器中使用第三方应用设计策略。
您可以使用 Docker 来分解整体并为应用程序添加新功能,那么您就需要对许多容器之间存在的依赖关系进行管理。本文用了8个容器运行了现代化版本的 “Nerd Dinner”ASP.NET 应用。
我使用 PowerShell 脚本来运行所有容器,但这只是一个简单的选项,您可以将重点放在容器正在执行的操作上。只要在您的应用中存在多个容器,那么您就可以使用 Docker Compose 来管理它们。
Docker Compose 是一个独立于普通 Docker CLI 的客户端。它使用 YAML 文件来定义所需的应用程序状态,并调用 Docker API 来部署应用程序。
Docker Compose 文件的语法非常简单,是定义分布式应用程序结构的好方法。可以将 Dockerfile 视为应用程序每个组件的部署指南,将 Compose 文件视为整个应用程序的部署指南。
您可以在单节点的 Docker 环境中以及群集中使用 Docker Compose 文件。因此,使用 Docker Desktop 的开发人员可以使用相同的应用程序定义在 Docker Enterprise 中进行生产。
用 Docker Compose 定义分布式应用程序
您可以根据服务而不是容器在 Compose 中定义应用程序。服务将作为容器进行部署,但服务可以是单个容器的多个实例,因此除了管理主机上的容器之外,它还是一种抽象概念。
下面是运行在 Windows 容器中的现代化版本的“Nerd Dinner”应用程序的完整 Compose 文件片段:
version: '3.3'
services:
message-queue:
image: nats:nanoserver
networks:
- nd-net
elasticsearch:
image: sixeyed/elasticsearch:nanoserver
environment:
- ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- es-data:c:\data
networks:
- nd-net
下面我将对上述 Compose 文件进行详细讲解:
- “version”是 Docker Compose 的架构版本,不同版本的 Docker 和 Docker Compose 文件所支持的功能是不同的;
- “services” 是应用程序中所有组件的顶级集合。每个组件都有自己的服务定义;
- “nats” 服务是最简单的,它定义了要使用的 Docker 镜像,并将服务容器连接到 Docker 网络。“nats”是服务的名称,在 Docker 的 DNS 服务器中使用。所以,当容器查找“nats”主机名时,Docker 将返回该服务容器的 IP 地址;
- “elasticsearch” 服务拥有要使用的 Docker 镜像,并且它会连接到相同的 Docker 网络中。但它还可以指定要在容器中显示的“environment”变量,以及要附加的 Docker “volumes”。它们相当于 docker 容器运行命令中的“-e”和“-v”命令;
Compose 文件中的下一个服务是针对于数据库的:
nerd-dinner-db:
image: dockeronwindows/ch03-nerd-dinner-db
env_file:
- db-credentials.env
volumes:
- db-data:C:\data
networks:
- nd-net
“nerd-dinner-db” 是现代化版本的“Nerd Dinner”应用程序的 SQL Server 数据库。它有一个数据卷,它使用一个环境文件作为其环境变量。
Compose 文件功能强大,因为它可以让您使用所需的所有选项配置服务,而且 YAML 文件简单易读。 最长的服务定义是针对“Nerd Dinner” ASP.NET 的网站:
nerd-dinner-web:
image: dockeronwindows/ch05-nerd-dinner-web
ports:
- "80:80"
environment:
- HOMEPAGE_URL=http://nerd-dinner-homepage
- MESSAGE_QUEUE_URL=nats://message-queue:4222
env_file:
- api-keys.env
- db-credentials.env
depends_on:
- nerd-dinner-homepage
- nerd-dinner-db
- message-queue
networks:
- nd-net
它还包括发布“ports”端口以及在“depends_on”部分中发布该服务所需的其他服务。
整个 Compose 文件供有87行(包括了空行)。这是描述分布式应用程序的 一种非常有效的方式,该应用程序使用 Nano Server 和 Windows Server Core 运行了8个服务,并同时运行了 Go、Java、Node.js 和 .NET 组件。
注:完整的 Compose 文件,请到 https://github.com/sixeyed/docker-on-windows/blob/master/ch06/ch06-docker-compose/docker-compose.yml 处查看。
值得一提的是依赖关系。在 Docker Desktop 中,Compose 文件将以正确的顺序启动容器来实现依赖关系。但它不适用于动态的集群环境,因为如果有某些容器具有排序需求,那么集群就会受到太多限制。
可以回顾我在 DockerCon 2018 中的演讲视频,了解在 Docker 中管理分布式应用程序的依赖关系的正确方法。
视频地址:https://dockercon2018.hubs.vidyard.com/watch/w1gCK5PSt3JuGBLLELH9WG
这个只有87行的 compose 文件就是您在本地运行整个现代化版本的“Nerd Dinner”应用栈所需要的全部内容。