当前位置: 首页 > news >正文

从0到1实现项目Docker编排部署

在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身。Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署、扩展和管理。自 2013 年推出以来,Docker 迅速发展成为现代软件开发和运维领域不可或缺的重要工具。

Docker 采用容器技术,将应用程序及其所有依赖项封装在一起,从而确保它们能够在不同环境中一致地运行。与传统的虚拟化技术(如虚拟机)相比,Docker 的容器更轻量级,启动时间也显著缩短。这一优势使得开发者能够更高效地进行应用程序开发和测试,尤其是在快速迭代和频繁发布的场景中。

随着 DevOps 思潮的兴起,开发与运维之间的界限变得日益模糊,Docker 在这一转变中提供了强有力的技术支持。然而,随着项目规模的扩大和复杂性的增加,Docker 容器的数量也随之增长,这就引发了对 Docker 编排的需求。

Docker 编排(Orchestration)指的是管理和协调多个 Docker 容器的工具和技术,其主要目的是简化容器的部署、扩展和管理流程。通过编排,用户可以更轻松地管理复杂的应用程序架构,确保各个组件能够高效协同工作。

因此,本文将为读者提供一份从零开始部署 Docker 编排项目的实用指南,帮助您掌握这一关键技术,提升应用程序管理的效率和灵活性。

项目准备

在本节中,我们将以 Java 项目为例,假设您已经拥有一个微服务架构的项目。整体项目结构可能会如下所示:

image

接下来,我们将逐步开始构建 Docker 容器,并按照一系列系统化的步骤来实现这一过程。

核心概念

我们首先将对一些基本概念进行详细解释,包括 Dockerfile、Docker 构建命令以及 docker-compose.yml 文件的基本概念介绍。理解这些概念后,我们将进入实际操作环节,通过实践加深对这些工具的掌握。

Dockerfile

Dockerfile 是一个文本文件,它包含了一系列构建 Docker 镜像所需的指令。这些指令不仅定义了镜像的基础环境,还详细描述了应用程序的安装步骤、所需的依赖关系、配置的环境变量,以及其他必要的设置。例如:

# 使用一个基础镜像
FROM maven:3.8.3-openjdk-17 AS builder# 设置工作目录
WORKDIR /app# 复制 pom.xml 和源代码
COPY pom.xml .
COPY src ./src# 构建项目
RUN mvn clean package# 使用一个轻量级的基础镜像运行应用
FROM openjdk:17-jdk-slim# 设置工作目录
WORKDIR /app# 从构建阶段复制 JAR 文件
COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar ./myapp.jar# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "myapp.jar"]

接下来,我们需要将这个配置应用到我们的项目中。为了演示的方便,我们使用了自定义的文件名称来启动项目,这样可以更清晰地展示每个步骤的具体过程。当然,你也可以选择使用默认的文件名,这样操作会更加简单直接。无论你选择哪种方式,最终的效果都是一样的。如下图所示:

image

构建命令

docker build 是构建 Docker 镜像的核心命令,它用于将 Dockerfile 中定义的指令转换为可执行的镜像。在执行这个命令时,你可以使用一系列可选参数,以便更好地定制构建过程。

docker build [OPTIONS] PATH | URL | -

PATH:指定包含 Dockerfile 的上下文路径。通常是当前目录(.)或具体的目录路径。

URL:可以是 Git 仓库的 URL,Docker 会从该地址获取 Dockerfile。

-:表示从标准输入读取 Dockerfile。

常用选项有以下这些:

  • -t, --tag:为镜像指定一个名称和标签。例如:-t myapp:latest。

  • -f, --file:指定 Dockerfile 的路径。

  • --no-cache:在构建时不使用缓存,确保每个步骤都从头开始运行。

  • --target:如果 Dockerfile 中定义了多阶段构建,可以通过这个选项指定要构建的目标阶段。

docker-compose.yml 文件

docker-compose.yml 文件是用于定义和运行多个 Docker 容器的配置文件,它使得管理应用程序的服务、网络和数据卷变得更加简便和高效。通过这个简单的 YAML 文件,你可以在一个统一的配置中描述整个应用的架构,使得容器的启动、停止和管理变得一目了然。在我们的示例程序中,我们包含了 MySQL 服务。

尽管我们本地已经有一个独立的 MySQL 实例,但为了更好地演示如何同时运行多个 Docker 容器,我们选择将 MySQL 作为一个 Docker 容器来启动。此外,值得一提的是,MySQL 已经有官方提供的预构建镜像,这意味着我们无需花费额外的精力去构建和配置数据库,直接使用现成的镜像即可。

现在,让我们开始这一过程吧!

