Docker容器化Spring Boot:从构建到部署的完整实战
2026/6/30 2:41:26 网站建设 项目流程

环境准备

  • 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 --from=builder /app/target/*.jar app.jar # 设置权限 RUN chown -R appuser:appgroup /app USER appuser # 环境变量 ENV JAVA_OPTS="-Xms256m -Xmx512m" ENV SPRING_PROFILES_ACTIVE=prod # 健康检查 HEALTHCHECK --interval=30s --timeout=3s \ CMD wget --quiet --tries=1 --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_ACTIVE=prod - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=secret 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 代替 localhost

jdbc:mysql://host.docker.internal:3306/mydb

Q: 内存溢出?

在Dockerfile中设置JVM堆内存限制

ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC"

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询