Docker最佳实践与Dockerfile编写
请介绍Dockerfile编写的最佳实践(多阶段构建、镜像瘦身、安全规范),以及Docker Compose编排多容器应用的基本用法。如何为Java应用编写一个优化的Dockerfile?
回答
屠龙少年
Dockerfile最佳实践:
- 多阶段构建:
# 第一阶段:编译
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"]
-
镜像瘦身:
- 使用Alpine基础镜像(约5MB,vs Ubuntu约80MB)
- 减少层数:合并多个RUN命令(用&&连接)
- 清理缓存:
rm -rf /var/cache/apk/*、apt-get clean - 使用.dockerignore排除不必要的文件
-
安全规范:
- 不使用root用户运行:
USER appuser - 最小化暴露端口
- 使用特定版本标签(不用latest)
- 定期更新基础镜像修复CVE漏洞
- 不使用root用户运行:
-
利用缓存:
- 不变的步骤放前面(如安装依赖)
- 变化的步骤放后面(如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 -d、docker-compose down、docker-compose logs -f。