微服务:doucker 热部署

📅 2026/7/11 16:16:50
微服务: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}:/appmy-fastapi-app uvicorn main:app--host0.0.0.0--port8000--reload方法 B修改 Dockerfile推荐以后构建镜像默认开启修改Dockerfile的最后一行加上--reloadCMD [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}:/appmy-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填写如下选项ProjectMavenLanguageJavaSpring Boot选择最新稳定版如 3.4.0Groupcom.exampleArtifactdemoDependencies勾选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.javapackagecom.example.demo;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassHelloController{GetMapping(/)publicStringhome(){returnHello 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标签内加入dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/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/.m2my-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 packagedocker restart保存代码自动重启适用场景生产调试、资源紧张日常开发、频繁修改代码初始启动速度快直接运行 JAR稍慢需启动 Maven 现在你可以选择如果想体验真正无缝的热部署按照“方案二”操作创建Dockerfile.dev并运行。如果觉得手动重启也能接受继续使用你已有的Dockerfile配合mvn package和docker restart。我建议你先用方案二体验一下“改代码 → 刷新浏览器”的丝滑感觉这会显著提升开发效率。之后如果需要生产部署再切回精简的生产镜像即可。如果你在操作中遇到任何问题比如挂载路径不对、权限错误等随时告诉我我会帮你调整。