生产环境 Docker 完整实战指南
目录一、先搞懂Java 生产用 Docker 核心价值二、生产级前提准备三、核心Java 生产环境 Dockerfile 编写最关键1. 最佳实践多阶段构建生产标配2. 通用生产级 Dockerfile用来构建镜像3. 关键配置说明生产必看四、生产环境Java 镜像构建与优化1. 构建镜像命令2. 镜像优化生产必备五、生产环境Java 容器启动核心命令标准生产启动命令启动参数核心说明六、生产环境Docker 网络与多服务部署1. 创建自定义网络2. 所有服务加入同一网络3. Java 配置文件中访问七、生产环境Docker Compose单机集群标准方案docker-compose.yml 生产配置启动 / 停止命令八、生产环境Java 容器运维必备操作1. 查看运行中的容器2. 实时查看 Java 服务日志3. 进入容器内部排查问题生产慎用4. 停止 / 启动 / 重启容器5. 查看容器资源占用6. 删除无用镜像 / 容器释放服务器空间九、生产环境Java Docker 安全规范十、生产环境Java 容器常见问题解决方案1. JVM 内存溢出OOM2. 容器无法访问 MySQL/Redis3. 容器日志占满磁盘4. 镜像体积过大十一、总结Java 生产 Docker 核心流程总结Docker 是 Java 生产环境标准化部署、隔离运行、弹性扩缩容的核心工具彻底解决了「开发环境能跑生产环境崩溃」的痛点。本文从核心概念 → 生产级 Dockerfile 编写 → 镜像优化 → 容器运行 → 生产运维 → 安全规范全流程手把手讲透 Java 生产环境 Docker 使用。一、先搞懂Java 生产用 Docker 核心价值环境一致性开发 / 测试 / 生产用同一个镜像杜绝「JDK 版本、依赖包、系统配置」不一致问题轻量隔离每个 Java 服务独立容器互不干扰比虚拟机轻 10 倍以上快速部署镜像打包后任意服务器秒级启动支持集群扩缩容资源可控严格限制 Java 服务的 CPU、内存避免服务抢占资源可移植性一次打包到处运行阿里云、腾讯云、私有服务器通用生产常用组合SpringBoot/SpringCloud Maven/Gradle Docker Docker Compose单机多服务 Kubernetes集群生产二、生产级前提准备服务器安装Docker 20.10稳定版Java 项目可执行 JAR 包SpringBoot 内置 Tomcat/Netty最适合 Docker基础镜像必须用轻量、安全、官方的 JDK 镜像杜绝 OpenJDK:8 这种臃肿镜像三、核心Java 生产环境 Dockerfile 编写最关键Dockerfile 是打包 Java 镜像的脚本生产环境必须遵循小体积、安全、启动快、可观测。1. 最佳实践多阶段构建生产标配为什么用多阶段第一阶段Maven 编译打包包含源码、依赖体积大第二阶段仅保留运行所需 JAR JRE体积缩小 80%2. 通用生产级 Dockerfile用来构建镜像# 第一阶段编译构建 FROM maven:3.8.8-openjdk-17-slim AS builder # 设置工作目录 WORKDIR /app # 复制 pom.xml 先下载依赖利用 Docker 缓存加速构建 COPY pom.xml . # 预下载依赖避免每次构建重复下载 RUN mvn dependency:go-offline -B # 复制项目源码 COPY src ./src # 编译打包跳过测试 RUN mvn clean package -DskipTests # 第二阶段生产运行镜像核心 FROM eclipse-temurin:17-jre-alpine # 生产环境必备创建非 root 用户运行安全规范禁止 root 运行容器 RUN addgroup -S appgroup adduser -S appuser -G appgroup # 设置工作目录 WORKDIR /app # 从构建阶段复制编译好的 JAR 包 COPY --frombuilder /app/target/*.jar app.jar # 切换非 root 用户 USER appuser # 容器启动命令生产必须配置 JVM 参数 ENTRYPOINT [java, \ # JVM 生产优化参数 -XX:UseContainerSupport, \ # 让 JVM 识别 Docker 容器内存核心 -XX:MaxRAMPercentage75.0, \ # 最大使用 75% 容器内存 -XX:HeapDumpOnOutOfMemoryError, \ # OOM 自动生成堆转储文件 -XX:HeapDumpPath/app/heapdump.hprof, \ -jar, app.jar]3. 关键配置说明生产必看基础镜像eclipse-temurin:17-jre-alpine官方推荐、安全更新及时alpine 系统体积极小~50MB无冗余组件非 root 用户强制要求防止容器被入侵后控制服务器JVM 容器支持-XX:UseContainerSupportJDK 11 自带让 JVM 读取 Docker 内存限制不会出现「容器内存 2GJVM 用 8G 崩溃」缓存优化先复制pom.xml再复制源码Maven 依赖只下载一次四、生产环境Java 镜像构建与优化1. 构建镜像命令# 构建镜像指定标签版本号生产禁止 latest docker build -t my-java-app:1.0.0 .2. 镜像优化生产必备使用 JRE 而非 JDK运行只需要 JREJDK 体积大 3 倍使用 alpine 系统比 debian/centos 小 80%多阶段构建剔除源码、Maven 依赖清理缓存alpine 镜像无需额外清理已极简优化效果普通镜像800MB → 生产优化镜像100MB五、生产环境Java 容器启动核心命令生产启动容器绝对不能用简单的 docker run必须配置端口映射、资源限制、数据挂载、重启策略、日志。标准生产启动命令docker run -d \ --name my-java-app \ # 容器名称规范服务名-环境 --restartalways \ # 开机自启、崩溃自动重启生产必开 -p 8080:8080 \ # 端口映射主机端口:容器端口 -m 2G \ # 限制容器最大内存 2G生产必配 --cpus 2 \ # 限制容器最大 CPU 核心数 2 -v /app/logs:/app/logs \ # 日志挂载主机目录:容器目录持久化日志 -v /app/dump:/app \ # OOM 堆转储文件挂载 -e SPRING_PROFILES_ACTIVEprod \ # 环境变量指定生产配置文件 --network app-network \ # 加入自定义网络与 MySQL/Redis 通信 my-java-app:1.0.0启动参数核心说明--restartalways服务崩溃、服务器重启后自动拉起-m/--cpus资源隔离防止 Java 服务耗尽服务器资源数据卷挂载日志、配置文件、dump 文件不随容器删除而丢失环境变量SPRING_PROFILES_ACTIVE切换生产 / 测试配置无需改镜像自定义网络容器间内网通信安全且高效六、生产环境Docker 网络与多服务部署Java 服务通常需要连接 MySQL、Redis、MQ生产禁止用 localhost 访问。1. 创建自定义网络docker network create app-network2. 所有服务加入同一网络# MySQL 容器 docker run -d --name mysql --network app-network mysql:8.0 # Java 容器如上命令加入 app-network3. Java 配置文件中访问直接用容器名作为主机名Docker 自动内网解析spring: datasource: url: jdbc:mysql://mysql:3306/test_db # mysql容器名 username: root password: 123456七、生产环境Docker Compose单机集群标准方案单台服务器运行多个服务Java MySQL Redis生产用 Docker Compose 替代手动 run 命令。docker-compose.yml生产配置version: 3.8 services: # Java 应用服务 java-app: build: . image: my-java-app:1.0.0 container_name: java-app restart: always ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod volumes: - ./logs:/app/logs - ./dump:/app deploy: resources: limits: cpus: 2 memory: 2G networks: - app-network depends_on: - mysql - redis # MySQL 服务 mysql: image: mysql:8.0 container_name: mysql restart: always environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEtest_db volumes: - mysql-data:/var/lib/mysql networks: - app-network networks: app-network: driver: bridge volumes: mysql-data:启动 / 停止命令# 后台启动所有服务 docker-compose up -d # 查看日志 docker-compose logs -f java-app # 停止服务 docker-compose down八、生产环境Java 容器运维必备操作1. 查看运行中的容器docker ps2. 实时查看 Java 服务日志docker logs -f --tail200 容器名/容器ID3. 进入容器内部排查问题生产慎用docker exec -it 容器名 sh4. 停止 / 启动 / 重启容器docker stop 容器名 docker start 容器名 docker restart 容器名5. 查看容器资源占用docker stats6. 删除无用镜像 / 容器释放服务器空间docker system prune -a九、生产环境Java Docker 安全规范禁止 root 运行容器必须创建普通用户Dockerfile 已配置禁止暴露敏感端口只暴露业务端口禁止 22、3306 对公网开放镜像不写死密码密码用环境变量 / 配置中心传入使用官方基础镜像杜绝第三方镜像防止植入木马定期更新基础镜像修复系统漏洞限制容器权限添加--privilegedfalse默认关闭禁止开启十、生产环境Java 容器常见问题解决方案1. JVM 内存溢出OOM原因JVM 未识别 Docker 内存限制解决添加 JVM 参数-XX:UseContainerSupport -XX:MaxRAMPercentage75.02. 容器无法访问 MySQL/Redis原因未加入同一自定义网络解决所有服务配置--network app-network3. 容器日志占满磁盘解决配置 Docker 日志滚动# 启动时添加日志限制 --log-opt max-size100m --log-opt max-file34. 镜像体积过大解决使用 alpine JRE 多阶段构建十一、总结Java 生产 Docker 核心流程编写多阶段 Dockerfile轻量、安全、JVM 优化构建带版本号的镜像禁止 latest用docker run或docker-compose启动配置重启策略、资源限制、数据挂载服务间用自定义网络通信日常运维日志查看、资源监控、自动重启严格遵守安全规范非 root、最小权限、官方镜像总结Docker 是 Java 生产标准部署工具核心解决环境一致性、隔离、快速扩缩容问题生产 Dockerfile 必须用多阶段构建 alpine JRE 非 root 用户容器启动必须配置重启策略、资源限制、数据卷、自定义网络单机生产用Docker Compose集群生产用Kubernetes所有配置围绕小体积、高安全、稳定运行、可观测