Docker容器化部署实战:从零构建Spring Boot微服务镜像 📅 2026/6/29 21:18:36 为什么需要 Docker环境一致性开发、测试、生产环境完全一致快速部署秒级启动秒级扩容资源隔离每个容器独立运行互不影响CI/CD 友好与 Jenkins/GitHub Actions 无缝集成回到顶部二、Spring Boot 项目准备!-- pom.xml -- build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build mvn clean package -DskipTests // target/myapp-1.0.0.jar回到顶部三、编写 Dockerfile# 基础版 FROM openjdk:21-jdk-slim WORKDIR /app COPY target/myapp-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar] # 多阶段构建推荐 FROM maven:3.9-eclipse-temurin-21 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --frombuilder /build/target/myapp-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]回到顶部四、构建和运行# 构建镜像 docker build -t myapp:1.0.0 . # 运行容器 docker run -d --name myapp -p 8080:8080 \ -e SPRING_PROFILES_ACTIVEprod \ -e JAVA_OPTS-Xms256m -Xmx512m \ myapp:1.0.0 # 查看日志 docker logs -f myapp # 进入容器调试 docker exec -it myapp sh回到顶部五、Docker Compose 编排# docker-compose.yml version: 3.8 services: app: build: . ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod - SPRING_DATASOURCE_URLjdbc:mysql://db:3306/mydb depends_on: db: condition: service_healthy restart: always db: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEmydb volumes: - mysql_data:/var/lib/mysql healthcheck: test: [CMD, mysqladmin, ping] interval: 10s retries: 5 redis: image: redis:7-alpine ports: - 6379:6379 volumes: mysql_data: # 一键启动 docker compose up -d回到顶部六、镜像优化技巧# 1. 使用 .dockerignore # .dockerignore .git .mvn target/classes test # 2. 非root用户运行 RUN addgroup -S appgroup adduser -S appuser -G appgroup USER appuser # 3. 镜像大小对比 # openjdk:21-jdk 470MB # eclipse-temurin:21-jre-alpine 90MB # 节省 80%回到顶部七、常用命令速查docker images docker ps -a docker logs -f myapp docker stats