Docker Compose 实战教学,教您如何运行、管理和升级分布式应用程序(一)

简介: 整个 Compose 文件供有87行(包括了空行)。这是描述分布式应用程序的 一种非常有效的方式,该应用程序使用 Nano Server 和 Windows Server Core 运行了8个服务......

screenshot

出品丨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”应用栈所需要的全部内容。

相关文章
|
弹性计算 监控 开发者
利用Docker容器化构建可移植的分布式应用程序
利用Docker容器化构建可移植的分布式应用程序
153 0
|
3月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
276 0
|
消息中间件 Kafka 网络安全
淘东电商项目(49) -ELK+Kafka分布式日志收集(docker下搭建kafka)
淘东电商项目(49) -ELK+Kafka分布式日志收集(docker下搭建kafka)
102 0
|
6月前
|
Java Maven 流计算
在Docker跑通Flink分布式版本的WordCount
在Docker跑通Flink分布式版本的WordCount
60 0
|
6月前
|
Java 大数据 流计算
使用Docker快速部署Flink分布式集群
使用Docker快速部署Flink分布式集群
749 0
|
6月前
|
并行计算 PyTorch Docker
LLaMA-Factory 基于docker的大模型多卡分布式微调
LLaMA-Factory是微调工具,包含Dockerfile和train.sh脚本,适用于多卡训练。Dockerfile基于nvidia/cuda:12.1.0镜像,安装Python 3.10、PyTorch 2.2.0、transformers等库。train.sh运行Docker容器,使用accelerate launch进行训练,参数包括模型路径、学习率、优化器设置等。注意使用--shm-size 32G --gpus all,并可选启用unsloth加速。默认配置文件设定了分布式训练和混合精度BF16。
2019 1
|
6月前
|
SQL 调度 数据库
Docker部署Xxl-Job分布式任务调度中心(超详细)
Docker部署Xxl-Job分布式任务调度中心(超详细)
|
6月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
93 0
|
6月前
|
Java 调度 Docker
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
|
6月前
|
Ubuntu 调度 数据安全/隐私保护
使用Docker部署开源分布式任务调度系统DolphinScheduler
使用Docker部署开源分布式任务调度系统DolphinScheduler
使用Docker部署开源分布式任务调度系统DolphinScheduler