1. 课程引言

在前面的章节中,我们已经完成了电商项目核心服务的开发。然而,开发完成只是项目生命周期的一部分,如何将这些服务高效、可靠地部署到生产环境,是决定项目成败的关键一步。本章将聚焦于服务的部署,重点介绍当前最主流的容器化技术——Docker,并探讨如何使用Docker来打包、分发和运行我们的微服务。

2. 传统部署方式的痛点

在容器化技术普及之前,应用部署通常直接在物理机或虚拟机上进行。这种方式存在诸多痛点:

  • 环境不一致:开发、测试、生产环境的配置(如操作系统、依赖库版本)可能存在差异,导致“在我电脑上能跑”的问题频发。
  • 资源隔离性差:多个应用在同一台机器上运行时,可能会因资源竞争(CPU、内存)或依赖冲突而相互影响。
  • 部署效率低:应用的部署、迁移和扩容过程复杂且耗时,难以适应快速迭代的业务需求。
  • 运维成本高:需要投入大量精力来管理和维护服务器的运行环境。

3. Docker核心概念

Docker的出现革命性地解决了上述问题。它是一个开源的应用容器引擎,可以将应用及其所有依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。

  • 镜像 (Image):一个只读的模板,包含了运行应用所需的一切:代码、运行时、库、环境变量和配置文件。镜像是创建容器的基础。
  • 容器 (Container):镜像的运行实例。容器之间相互隔离,拥有自己的文件系统、网络和进程空间。可以被启动、停止、删除。
  • 仓库 (Repository):集中存放镜像文件的地方。最著名的公共仓库是Docker Hub,我们也可以搭建私有仓库。

3.1 Dockerfile:定义你的应用环境

Dockerfile是一个文本文件,包含了一系列指令,用于自动化地构建一个Docker镜像。通过Dockerfile,我们可以将应用环境的配置代码化,实现环境的标准化和版本控制。

示例:为cloudmall-product服务编写Dockerfile

# Dockerfile for cloudmall-product# 1. 指定基础镜像
# 使用一个包含Java 8运行环境的轻量级镜像
FROM openjdk:8-jre-alpine# 2. 设置工作目录
WORKDIR /app# 3. 将应用的jar包复制到容器中
# TARGET_DIR 和 JAR_NAME 是构建时的参数
ARG TARGET_DIR=target
ARG JAR_NAME=cloudmall-product-0.0.1-SNAPSHOT.jar
COPY ${TARGET_DIR}/${JAR_NAME} /app/app.jar# 4. 声明容器对外暴露的端口
EXPOSE 8001# 5. 定义容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

4. Docker实战:容器化商品服务

接下来,我们将以上述Dockerfile为例,演示如何将cloudmall-product服务打包成Docker镜像并运行。

4.1 准备工作

  1. 安装Docker:请根据你的操作系统,参考Docker官方文档进行安装。

  2. 打包Spring Boot应用:在项目根目录执行Maven命令,将cloudmall-product模块打包成jar文件。

    # 在cloudmall父工程目录下执行
    mvn clean package -DskipTests -pl cloudmall-product -am
    

4.2 构建Docker镜像

cloudmall-product模块的根目录下创建Dockerfile文件,并将上面的示例内容粘贴进去。然后执行以下命令构建镜像:

# -t: 指定镜像的名称和标签,格式为 <repository>:<tag>
# .: 指定Dockerfile所在的路径为当前目录
docker build -t cloudmall/product:v1.0 .

构建成功后,可以通过docker images命令查看本地的镜像列表。

4.3 运行Docker容器

使用docker run命令来启动一个容器:

# -d: 后台运行容器
# -p: 端口映射,格式为 <宿主机端口>:<容器端口>
# --name: 指定容器的名称
docker run -d -p 8001:8001 --name product-service cloudmall/product:v1.0

现在,商品服务就在Docker容器中运行起来了。我们可以通过访问http://localhost:8001(或Docker宿主机的IP)来测试服务是否正常。

5. 使用Docker Compose编排多服务

在微服务架构中,一个应用通常由多个服务组成。手动管理每个服务的容器非常繁琐。Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过一个docker-compose.yml文件,我们可以配置应用的所有服务,然后使用一条命令即可启动或停止所有服务。

示例:docker-compose.yml编排用户和商品服务

