为什么需要 Docker
- 环境一致性:开发、测试、生产环境完全一致
- 快速部署:秒级启动,秒级扩容
- 资源隔离:每个容器独立运行,互不影响
- CI/CD 友好:与 Jenkins/GitHub Actions 无缝集成
回到顶部
二、Spring Boot 项目准备
<!-- pom.xml --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-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 --from=builder /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_ACTIVE=prod \ -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_ACTIVE=prod - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb depends_on: db: condition: service_healthy restart: always db: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=mydb 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