Docker化运维方式讲解

简介: 应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器、机房、环境间迁移。迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等。 应用迁移的核心需求是: 简单。迁移操作必须足够简单, 没有学习成本, 点击一下即可。 快速。迁移过程能在极短的时间内完成。 无损。迁移之后应用与原应用一模一样, 不丢失任何配置和数据。迁移之后应用功能和业务逻辑与原部署应
docker

应用迁移需求

应用运维需要考虑的一个重要问题就是迁移, 在不同机器、机房、环境间迁移。迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等。

应用迁移的核心需求是:

简单。迁移操作必须足够简单, 没有学习成本, 点击一下即可。

快速。迁移过程能在极短的时间内完成。

无损。迁移之后应用与原应用一模一样, 不丢失任何配置和数据。迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险。

许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发挥现代操作系统和硬件的能力, 部分原因也是受制于应用迁移技术不成熟, 不能保证快速无损迁移应用, 不敢迁移。

具备快速迁移的能力, 同样可将应用快速切换到任意版本, 实现快速回滚。

 

tomcat webapp 部署结构

我们看一下一个基于 tomcat 部署的 java webapp 应用部署结构如下:

apache-tomcat-8.0.35/ ├── bin/ ├── conf/ ├── lib/ ├── logs/ ├── temp/ ├── webapps/ ├── work/ ├── LICENSE ├── NOTICE ├── RELEASE-NOTES └── RUNNING.txt

其主要分为两个部分:

  1. 静态二进制文件。包含 bin/, lib/。这部分是三方软件包 tomcat 自带的内容。对应用而言, 这部分内容是只读访问的, 不会修改。
  2. 外部配置和数据。包含 conf/, logs/, temp/, webapps/, work/。这里的“外部”是指从 tomcat 软件包的角度来看, 对应用来说, 这部分才是真正的应用软件包。

注意: tomcat 软件包也包含 conf/。但应用可能会对 conf/ 进行修改, 所以应用使用了一个独立维护的 conf/ 副本, 而不是 tomcat 软件包自带的 conf/ 内容。

很显然, 要迁移这个应用, 只需要迁移第 2 部分, 即外部配置和数据即可。为了简化迁移, 许多应用被设计为无状态的, 即 logs/, temp/, work/ 等外部数据目录不包含任何影响应用功能的配置或数据, 这部分内容不需要迁移。只需要迁移 conf/, webapps/ 目录, 这部分内容可打包为应用软件包。

这样, 在新环境部署应用, 只需要安装 tomcat 软件包和应用软件包即可。

 

新环境部署

在新环境上完成应用部署, 有两种玩法:

  1. 列一个软件包清单 (如上例中的 tomcat 和应用), 在新环境上按照清单完成软件包安装, 这是 juju 的玩法。
  2. 将所有软件包安装好并打包成一个二进制镜像, 拷贝到新环境上部署运行, 这是 docker 的玩法。Dockerfile 描述如何创建镜像, 类似于软件包清单。

docker 镜像不止是预安装软件包, 还包含基础操作系统环境, 统一的日志、数据路径, 环境变量等标准化应用运行环境。这可难不倒 juju, juju 同样基于一个标准镜像创建 vm 或 lxc 容器, 再安装软件包, 同样提供标准化的运行环境。这两种方式各有优缺点, 在此不作深究。但就使用成本来说, docker 目前在国内外发展火热, 技术和实践经验相对成熟, 更容易使用。

 

单机多实例隔离部署

使用 docker 应用容器部署应用, docker 容器为应用提供了标准一致且相互独立的运行环境, 这样应用使用相同的配置和路径, 也可以在单个宿主机上实现多实例部署。与 vm 的单机单部署模式相比, 应用容器要做的足够轻, 消除 vm 的额外开销, 并且完美支持微服务编排。

 

软件包与配置分层

有些软件包很好的实现了软件包默认配置与应用自定义配置的分离, 如 tomcat, 只需指定 CATALINA_BASE 目录与 CATALINA_HOME 目录分开, 将应用部署到 CATALINA_BASE 下, 即可实现应用自定义配置和 tomcat 软件包默认配置分离, 两者独立维护, 互不影响。

许多软件包没有实现这样的能力, docker 通过分层文件系统解决这个问题, 同时可以避免每个软件包都去考虑设计配置分离功能。

应用自定义配置在软件包安装层的上层, 运行容器时覆盖默认配置, 但在软件包安装层升级软件包时看不到应用自定义配置, 不会受应用自定义配置影响。需要注意的是, 软件包升级后是否兼容旧的应用自定义配置, 是否需要更新自定义配置, 需要应用负责人关注和测试。

按照 docker 的分层设计思想, 越基础越固定不变的东西越要放到底层, 越容易变化的东西越要放到上层, 因此应用依赖的软件包和基础配置要放到底层, 可以独立为一个 base 镜像, 应用本身和自定义配置放在上层。如果应用本身或配置更新更频繁, 可将这两者再分成两层。

 

配置管理

假设我们要修改一个应用配置, 一种方式是登陆一台机器修改, 测试 ok 后将修改同步到所有其他机器。这种方式很原始并且缺乏监管, 容易出错。比如新扩容了 100 台机器每台都要更新一遍, 如果操作有遗漏, 哪些机器配置已经更新, 哪些机器还是旧的配置也缺乏监管。

按 docker 的玩法, 应该是先更新镜像, 测试 ok 后分发镜像到所有机器更新容器。docker 监管了所有容器部署的镜像版本和容器状态, 从而可以很方便的检查哪些容器更新了, 哪些没有更新。对于很少变化的静态配置, 应该固化到镜像中。