version: '3.8'services:# 商品服务product-service:image: cloudmall/product:v1.0container_name: product-serviceports:- "8001:8001"networks:- cloudmall-net# 用户服务 (假设也已打包成镜像 cloudmall/user:v1.0)user-service:image: cloudmall/user:v1.0container_name: user-serviceports:- "8002:8002"networks:- cloudmall-net# ... 此处可以继续定义Nacos, Redis, MySQL等其他依赖服务networks:cloudmall-net:driver: bridge

将上述内容保存为docker-compose.yml文件,然后在该文件所在目录执行:

# 启动所有服务
docker-compose up -d# 停止并移除所有服务
docker-compose down

6. 章节总结

本章我们从传统部署的痛点出发,学习了容器化技术Docker的核心概念与巨大优势。我们重点掌握了如何使用Dockerfile为Spring Boot应用构建标准化的运行环境,并成功将商品服务容器化。最后,我们了解了如何使用Docker Compose来简化多服务应用的编排和管理。容器化是通向云原生和高效运维的必经之路,为后续学习Kubernetes等更高级的服务编排技术打下了坚实的基础。

##7 资源下载

本章的示例代码可以从以下链接下载:
微服务开发课程第16-26章的源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92042.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92042.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣148:排序链表

力扣148:排序链表题目思路代码题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 思路 当我们第一眼看见这道题时心中其实是有思路的&#xff0c;我们不想这是个链表就当它是一个整型数组。那么自然而然就会想到各种各样的排序方法&#xf…

基于k8s环境下的pulsar常用命令(下)

#作者&#xff1a;Unstopabler 文章目录permissionSchemapermission pulsar的权限控制是在namespace级别的 kubectl exec pulsar-toolset-0 -n pulsar – bin/pulsar-admin namespaces grant-permission mytenant/mynamespace –actions produce,consume –role admin10 注…

2.4 组件通信

Props 和 Events&#xff08;父子组件通信&#xff09;Props&#xff1a;父组件向子组件传递数据使用 props。子组件通过声明 props 来接收来自父组件的数据。<!-- 父组件 --> <template><ChildComponent :message"parentMessage" /> </templat…

PCL学习之路-基础知识-(一)

文章目录1.西门子S7系列PLC类型划分(1).大型PLC&#xff1a;S7-400(2).中型PLC&#xff1a;S7-300(3).小型PLC&#xff1a;S7-200系列2.西门子S7外形结构(1).总览&#xff1a;PLC的“器官”分工逻辑3.输出电路(1).小型继电器输出形式(2).大功率晶体管/场效应管输出形式(3).双向…

leetcode654:最大二叉树(递归与单调栈双解法)

文章目录一、 题目描述二、 核心思路&#xff1a;分而治之与递归构造三、代码实现与深度解析四、 关键点与复杂度分析五、拓展解法单调栈解法两种解法对比LeetCode 654. 最大二叉树&#xff0c;【难度&#xff1a;中等&#xff1b;通过率&#xff1a;82.6%】&#xff0c;这道题…

Python 循环语法详解

在编程中&#xff0c;循环是一种非常常见的控制结构。很多时候&#xff0c;我们需要重复做一些事情&#xff0c;比如遍历列表、处理数据、尝试直到成功等。这时候&#xff0c;就离不开循环了。Python 提供了两种主要的循环结构&#xff1a;for 循环 和 while 循环。本篇文章会从…

一个小巧神奇的 USB数据线检测仪

一个小巧的数据线检测仪&#xff0c;检测各种USB数据线是否损坏、通断&#xff0c;TYPE_C、MICRO_B、苹果线、烧录线、网线都可检测。嵌入式开发者的称手工具。 这个是我个人制作的&#xff0c;SMT和连接器比较贵&#xff0c;特别是24PIN的C口连接器&#xff0c;我挂在黄色小鱼…

37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action

在第二部分&#xff08;微服务基础工具与技术&#xff09;中我们讲解了GitHub Action的相关知识&#xff0c;那么在这一节中&#xff0c;我们将为已有的微服务增加GitHub Action的支持。 一、什么是GitHub Action 虽然前面已经介绍过GitHub Action的相关知识&#xff0c;但这里…

ROS2 通过 命令行 发布速度控制指令 控制 麦克娜姆轮

在 ROS2 中&#xff0c;要通过命令行发布速度控制指令来控制麦克娜姆轮机器人&#xff0c;你需要知道机器人所使用的速度控制话题和消息类型。通常麦克娜姆轮机器人使用geometry_msgs/Twist消息类型来接收速度指令。 以下是通过命令行发布速度控制指令的方法&#xff1a; 首先确…