version: '3.8'services:app:image: ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest  # 替换为你的 Java 应用镜像ports:- "18080:18080"  # 映射端口environment:SPRING_DATASOURCE_URL: jdbc:mysql://db:13306/agent?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8SPRING_DATASOURCE_USERNAME: userSPRING_DATASOURCE_PASSWORD: passworddb:image: mysql:5.7  # 使用 MySQL 5.7environment:MYSQL_ROOT_PASSWORD: root_password  # 设置 root 用户密码MYSQL_DATABASE: agent  # 创建数据库MYSQL_USER: user  # 创建新用户MYSQL_PASSWORD: password  # 新用户密码ports:- "13306:13306"  # 映射 MySQL 端口volumes:- db_data:/var/lib/mysql  # 数据持久化volumes:db_data:  # 定义一个数据卷

你可以通过运行 docker-compose up 命令来启动所有在 docker-compose.yml 文件中定义的服务。

开始构建

假设我们已经将代码项目成功从仓库部署到了服务器上,接下来,我们就可以直接在服务器上进行操作了。如果你还没有安装过 Docker,可以先自行安装,过程并不复杂。

完成安装后,只需进入项目根目录,并执行相应的命令即可开始使用。

docker build -t my-java-app -f demo.dockerfile .

构建过程的具体步骤和流程如图所示:

image

我们可以耐心等待接下来的步骤完成,因为此时的过程与生产环境已经非常相似。接下来,我们只需将最终构建的镜像推送到我们的私有仓库中,以便进行后续的部署和管理。

镜像仓库

当然,公司的私有仓库地址是必不可少的。在这里,我们以腾讯云的容器镜像服务为例,来展示如何进行镜像的存储和管理。

推送私库

之前我们已经详细讲解过如何创建私有仓库的步骤,因此在此不再赘述。现在,我们可以直接将构建好的镜像推送到仓库中,以便进行后续的使用和管理。

image

接下来,我们将对我们的镜像进行标签操作,完成标签操作后,我们将镜像推送到私有仓库中,以便于后续的部署和使用。

sudo docker tag my-java-app:latest ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

sudo docker push ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

最后推送成功如下:

image

image

容器编排

接下来,我们将使用编排文件来定义和管理所需的服务。为了实现这一目标,我们需要在指定的目录下创建一个名为 docker-compose.yaml 的文件。该文件的内容将与我们之前展示的配置保持一致。

创建完文件后,我们将直接执行启动命令,来验证我们的配置是否正确,并观察各个服务是否能顺利启动。

docker-compose -f spring-ai.yaml up -d

image

最后看下日志,我们成功启动:

image

总结

通过本文,我们深入探讨了 Docker 的核心概念及其编排技术的重要性。从 Docker 的轻量级容器架构到其在现代 DevOps 环境中的应用,Docker 不仅提高了开发和部署的效率,还使得多容器管理变得更加高效。我们逐步介绍了 Dockerfile、构建命令及 docker-compose.yml 文件的使用,帮助读者掌握如何构建和管理微服务架构。

在具体操作中,我们以 Java 项目为例,通过实用的示范引导,展示了如何在本地环境中构建和部署 Docker 容器。随着项目规模的扩大,掌握 Docker 编排将显得尤为重要,它不仅简化了容器管理流程,还增强了应用的灵活性和可扩展性。希望本文所提供的指南对你有所帮助。

文章转载自:努力的小雨

原文链接:https://www.cnblogs.com/guoxiaoyu/p/18474742

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

从0到1实现项目Docker编排部署

在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身。Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署、扩展和管理。自 2013 年推出以来,Docker 迅速发展成为现代软件开发和运维领域不可或缺的重要工具。 Docker 采…...

Vue框架入门

