news 2026/7/11 16:16:45

微服务:doucker 热部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微服务:doucker 热部署

答案是:不一定能直接看到变化,取决于你是否开启了热重载(--reload)。

因为你的容器是通过-v "$(PWD):/app"挂载运行的,所以容器内的main.py确实已经同步成了你修改后的代码(文件变了)。

但是,Uvicorn 默认只在启动时读取一次代码。除非你专门加了--reload参数,否则正在运行的老进程不会自动加载新代码。


🔍 先确认你的容器是否开启了热重载

执行以下命令查看容器的启动命令:

dockerps--no-trunc|findstr my-api

或者直接查看日志(看是否有reload字样):

dockerlogs my-api
  • 如果看到--reload:直接刷新浏览器http://localhost:8000,代码就生效了。
  • 如果没有--reload:需要执行下面的操作。

🛠️ 方案一:直接重启容器(最简单,立刻生效)

既然代码已经挂载进去了,只需重启容器让进程重新加载即可:

dockerrestart my-api

重启后(大约 1-2 秒),刷新浏览器,新代码就会生效。


🛠️ 方案二:开启热重载(一劳永逸,以后改代码自动生效)

如果你希望以后修改代码后无需重启容器,自动生效,需要让 Uvicorn 带上--reload参数。

方法 A:删除旧容器,重新运行(覆盖启动命令)

dockerrm-fmy-apidockerrun-d-p8000:8000--namemy-api-v"${PWD}:/app"my-fastapi-app uvicorn main:app--host0.0.0.0--port8000--reload

方法 B:修改 Dockerfile(推荐,以后构建镜像默认开启)

修改Dockerfile的最后一行,加上--reload

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

然后重新构建镜像(注意:这一步会重建镜像,但只是为了改默认启动命令):

dockerbuild-tmy-fastapi-app.dockerrm-fmy-apidockerrun-d-p8000:8000--namemy-api-v"${PWD}:/app"my-fastapi-app

之后,你每次修改main.py并保存文件,终端日志会显示Reloading...,浏览器刷新就能看到最新效果。


📌 总结建议

  • 不想折腾:直接执行docker restart my-api,然后刷新浏览器就能看到最新代码。
  • 想长期省事:采用方案二,加上--reload,以后开发就非常丝滑了。

你现在可以先试试docker restart my-api,看看修改是否生效,然后告诉我结果!如果重启后报错或者访问不了,把docker logs my-api的日志发我看看。😊
太好了!毫秒镜像可用,这意味着你的 Docker 网络环境已经完全打通,可以顺利拉取镜像了。

现在给你一份完整的、可直接操作的 Spring Boot + Docker 部署指南,包含了从项目创建到容器运行的全过程,所有配置都基于已验证可用的docker.1ms.run镜像源。


🐳 Spring Boot + Docker 完整部署指南(Windows / 毫秒镜像)


📦 第一步:创建 Spring Boot 项目(没有 IDEA 插件也行)