多层Model更新多层ListView

一、总体架构QML (三层 ListView)└─ C 单例 DataCenter (QQmlContext 注册)├─ L1Model (一级节点)│ └─ 内部持有 QList<L2Model*>│ └─ L2Model (二级节点)│ └─ 内部持有 QList<L3Model*>│ └─ L3Model (三级节…

Git基础操作教程

本文目的是掌握Git基础操作教程一、Git简介Git&#xff1a;分布式版本控制系统&#xff0c;使用仓库(Repository)来记录文件的变化最流行的版本控制系统有两种&#xff1a;集中式&#xff08;SVN&#xff09;、分布式&#xff08;Git&#xff09;二、Git操作1.创建仓库仓库(Rep…

Android 之 Kotlin

变量变量的声明Kotlin使用var&#xff0c;val来声明变量&#xff0c;注意&#xff1a;Kotlin不再需要;来结尾var 可变变量&#xff0c;对应java的非final变量var b 1val不可变变量&#xff0c;对应java的final变量val a 1两种变量并未声明类型&#xff0c;这是因为Kotlin存在…

Design Compiler:布图规划探索(ICC)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 在Design Compiler Graphical中&#xff0c;可以用布图规划探索(Floorplan Exploration)功能&#xff0c;打开IC Compiler进行布图规划的创建、修改与分…

《蓝牙低功耗音频技术架构解析》

《2025GAS声学大讲堂—音频产业创新技术公益讲座》低功耗蓝牙音频系列专题LE Audio & Auracast™专题讲座第1讲将于8月7日周四19点开讲&#xff0c;本次邀请了蓝牙技术联盟 技术与市场经理 鲁公羽 演讲&#xff0c;讲座主题&#xff1a;《蓝牙低功耗音频技术架构解析》。&…

ubuntu apt安装与dpkg安装相互之间的关系

0. 问题解释 在linux系统中&#xff0c;使用neofetch命令可以看到现在系统中使用dpkg, flatpak, snap安装的包的数量&#xff0c;那么使用apt安装的包被统计在什么位置了呢&#xff0c;使用apt的安装流程和使用flatpak的安装流程有什么关系和区别呢?1. apt 安装的包在哪里&…

YooAsset源码阅读-Downloader篇

YooAsset源码阅读-Downloader 继续 YooAsset 的 Downloader &#xff0c;本文将详细介绍如何创建下载器相关代码 CreateResourceDownloaderByAll 关键类 PlayModeImpl.csResourceDownloaderOperation.csDownloaderOperation.csBundleInfo.cs CreateResourceDownloaderByAll 方法…

豆包新模型与 PromptPilot 实操体验测评,AI 辅助创作的新范式探索

摘要&#xff1a;在 AI 技术飞速发展的当下&#xff0c;各类大模型及辅助工具层出不穷&#xff0c;为开发者和创作者带来了全新的体验。2025 年 7 月 30 日厦门站的火山方舟线下 Meetup&#xff0c;为我们提供了近距离接触豆包新模型与 PromptPilot 的机会。本次重点体验了实验…

深入探讨AI在测试领域的三大核心应用:自动化测试框架、智能缺陷检测和A/B测试优化,并通过代码示例、流程图和图表详细解析其实现原理和应用场景。

引言随着人工智能技术的飞速发展&#xff0c;软件测试领域正在经历一场深刻的变革。AI技术不仅提高了测试效率&#xff0c;还增强了测试的准确性和覆盖范围。本文将深入探讨AI在测试领域的三大核心应用&#xff1a;自动化测试框架、智能缺陷检测和A/B测试优化&#xff0c;并通过…

音视频学习笔记

0.vs应用其他库配置1基础 1.1视频基础 音视频录制原理音视频播放原理图像表示rgb图像表示yuvhttps://blog.51cto.com/u_7335580/2059670 https://blog.51cto.com/cto521/1944224 https://blog.csdn.net/mandagod/article/details/78605586?locationNum7&fps1 视频主要概念…

LLM隐藏层状态: outputs.hidden_states 是 MLP Residual 还是 Layer Norm

outputs.hidden_states 是 MLP Residual 还是 Layer Norm outputs.hidden_states 既不是单纯的 MLP Residual,也不是单纯的 Layer Norm,而是每一层所有组件(包括 Layer Norm、注意力、MLP、残差连接等)处理后的最终隐藏状态。具体需结合 Transformer 层的结构理解: 1. T…