Author:Dawn_T17?? 目录 什么是框架 一.Vue 的使用方向 二.Vue 框架的使用场景 (TIP)MVVM思想 三.Vue入门案例 TIP:插值表达式 四.Vue-指令? (1)v-bind 和 v-model? ? (2&#x…...

vue入门实战(二)父子组件显示,参数传递

经过上次的写法&#xff0c;我们已经写出每个list项&#xff0c;现在要在每个父组件下面加入自己的子项 一、新建子组件&#xff1a; smallItem.vue&#xff1a; <script> export default{props:[text,id,status] //父组件传来的参数 } </script> <template>…...

【Linux】Ubuntu:安装系统后配置

hostname&#xff1a;更改主机名 打开终端。 使用hostnamectl命令更改主机名。 sudo hostnamectl set-hostname 新的主机名你可以使用hostnamectl 命令来验证更改是否成功&#xff1a; hostnamectlChrome&#xff1a;更换默认浏览器 以下是从 Ubuntu 中移除预装的 Snap 版 Fi…...

springboot-查看版本和版本所需JDK

文章目录 访问spring管网查看springboot 项目查看当前版本查看版本所需JDK 访问spring管网 https://spring.io/ 查看springboot 项目 查看当前版本 点击调整到参考文档中去… 查看版本所需JDK...

fuxa搭建与使用(web组态)

1. 安装Node.js -> npm安装 参考网址&#xff1a;https://blog.csdn.net/WHF__/article/details/129362462 一、安装运行 C:WINDOWSsystem32>node -v v20.17.0 C:WINDOWSsystem32>npm -v 10.8.2 二、环境配置 在安装路径&#xff08;D:Program_Files odejs&#x…...

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库&#xff08;非关系型数据库&#xff09;&#xff0c;以文档&#xff08;Document&#xff09;的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…...

C语言期末考试——常见考题(模拟考)

目录 一、填空题&#xff08;每空2分&#xff0c;共 20 分&#xff09; 二、选择题&#xff08;每题2分&#xff0c;共26分&#xff09; 三、编程题&#xff08;第1题6分&#xff0c;其余题目每题10分&#xff09; &#xff01;&#xff01;&#xff01;需要答案的可以私信&…...

流量过滤与路径转发控制

1&#xff0c;策略路由 PBR基本概念&#xff1a; 策略路由&#xff0c;使网络设备不仅能够基于报文的目的IP地址进行数据转发&#xff0c;也能基于其他元素进行转发&#xff0c;比如源IP地址、MAC地址 可以使用ACL匹配特定的报文&#xff0c;针对该ACL进行PBR部署 PRB策略的…...

Ungoogled Chromium127编译指南 Windows篇 - 获取源码(七)

1. 引言 在完成所有必要工具的安装和配置后&#xff0c;我们进入了Ungoogled Chromium编译过程的第一个关键阶段&#xff1a;获取源代码。本文将详细介绍如何正确获取和准备Ungoogled Chromium的源代码&#xff0c;为后续的编译工作打下基础。 2. 准备工作 2.1 环境检查 在…...

k8s 之 StatefulSet

深入理解StatefulSet&#xff08;一&#xff09;&#xff1a;拓扑状态 k8s有状态与无状态的区别 无状态服务&#xff1a;deployment Deployment被设计用来管理无状态服务的pod,每个pod完全一致.什么意思呢? 无状态服务内的多个Pod创建的顺序是没有顺序的. 无状态服务内的多…...

iPhone 17 Air基本确认,3个大动作

近段时间&#xff0c;果粉圈都在讨论一个尚未发布的新品&#xff1a;iPhone 17 Air&#xff0c;苹果又要来整新活了。 从供应链消息来看&#xff0c;iPhone 17 Air本质上是Plus的替代品&#xff0c;主要是在维持“大屏”这一卖点的同时&#xff0c;增加了“轻薄”属性&#xff…...

鸿蒙实现应用通知

目录&#xff1a; 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…...

ElasticSearch常见的索引_集群的备份与恢复方案

方案一&#xff1a;使用Elasticsearch的快照和恢复功能进行备份和恢复。该方案适用于集群整体备份与迁移&#xff0c;包括全量、增量备份和恢复。 方案二&#xff1a;通过reindex操作在集群内或跨集群同步数据。该方案适用于相同集群但不同索引层面的迁移&#xff0c;或者跨集…...

vue图片之放大、缩小、1:1、刷新、左切换、全屏、右切换、左旋咋、右旋转、x轴翻转、y轴翻转

先上效果&#xff0c;代码在下面 <template><!-- 图片列表 --><div class"image-list"><img:src"imageSrc"v-for"(imageSrc, index) in images":key"index"click"openImage(index)"error"handleI…...

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…...

“pinn是无网格的”???

“pinn是无网格的”&#xff1f;&#xff1f;&#xff1f; PINN&#xff0c;即物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff09;&#xff0c;是一种将物理定律作为先验知识整合到神经网络训练过程中的方法。它之所以被称为“无网格”的&#xff0c;…...

换一个ip地址是什么意思?换一个网络ip地址会变吗

在网络的世界里&#xff0c;IP地址如同每台设备的“身份证”&#xff0c;是确保网络信息能够准确传输到指定目标的关键。然而&#xff0c;在某些情况下&#xff0c;我们可能需要更换这个“身份证”&#xff0c;也就是更换IP地址。那么&#xff0c;换一个IP地址究竟是什么意思&a…...

JavaWeb学习--cookie和session,实现登录的记住我和验证码功能

目录 &#xff08;一&#xff09;Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​&#xff08;Cookie的生命&#xff09; &#xff08;二&#xff09; Cookie的API 1.创建Cookie&#xff1a;new 构造方法 2.保存到客户端浏…...

深度学习:基于MindSpore的极简风大模型微调

什么是PEFT&#xff1f;What is PEFT&#xff1f; PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结&#xff0c;只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...