对于一些经常变化的配置, 重新打镜像和更新容器成本太高, 应该设计成预定义的开关, 使用开关平台进行监控和管理, 或者使用 diamond 等配置管理平台管理。

 

docker 容器数据卷

docker 容器内的文件系统伴随容器而生, 销毁或更新容器时 (如升级镜像或修改容器配置), 原有数据将会丢失。并且受分层文件系统设计影响, 其性能可能更差(与存储引擎实现有关)。

因此, 需要持久化保存的配置和数据, 或有高写性能要求的, 如 logs/, data/ 等外部数据目录, 应使用 docker 数据卷 挂载到宿主机上。

Dockerfile 中使用 VOLUME 指定容器中需要挂载为数据卷的目录列表。

 

docker 化运维方案

综上所述, docker 化运维需要将应用拆分为 3 部分:

  1. 基础环境, 应用所有依赖, 应用软件包和静态配置, 固化到镜像。
  2. 需要动态修改的配置, 通过开关平台或 diamond 等配置平台进行管理。
  3. 需要持久化保存或频繁写需求的配置或数据目录, 挂载为数据卷。

部署运维时, 使用 docker 分发镜像, 配置平台推送配置, 即可实现应用快速部署、迁移、更新、回滚、扩缩容等运维操作。

源文http://www.xiongge.club/705.html

目录
相关文章
|
1月前
|
存储 运维 安全
构建高效自动化运维体系:Ansible与Docker的完美结合
【2月更文挑战第31天】 随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性和提升部署效率的关键手段。本文将详细探讨如何通过Ansible和Docker的结合来构建一个高效、可靠且易于管理的自动化运维体系。首先,介绍自动化运维的必要性及其在现代IT基础设施中的作用;然后,分别阐述Ansible和Docker的技术特点及优势;最后,提供一个基于Ansible和Docker结合使用的实践案例,以及实施过程中遇到的挑战和解决方案。
|
1月前
|
运维 Kubernetes 监控
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【2月更文挑战第30天】 在当今快速发展的云计算时代,传统的IT运维模式已难以满足业务的敏捷性和稳定性需求。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理工具构建一个高效、可靠的自动化运维体系。文章首先概述了容器化技术和微服务架构的基本概念,随后详细阐述了基于Docker的应用打包、部署流程,以及Kubernetes在自动化部署、扩展和管理容器化应用中的关键作用。最后,文中通过案例分析,展示了如何在实际场景中利用这些技术优化运维流程,提高系统的整体效率和可靠性。
|
1月前
|
运维 安全 网络安全
构建高效自动化运维体系:Ansible与Docker的完美融合
【2月更文挑战第30天】在当今快速迭代和持续部署的软件发展环境中,自动化运维成为确保效率和稳定性的关键。本文将探讨如何通过结合Ansible和Docker技术,构建一个高效的自动化运维体系。我们将分析Ansible的配置管理功能和Docker容器化的优势,并展示它们如何协同工作以简化部署流程,增强应用的可移植性,并提供一致性的系统环境。此外,文章还将介绍一些最佳实践,帮助读者在真实环境中实现这一整合方案。
|
9月前
|
SQL 关系型数据库 MySQL
docker 部署spug运维神器
如果没有外网可以先在一台有外网的机器上把镜像build好并save,然后把镜像传到局域网的机器。
297 1
|
25天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的最佳实践
在现代云计算环境中,自动化运维成为保障系统稳定性与提升效率的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes容器编排工具构建一个高效、可靠的自动化运维体系。文中不仅介绍了相关的技术原理,还结合具体案例分析了实施过程中的常见问题及解决方案,为读者提供了一套行之有效的最佳实践指南。
|
2月前
|
运维 Linux Docker
Linux运维工程师必须要掌握的Docker命令,我给你整理好了!
Linux运维工程师必须要掌握的Docker命令,我给你整理好了!
169 2
|
2月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速迭代的软件开发周期中,确保应用的一致性、可移植性与易于管理成为了开发与运维团队面临的重大挑战。本文旨在介绍如何通过Docker容器技术,有效地解决这些问题,特别是针对Java应用。我们将从Docker的基本概念出发,逐步深入到实际操作,展示如何将传统的Java应用容器化,以及这一过程如何帮助简化部署流程、提高应用的可靠性和可伸缩性。不同于常规的技术文章,本文试图以一种更加易于理解和实践的方式,让读者能够快速掌握容器化技术,并将其应用于日常的开发与运维工作中。
90 0
|
2月前
|
消息中间件 运维 应用服务中间件
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
171 0
|
2月前
|
运维 Java 持续交付
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速发展的软件开发领域,持续集成与持续部署(CI/CD)已成为提高开发效率和软件质量的关键。本文将探讨如何利用Docker容器技术,实现Java应用的高效部署与运维。我们将从Docker的基本概念入手,详细介绍如何将传统的Java应用容器化,并通过实际案例展示容器化带来的便利性和高效性。此外,文章还将探讨Docker容器与传统虚拟机部署方式的对比,以及如何在实际项目中选择最适合的部署策略。通过本文,读者将能够深入理解Docker容器化技术,并学会如何在自己的Java项目中实施和优化。
227 1
|
2月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在快速迭代与持续集成的开发周期中,如何确保Java应用的一致性、高效部署及易于管理成为了开发与运维团队面临的重大挑战。本文将探讨Docker容器技术如何为Java应用提供一种轻量级、可移植的解决方案,实现环境一致性、简化配置过程并提高开发到生产的流程效率。我们将从Docker的基本概念入手,通过实例详细说明如何将传统的Java应用容器化,以及如何利用Docker Compose来管理多容器应用,最后探讨在使用Docker部署Java应用时的最佳实践和常见问题解决策略。
255 1