答案是:不一定能直接看到变化,取决于你是否开启了热重载(--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 网站(推荐,无需插件)
- 打开浏览器访问 https://start.spring.io
- 填写如下选项:
- Project:Maven
- Language:Java
- Spring Boot:选择最新稳定版(如 3.4.0)
- Group:
com.example - Artifact:
demo - Dependencies:勾选Spring Web
- 点击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 面板,双击Lifecycle→clean,再双击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🎉 总结
你现在已经掌握了:
- 创建 Spring Boot 项目
- 编写 Dockerfile(使用毫秒镜像代理)
- 使用 Maven 打包
- 构建并运行 Docker 容器
- 访问验证和日常操作
这套流程适用于所有基于 Spring Boot 的 Java 微服务项目,你只需要替换 JAR 包名称和端口即可适应不同项目。
如果后续你想学习Docker Compose 编排多服务(如 + MySQL、Redis)或部署到云服务器,随时可以继续问我。现在,先去试试你的 Java 应用在 Docker 里跑起来吧!🚀
好的!既然你已经成功运行了基础版本,现在我们来升级成**支持热部署(Hot Reload)**的开发模式。这样你修改 Java 代码后,无需手动重启容器,应用会自动重启并加载新代码,大大提升开发效率。
🎯 热部署方案选择
有两种常见方案,按复杂度从低到高排列:
| 方案 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 方案一:挂载 JAR + 手动重启 | 修改代码 →mvn package→docker 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️⃣ 验证热部署
- 访问
http://localhost:8080,看到初始内容。 - 修改
HelloController.java中的返回字符串(比如改成"Hello Hot Reload!")。 - 保存文件,观察容器日志(
docker logs -f my-app-dev),你会看到类似输出:
说明应用已自动重启。Started DemoApplication in 2.345 seconds (JVM running for 3.123) - 刷新浏览器,新内容立即显示。
🧹 日常开发操作指南
- 修改代码后:无需任何命令,保存即生效(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 包的方式:
- 修改代码后,在宿主机执行:
mvn clean package-DskipTests - 然后重启容器:
dockerrestart my-app - 刷新浏览器看到变化。
这种方式虽然多了一步,但镜像体积小(约 300MB),适合资源有限的环境。
📌 两种方案对比总结
| 特性 | 方案一(挂载 JAR + 重启) | 方案二(开发镜像 + Maven 运行) |
|---|---|---|
| 镜像大小 | ~300 MB | ~600 MB |
| 热部署方式 | 手动执行mvn package+docker restart | 保存代码自动重启 |
| 适用场景 | 生产调试、资源紧张 | 日常开发、频繁修改代码 |
| 初始启动速度 | 快(直接运行 JAR) | 稍慢(需启动 Maven) |
🎉 现在你可以选择
- 如果想体验真正无缝的热部署:按照“方案二”操作,创建
Dockerfile.dev并运行。 - 如果觉得手动重启也能接受:继续使用你已有的
Dockerfile,配合mvn package和docker restart。
我建议你先用方案二体验一下“改代码 → 刷新浏览器”的丝滑感觉,这会显著提升开发效率。之后如果需要生产部署,再切回精简的生产镜像即可。
如果你在操作中遇到任何问题(比如挂载路径不对、权限错误等),随时告诉我,我会帮你调整。😊