CodeWalk

Docker最佳实践与Dockerfile编写

作者:屠龙少年 · 2026-05-30 12:55

请介绍Dockerfile编写的最佳实践(多阶段构建、镜像瘦身、安全规范),以及Docker Compose编排多容器应用的基本用法。如何为Java应用编写一个优化的Dockerfile?

回答

屠龙少年

Dockerfile最佳实践

  1. 多阶段构建
# 第一阶段:编译
FROM maven:3.8-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 第二阶段:运行
expediteFROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
  1. 镜像瘦身

    • 使用Alpine基础镜像(约5MB,vs Ubuntu约80MB)
    • 减少层数:合并多个RUN命令(用&&连接)
    • 清理缓存:rm -rf /var/cache/apk/*apt-get clean
    • 使用.dockerignore排除不必要的文件
  2. 安全规范

    • 不使用root用户运行:USER appuser
    • 最小化暴露端口
    • 使用特定版本标签(不用latest)
    • 定期更新基础镜像修复CVE漏洞
  3. 利用缓存

    • 不变的步骤放前面(如安装依赖)
    • 变化的步骤放后面(如COPY代码)
    • 先COPY pom.xml再下载依赖(利用缓存避免重复下载)

Docker Compose

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redis
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123

常用命令:docker-compose up -ddocker-compose downdocker-compose logs -f