Docker进阶实战:构建Java+Redis访问统计应用并分享镜像

发布时间:2026/7/13 18:55:58
Docker进阶实战:构建Java+Redis访问统计应用并分享镜像 Docker进阶实战构建JavaRedis访问统计应用并分享镜像引言从单容器到多容器协作在上一篇文章中我们学习了Docker的基础命令——镜像拉取、容器运行、数据挂载等。但真实的业务场景远比“跑一个Nginx容器”复杂得多。想象一下你开发了一个Java Web应用需要连接Redis来统计网站的访问人数。应用和Redis是两个独立的服务它们需要分别运行在各自的容器中还要能够互相通信。更进阶的是你需要把这个完整的应用打包成镜像分享给团队或部署到生产环境。本文将带你完成一个完整的Docker进阶实战创建一个Java Web应用统计访问人数部署Redis并设置密码用Dockerfile构建Java应用镜像实现容器间通信将镜像推送到仓库与他人分享一、项目概述我们要做什么我们将构建一个访问计数器应用技术栈Java Spring Boot Redis功能每次用户访问页面访问次数1并显示当前总访问量架构Java应用容器 Redis容器两个容器协作运行二、第一步创建Java应用2.1 新建Spring Boot项目使用Spring Initializr创建一个简单的Web项目添加以下依赖Spring WebSpring Data Redis (Lettuce)2.2 编写访问计数器代码创建VisitController.javajavapackage com.example.counter.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class VisitController { Autowired private StringRedisTemplate redisTemplate; GetMapping(/) public String count() { // Redis中key为visits每次访问1 Long count redisTemplate.opsForValue().increment(visits); return 本页面已被访问 count 次; } }2.3 配置Redis连接在application.yml中配置Redis连接信息yamlspring: redis: host: redis-container # 容器名后面会解释为什么这样写 port: 6379 password: 123456 # Redis密码关键点host: redis-container——这里填的不是IP地址而是容器名称。因为两个容器在同一个Docker网络中可以通过容器名互相访问。2.4 打包JAR文件在项目根目录执行bashmvn clean package生成的counter-0.0.1-SNAPSHOT.jar位于target/目录下。三、第二步部署Redis并设置密码3.1 拉取Redis镜像bashdocker pull redis:7.03.2 创建Docker网络为了让Java应用容器和Redis容器能够互相通信需要创建一个自定义网络bashdocker network create app-network3.3 启动Redis容器带密码使用--requirepass参数设置Redis密码bashdocker run -d \ --name redis-container \ --network app-network \ -p 6379:6379 \ redis:7.0 \ redis-server --requirepass 123456参数解析参数作用-d后台运行--name redis-container容器命名为redis-containerJava应用将通过这个名字访问它--network app-network加入自定义网络实现容器间通信-p 6379:6379端口映射方便宿主机调试redis-server --requirepass 123456启动Redis并设置密码为1234563.4 验证Redis是否正常运行bash# 查看容器状态 docker ps | grep redis-container # 查看日志 docker logs redis-container如果看到Ready to accept connections说明Redis已就绪。四、第三步用Dockerfile构建Java应用镜像4.1 编写Dockerfile在项目根目录与pom.xml同级创建Dockerfiledockerfile# 使用OpenJDK 17作为基础镜像[reference:11] FROM openjdk:17-jdk-slim # 设置工作目录 WORKDIR /app # 复制JAR文件到容器 COPY target/counter-0.0.1-SNAPSHOT.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT [java, -jar, app.jar]进阶优化生产环境可以采用多阶段构建先用Maven镜像编译再用精简JRE运行镜像体积可减少约60%。4.2 构建镜像在项目根目录执行bashdocker build -t counter-app:1.0 .-t counter-app:1.0指定镜像名称和标签末尾的.表示Dockerfile在当前目录。4.3 查看构建结果bashdocker images | grep counter-app五、第四步运行Java应用容器5.1 启动容器加入同一网络bashdocker run -d \ --name counter-container \ --network app-network \ -p 8080:8080 \ counter-app:1.0关键点--network app-network必须与Redis容器在同一个网络否则无法通信Java应用中的spring.redis.host: redis-container会通过Docker网络自动解析到Redis容器的IP5.2 验证应用是否正常运行bash# 查看容器日志 docker logs counter-container # 访问应用 curl http://localhost:8080每次执行curl或刷新浏览器访问次数都会1。5.3 验证数据持久化停止并删除Java容器再重新启动bashdocker stop counter-container docker rm counter-container docker run -d --name counter-container --network app-network -p 8080:8080 counter-app:1.0再次访问访问次数会延续之前的计数——因为数据存储在Redis中而Redis容器并没有被删除。生产建议Redis容器也应该挂载数据卷实现持久化防止容器重启导致数据丢失。六、第五步分享镜像构建好的镜像可以分享给团队成员或部署到其他环境。6.1 登录Docker Hubbashdocker login输入Docker Hub的用户名和密码。6.2 给镜像打标签推送前必须用docker tag给镜像打上符合仓库格式的标签bashdocker tag counter-app:1.0 你的用户名/counter-app:1.06.3 推送镜像bashdocker push 你的用户名/counter-app:1.06.4 他人拉取并运行团队成员只需一条命令即可拉取并运行bashdocker pull 你的用户名/counter-app:1.0 docker run -d --network app-network -p 8080:8080 你的用户名/counter-app:1.0注意对方也需要先启动Redis容器并加入app-network网络。七、进阶优化建议7.1 使用Docker Compose推荐当服务增多时逐个启动容器很麻烦。用docker-compose.yml可以一键启动所有服务yamlversion: 3.8 services: redis: image: redis:7.0 command: redis-server --requirepass 123456 networks: - app-network volumes: - redis-data:/data web: build: . ports: - 8080:8080 networks: - app-network depends_on: - redis networks: app-network: volumes: redis-data:启动命令bashdocker-compose up -d7.2 JVM参数优化在容器中运行Java应用时建议添加JVM参数dockerfileENTRYPOINT [java, -XX:MaxRAMPercentage75.0, -jar, app.jar]这能让JVM感知容器内存限制避免过度分配内存。7.3 使用轻量级基础镜像openjdk:17-jdk-slim已经比较轻量如果追求极致可以使用eclipse-temurin:17-jre-alpine镜像体积更小。总结通过本文的实战你应该已经掌握了Docker的进阶技能多容器协作Java应用和Redis分别运行在不同容器中通过自定义网络实现通信Redis密码配置用--requirepass参数为Redis设置密码Dockerfile构建Java应用将JAR包打包成可运行的Docker镜像容器间通信同一Docker网络中的容器可以通过容器名互相访问镜像分享通过docker tagdocker push将镜像推送到仓库Docker Compose用编排文件一键管理多容器应用核心要点回顾步骤关键命令/操作作用创建网络docker network create app-network让容器间可以通信启动Redisdocker run --network app-network --requirepass 密码部署带密码的Redis构建镜像docker build -t 镜像名:标签 .将Java应用打包成镜像启动应用docker run --network app-network让应用加入同一网络分享镜像docker tagdocker push推送到仓库供他人使用从单容器到多容器协作从本地运行到镜像分享——你已经具备了用Docker构建真实业务应用的能力。下一步可以尝试引入更多服务如MySQL、Nginx用Docker Compose编排一个完整的微服务架构。