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

简介: 这篇文章是 Windows Dockerfile 系列文章中的一篇,我将介绍使用 Docker Compose 在 Docker 中运行、管理和升级分布式应用程序。 今天我将为大家带来本文的第二部分内容:使用 Docker Compose 在 Docker 中管理和升级分布式应用程序。

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!


这篇文章是 Windows Dockerfile 系列文章中的一篇,我将介绍使用 Docker Compose 在 Docker 中运行、管理和升级分布式应用程序。 今天我将为大家带来本文的第二部分内容:使用 Docker Compose 在 Docker 中管理和升级分布式应用程序。点击下方标题,查看第一部分内容:

- Docker Compose 实战教学,教您如何运维分布式应用程序(一)


用 Compose 部署和管理应用程序

Docker Compose简单易用。 它与 Docker Desktop for Windows 捆绑在一起,您可以使用 Chocolatey 来安装 Docker Compose。

您可以使用“docker-compose”命令行和 Compose YAML 文件来管理您的应用程序。 使用关键命令“up”来部署应用程序、“down”来停止应用程序并删除所有容器以及“build”来构建镜像。

要使用 Compose 来运行应用程序,只需克隆镜像仓库,导航到该目录并使用“docker-compose up”命令即可:

git clone https://github.com/sixeyed/docker-on-windows.git

cd ./docker-on-windows/ch06/ch06-docker-compose

docker-compose up -d

如果未指定文件名,Compose 将查找名为 docker-compose.yml 的文件。 此目录中的 YAML 文件定义了 Docker Hub 上的公开镜像,如果您本地没有该镜像,那么 Compose 将提取 Docker Hub 上的公开镜像。

然后 Compose 按正确的顺序启动所有服务的容器来维护依赖关系。 Compose 中的“–d”命令与容器中的“docker container run - it”命令相同,都是在后台启动该容器。

该 docker-compose.yml 文件未指定任何服务的规模,因此它们都将使用默认值启动,即每个服务分配一个容器。Compose 文件是所需的状态,当你运行“up”时,Compose 会查看 Docker 引擎中的实际状态并创建它到达该状态时所需的状态。

使用“docker container ls”命令来检查正在运行的容器,您可以在这看到整个应用程序堆栈。所有容器都是由 Compose 生成的名称,并将当前目录名称添加到服务名称中,如下图所示:

screenshot

您可以使用 Compose 扩展应用程序的组件,前提是组件能够在多个实例中运行而不会相互影响。 消息处理程序设计为可以在动态环境中扩展运行,因此我们可以轻松地对扩展它们:

docker-compose up -d `  

 --scale nerd-dinner-save-handler=3 `

 --scale nerd-dinner-index-handler=2

这将为 Elasticsearch 索引处理程序添加第二个容器,为 SQL Server 保存处理程序添加另外两个容器。 它们正在运行连接到 NATS 的消息处理程序,由于它们是为扩展而设计的,因此它们将共享消息处理负载。


用 Compose 升级应用程序

您可以使用 Docker Compose 和新的 docker-compose-db-upgrade.yml 文件(浏览 https://github.com/sixeyed/docker-on-windows/blob/master/ch06/ch06-docker-compose/docker-compose-db-upgrade.yml 查看完整代码)来部署更新:

docker-compose -f docker-compose-db-upgrade.yml up -d

Compose 重新创建了数据库服务,删除了旧容器并从新镜像标签运行一个新的容器。新容器连接到与旧容器相同的卷,因此 SQL Server 中的所有数据都会保留,并且在数据库容器启动脚本运行时会添加新列。

数据库容器启动脚本请查看:https://github.com/sixeyed/docker-on-windows/blob/master/ch06/ch06-nerd-dinner-db/Initialize-Database.ps1

还有一些定义为依赖于数据库服务的其他服务,因为数据库服务的更改,因此也会重新创建这些服务。在这种情况下,Compose 还会将消息处理程序服务缩减为每个容器。

为什么 Compose 缩减了我已经明确扩展的服务呢?因为 Compose 文件是所需状态,并且我的更新文件没有指定任何服务规模,所以默认值为1。 当 Compose 看到运行状态规模过大时,它将删除容器来使服务符合所需状态。

这是将声明性部署与 Compose 文件混合并使用 –scale 选项进行命令式部署的副作用。

最好坚持声明性部署并通过 Compose 文件进行所有更新。该 Compose 文件与您的 Dockerfiles 和应用程序源一起处于源代码控制中。


用 Compose 覆盖拆分关注点

您还可以将应用程序定义拆分成多个 Compose 文件。拆分关注点非常方便,您可以将开发和生产的部署选项列入到单独的文件中,并为核心应用程序定义提供一个主要的文件。

以下就是我将应用程序定义拆分成的多个 Compose 文件:

  • “docker-compose.yml”定义了核心应用程序服务,其中包含适用于每种环境的选项;
  • “docker-compose.build.yml” 为自定义的 Docker 镜像添加了构建定义。这可以用于在开发人员和 CI 管道中的 docker-compose build,但在其他场景中不适用。将它放在一个单独的文件中可以保持核心 Compose 文件的整洁;
  • “docker-compose.local.yml” 添加了在本地运行应用程序的选项,将容器端口发布到主机上的随机端口;
  • “docker-compose.production.yml” 为生产部署添加配置,指定明确的端口进行发布和为卷映射主机目录;

用“-f”将多个文件组合在一起,如果这些文件具有相同配置部分的值,那么最新的文件将覆盖最早的文件。

因此,为了构建整个应用栈,我将运行:

docker-compose `  

 -f docker-compose.yml `

-f docker-compose.build.yml `

build

并在本地运行:

docker-compose `  

 -f docker-compose.yml `

-f docker-compose.local.yml `

up -d

这是构建应用程序定义的一种很好的方法,在一个地方设置所有环境,但每个环境的详细信息是独立的。

最后,您可以使用 Compose 文件将应用程序部署到生产环境。

相关文章
|
12天前
|
存储 监控 安全
【专栏】Docker Compose:轻松实现容器编排的利器
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
20天前
|
安全 Linux Nacos
使用Docker运行Nacos并安装cpolar内网穿透工具实现远程访问
使用Docker运行Nacos并安装cpolar内网穿透工具实现远程访问
|
1天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
1天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
1天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
7 0
|
2天前
|
数据可视化 Linux Docker
如何使用Docker部署Dashy并无公网ip远程访问管理界面
如何使用Docker部署Dashy并无公网ip远程访问管理界面
5 0
|
3天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
3天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
5天前
|
数据库 Docker 容器
Docker版TDengine2.6升级到Tdengine3.0
请注意,这些步骤提供了一般的升级指南。具体的升级过程可能因你的环境和配置而异。在进行升级之前,建议查阅TDengine官方文档和Docker镜像的相关文档,以获取更详细的升级和配置信息。
18 5
|
7天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
91 16
探秘Redis分布式锁:实战与注意事项