Docker容器化Spring Boot:从构建到部署的完整实战
环境准备Docker Desktop (Windows/Mac) 或 Docker Engine (Linux)Spring Boot 3.x 项目JDK 17回到顶部二、项目结构my-springboot-app/ ├── src/ ├── Dockerfile # Docker配置文件 ├── docker-compose.yml # 编排文件 └── .dockerignore # 忽略文件回到顶部三、编写Dockerfile# 多阶段构建构建阶段 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 创建非root用户 RUN addgroup -S appgroup adduser -S appuser -G appgroup # 复制jar包 COPY --frombuilder /app/target/*.jar app.jar # 设置权限 RUN chown -R appuser:appgroup /app USER appuser # 环境变量 ENV JAVA_OPTS-Xms256m -Xmx512m ENV SPRING_PROFILES_ACTIVEprod # 健康检查 HEALTHCHECK --interval30s --timeout3s \ CMD wget --quiet --tries1 --spider http://localhost:8080/actuator/health || exit 1 # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT [sh, -c, java $JAVA_OPTS -jar app.jar]回到顶部四、.dockerignore文件.git .gitignore target/ *.md Dockerfile docker-compose.yml *.log .idea/ *.iml回到顶部五、构建镜像# 构建镜像 docker build -t myapp:latest . # 查看镜像 docker images | grep myapp # 运行容器 docker run -d -p 8080:8080 --name myapp myapp:latest # 查看日志 docker logs -f myapp # 进入容器 docker exec -it myapp sh回到顶部六、使用docker-compose编排version: 3.8 services: app: build: . container_name: my-springboot-app ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod - SPRING_DATASOURCE_URLjdbc:mysql://db:3306/mydb - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORDsecret depends_on: db: condition: service_healthy restart: unless-stopped networks: - app-network db: image: mysql:8.0 container_name: mysql8 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: mydb ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 5 networks: - app-network volumes: mysql-data: networks: app-network: driver: bridge回到顶部七、优化技巧1. 使用阿里云镜像加速# /etc/docker/daemon.json { registry-mirrors: [https://mirror.ccs.tencentyun.com] }2. 缩小镜像体积使用 alpine 基础镜像多阶段构建分离编译和运行环境使用 .dockerignore 排除无关文件3. 安全加固使用非root用户运行只暴露必要端口敏感信息使用Docker Secret回到顶部八、常见问题解决Q: 容器内无法连接宿主机数据库使用 host.docker.internal 代替 localhostjdbc:mysql://host.docker.internal:3306/mydbQ: 内存溢出在Dockerfile中设置JVM堆内存限制ENV JAVA_OPTS-Xms256m -Xmx512m -XX:UseG1GC