方案 A:使用 Spring Initializr 网站(推荐,无需插件)

  1. 打开浏览器访问 https://start.spring.io
  2. 填写如下选项:
    • Project:Maven
    • Language:Java
    • Spring Boot:选择最新稳定版(如 3.4.0)
    • Groupcom.example
    • Artifactdemo
    • Dependencies:勾选Spring Web
  3. 点击GENERATE下载压缩包,解压到工作目录(如D:\codding\java-docker

方案 B:手动创建 Maven 项目(如果不想用网站)

D:\codding\java-docker下创建pom.xml,内容使用你之前提供的模板(Spring Boot 3.2.0 及以上),并添加 Spring Web 依赖。


📝 第二步:编写 Controller(提供访问入口)

src/main/java/com/example/demo/下创建HelloController.java

packagecom.example.demo;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloController{@GetMapping("/")publicStringhome(){return"Hello Docker! Java Spring Boot is running with 1ms mirror!";}}

确保DemoApplication.java(启动类)存在,通常自动生成,无需修改。


{
“registry-mirrors”: [“https://docker.1ms.run”]
}

🐳 第三步:在项目根目录创建 Dockerfile

D:\codding\java-docker(即pom.xml所在目录)下创建文件Dockerfile(无扩展名),内容如下:

# 使用毫秒镜像代理的 OpenJDK 17(已验证可用) FROM docker.1ms.run/library/openjdk:17-jdk-slim # 设置工作目录 WORKDIR /app # 复制 Maven 打包后的 JAR 文件 COPY target/*.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"]

注意:这里写的是docker.1ms.run/library/openjdk:17-jdk-slim,因为毫秒镜像代理了 Docker Hub 的官方仓库,用/library/前缀可以明确指向官方镜像。


🔨 第四步:Maven 打包

在项目根目录打开终端(PowerShell 或 CMD),执行:

mvn clean package-DskipTests

如果提示mvn找不到:可以使用 IDEA 右侧的 Maven 面板,双击Lifecycleclean,再双击package

打包成功后,在target目录下会生成demo-0.0.1-SNAPSHOT.jar(或类似名字)。


🛠️ 第五步:构建 Docker 镜像

dockerbuild-tmy-springboot-app:v1.

执行后,你会看到 Docker 从docker.1ms.run拉取基础镜像,然后复制 JAR 包,最后构建成功。


🚀 第六步:运行容器

dockerrun-d-p8080:8080--namemy-app my-springboot-app:v1
  • -d:后台运行
  • -p 8080:8080:宿主机 8080 映射到容器 8080
  • --name my-app:容器命名

✅ 第七步:验证访问

打开浏览器,访问http://localhost:8080,页面应显示:

Hello Docker! Java Spring Boot is running with 1ms mirror!

同时可以查看容器日志确认启动成功:

dockerlogs my-app

🔧 开发模式:代码修改后快速更新

如果你频繁修改代码,可以每次执行:

mvn clean package-DskipTestsdockerrestart my-app

刷新浏览器即可看到新内容。

如果需要自动热重载,可以配置 Spring Boot DevTools(参考之前说明),但简单的restart已经足够。


📋 常用管理命令

目的命令
查看运行中的容器docker ps
查看所有容器(含停止的)docker ps -a
停止容器docker stop my-app
启动已停止的容器docker start my-app
删除容器(需先停止)docker rm my-app
删除镜像docker rmi my-springboot-app:v1
查看容器日志(实时)docker logs -f my-app
进入容器内部调试docker exec -it my-app /bin/bash

🧹 清理环境(如果需要重来)

dockerstop my-appdockerrmmy-appdockerrmi my-springboot-app:v1

🎉 总结

你现在已经掌握了:

  1. 创建 Spring Boot 项目
  2. 编写 Dockerfile(使用毫秒镜像代理)
  3. 使用 Maven 打包
  4. 构建并运行 Docker 容器
  5. 访问验证和日常操作

这套流程适用于所有基于 Spring Boot 的 Java 微服务项目,你只需要替换 JAR 包名称和端口即可适应不同项目。


如果后续你想学习Docker Compose 编排多服务(如 + MySQL、Redis)或部署到云服务器,随时可以继续问我。现在,先去试试你的 Java 应用在 Docker 里跑起来吧!🚀

好的!既然你已经成功运行了基础版本,现在我们来升级成**支持热部署(Hot Reload)**的开发模式。这样你修改 Java 代码后,无需手动重启容器,应用会自动重启并加载新代码,大大提升开发效率。


🎯 热部署方案选择

有两种常见方案,按复杂度从低到高排列:

方案做法优点缺点
方案一:挂载 JAR + 手动重启修改代码 →mvn packagedocker restart简单、无需额外配置每次都要手动执行两条命令
方案二:挂载源码 +mvn spring-boot:run容器内用 Maven 运行,修改代码自动重启真正的热部署,改完保存即生效容器体积较大,启动稍慢

推荐方案二,因为它能真正实现“改代码 → 刷新浏览器 → 立即看到变化”的流畅开发体验。


🚀 方案二:实现真正的热部署(推荐)

1️⃣ 修改pom.xml,添加 Spring Boot DevTools 依赖

<dependencies>标签内加入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>

保存后,Maven 会自动下载该依赖。

2️⃣ 创建一个开发用的Dockerfile.dev

在项目根目录新建文件Dockerfile.dev(与Dockerfile区分开),内容如下:

# 使用包含 Maven 和 JDK 的镜像(开发用) FROM docker.1ms.run/library/maven:3.8-openjdk-17 # 设置工作目录 WORKDIR /app # 将 Maven 的本地仓库挂载到容器外,避免每次重建下载依赖(由 docker run 挂载) # 复制 pom.xml 并下载依赖(利用 Docker 缓存) COPY pom.xml . RUN mvn dependency:go-offline # 复制源代码 COPY src ./src # 暴露端口 EXPOSE 8080 # 启动 Spring Boot 开发模式(带 DevTools 热重启) CMD ["mvn", "spring-boot:run"]

注意:这个镜像较大(约 500MB),但只在开发阶段使用,不影响生产镜像。

3️⃣ 构建开发镜像

dockerbuild-fDockerfile.dev-tmy-springboot-dev.

4️⃣ 运行开发容器(挂载源码和 Maven 仓库)

关键:必须把宿主机上的源码目录和 Maven 本地仓库挂载进去,这样修改代码后容器内的 Maven 能重新编译。

dockerrun-d-p8080:8080--namemy-app-dev`-v"${PWD}:/app"`-v"$HOME/.m2:/root/.m2"` my-springboot-dev
  • -v "${PWD}:/app":将当前项目目录挂载到容器/app,使源码同步。
  • -v "$HOME/.m2:/root/.m2":复用宿主机 Maven 本地仓库,避免重复下载依赖。

如果你在PowerShell中,使用${PWD}$HOME;如果在CMD中,请改用%cd%%USERPROFILE%

5️⃣ 验证热部署

  1. 访问http://localhost:8080,看到初始内容。
  2. 修改HelloController.java中的返回字符串(比如改成"Hello Hot Reload!")。
  3. 保存文件,观察容器日志(docker logs -f my-app-dev),你会看到类似输出:
    Started DemoApplication in 2.345 seconds (JVM running for 3.123)
    说明应用已自动重启。
  4. 刷新浏览器,新内容立即显示。

🧹 日常开发操作指南

  • 修改代码后:无需任何命令,保存即生效(DevTools 会监听变化并自动重启)。
  • 新增依赖:修改pom.xml后,需重新构建镜像(因为RUN mvn dependency:go-offline在镜像构建时执行)。执行:
    dockerbuild-fDockerfile.dev-tmy-springboot-dev.dockerrm-fmy-app-devdockerrun-d-p8080:8080--namemy-app-dev-v"${PWD}:/app"-v"$HOME/.m2:/root/.m2"my-springboot-dev
  • 清理容器和镜像
    dockerrm-fmy-app-devdockerrmi my-springboot-dev

🔁 方案一:轻量级热重启(如果不想用开发镜像)

如果你希望保持镜像小,沿用生产镜像,但想要半自动热部署,可以用挂载 JAR 包的方式:

  1. 修改代码后,在宿主机执行:
    mvn clean package-DskipTests
  2. 然后重启容器:
    dockerrestart my-app
  3. 刷新浏览器看到变化。

这种方式虽然多了一步,但镜像体积小(约 300MB),适合资源有限的环境。


📌 两种方案对比总结

特性方案一(挂载 JAR + 重启)方案二(开发镜像 + Maven 运行)
镜像大小~300 MB~600 MB
热部署方式手动执行mvn package+docker restart保存代码自动重启
适用场景生产调试、资源紧张日常开发、频繁修改代码
初始启动速度快(直接运行 JAR)稍慢(需启动 Maven)

🎉 现在你可以选择

  • 如果想体验真正无缝的热部署:按照“方案二”操作,创建Dockerfile.dev并运行。
  • 如果觉得手动重启也能接受:继续使用你已有的Dockerfile,配合mvn packagedocker restart

我建议你先用方案二体验一下“改代码 → 刷新浏览器”的丝滑感觉,这会显著提升开发效率。之后如果需要生产部署,再切回精简的生产镜像即可。

如果你在操作中遇到任何问题(比如挂载路径不对、权限错误等),随时告诉我,我会帮你调整。😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 16:15:23

深入理解 Java SPI(Service Provider Interface)机制

1. 什么是 SPI&#xff1f;SPI&#xff08;Service Provider Interface&#xff0c;服务提供者接口&#xff09;是 Java 平台提供的一种服务发现与加载机制。它允许框架或核心库定义接口规范&#xff0c;而具体的实现则由第三方服务提供者提供&#xff0c;并在运行时动态加载。…

作者头像 李华
网站建设 2026/7/11 16:15:13

如何3步快速上手免费开源的三国杀卡牌游戏:完整入门指南

如何3步快速上手免费开源的三国杀卡牌游戏&#xff1a;完整入门指南 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 无名杀是一款完全免费的开源卡牌游戏&#xff0c;完美复刻了经典三国杀的核心玩法&#xff0c;同时提供了丰富的自…

作者头像 李华
网站建设 2026/7/11 16:13:19

PIC18F4525与MCP3428高精度数据采集系统设计

1. 项目背景与核心需求 在工业自动化和嵌入式系统开发领域&#xff0c;数据采集的精度和稳定性直接影响整个系统的可靠性。传统8位或10位ADC模块已无法满足现代高精度测量需求&#xff0c;特别是在温度监控、压力传感、医疗设备等场景中。这就是为什么我们需要将数据采集系统升…

作者头像 李华
网站建设 2026/7/11 16:07:48

C++ MFC对话框调用COM组件实战:从原理到避坑指南

1. 项目概述与核心价值在Windows桌面应用开发&#xff0c;尤其是使用C和MFC进行对话框程序开发时&#xff0c;我们经常会遇到一个需求&#xff1a;复用或集成一些已有的、功能强大的二进制模块。这些模块可能是用不同语言&#xff08;如VB、Delphi&#xff09;编写的&#xff0…

作者头像 李华
网站建设 2026/7/11 16:07:10

高精度ADC ADS122U04与dsPIC30F3014的工业测量方案

1. 项目背景与核心需求 在工业测量和嵌入式系统开发中&#xff0c;将模拟信号精确转换为数字信号是一个基础但至关重要的环节。ADS122U04作为TI公司推出的24位Δ-Σ型ADC芯片&#xff0c;与Microchip的dsPIC30F3014数字信号控制器组合&#xff0c;能够实现微伏级精度的信号采集…

作者头像 李华