Docker部署Java Web项目实战指南

发布时间:2026/7/27 13:07:34

Docker部署Java Web项目实战指南 1. 项目概述最近在整理黑马程序员Java Web课程的学习笔记时发现项目部署环节使用Docker确实能极大提升效率。作为一个从传统部署方式转型过来的开发者我想分享下这个过程中积累的实战经验。Docker部署不仅解决了环境不一致的痛点还能实现一键部署和快速回滚特别适合Java Web项目的持续交付场景。2. 环境准备与基础配置2.1 Docker环境搭建对于Java Web项目部署建议使用Docker CE稳定版。在Ubuntu系统上安装时记得先卸载旧版本sudo apt-get remove docker docker-engine docker.io containerd runc然后执行官方推荐的安装命令sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ deb [archamd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io注意生产环境务必配置docker用户组避免直接使用root权限操作容器2.2 Java环境镜像选择针对Java Web项目基础镜像的选择直接影响最终镜像大小和安全性openjdk:8-jdk-alpine推荐体积仅105MB包含完整的JDK环境适合中小型项目adoptopenjdk:11-jre-hotspot体积约200MB使用JRE减少攻击面适合生产环境自定义基础镜像基于ubuntu:20.04构建可预装监控组件适合企业级项目3. 项目Docker化实战3.1 标准Dockerfile编写以Spring Boot项目为例典型的多阶段构建Dockerfile# 构建阶段 FROM maven:3.6.3-jdk-11 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:11-jre-slim WORKDIR /app COPY --frombuilder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,app.jar]关键优化点使用多阶段构建减小最终镜像体积先单独复制pom.xml下载依赖利用Docker缓存使用非root用户运行容器增强安全性3.2 容器网络配置Java Web项目通常需要连接数据库推荐使用自定义bridge网络docker network create app-network运行MySQL容器时加入该网络docker run -d \ --name mysql \ --network app-network \ -e MYSQL_ROOT_PASSWORDsecret \ -e MYSQL_DATABASEappdb \ mysql:5.7应用容器连接同一网络即可通过容器名访问spring.datasource.urljdbc:mysql://mysql:3306/appdb4. 生产环境部署方案4.1 健康检查配置在Dockerfile中添加健康检查指令HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1配合Spring Boot Actuator的health端点可以实时监控应用状态。4.2 日志收集方案推荐采用以下日志处理方式json-file日志驱动默认docker run --log-driverjson-file --log-opt max-size10m --log-opt max-file3ELK方案Filebeat收集容器日志输出到Logstash最终在Kibana展示生产环境必备参数-e JAVA_TOOL_OPTIONS-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp -v /host/path:/tmp5. 常见问题排查指南5.1 容器内存问题现象容器频繁重启日志显示OOM解决方案限制容器内存docker run -m 512m --memory-swap1g调整JVM参数-e JAVA_OPTS-Xms256m -Xmx256m5.2 时区不一致问题现象日志时间与系统时间不符解决方法FROM openjdk:8-jdk-alpine RUN apk add --no-cache tzdata ENV TZAsia/Shanghai5.3 容器启动慢问题优化方案使用.dockerignore文件排除无关文件构建时指定构建缓存目录docker build --build-arg MAVEN_OPTS-Dmaven.repo.local/path/to/cache6. 进阶部署技巧6.1 使用Docker Compose编排典型docker-compose.yml配置version: 3.8 services: app: build: . ports: - 8080:8080 depends_on: - mysql environment: - SPRING_PROFILES_ACTIVEprod networks: - app-network mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: appdb volumes: - mysql_data:/var/lib/mysql networks: - app-network networks: app-network: driver: bridge volumes: mysql_data:6.2 CI/CD集成示例GitLab CI配置片段deploy: stage: deploy script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE . - docker push $CI_REGISTRY_IMAGE - ssh userserver docker pull $CI_REGISTRY_IMAGE docker-compose up -d only: - master7. 监控与维护7.1 基础监控方案推荐使用cAdvisorPrometheusGrafana组合docker run \ --volume/:/rootfs:ro \ --volume/var/run:/var/run:ro \ --volume/sys:/sys:ro \ --volume/var/lib/docker/:/var/lib/docker:ro \ --publish8080:8080 \ --detachtrue \ --namecadvisor \ google/cadvisor:latest7.2 容器更新策略蓝绿部署示例流程新版本容器使用不同标签逐步将流量切换到新容器旧版本保留一段时间后下线docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d --scale app3 --no-recreate在实际项目中根据流量情况逐步替换旧容器是最稳妥的方式。我通常会保留旧版本容器运行至少30分钟确认监控指标正常后再完全下线。

相关新闻