本文目录导读:

- 案例1:简单的Python Web应用
- 案例2:Node.js应用(多阶段构建)
- 案例3:Java Spring Boot应用(优化大小)
- 案例4:Go应用(极小镜像)
- 案例5:Python机器学习应用(带GPU支持)
- 案例6:最佳实践模板
- 关键最佳实践:
我来提供几个常见的Dockerfile编写案例,从简单到复杂。
案例1:简单的Python Web应用
# Python Web应用
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
案例2:Node.js应用(多阶段构建)
# 多阶段构建 - Node.js应用 # 构建阶段 FROM node:16-alpine AS builder WORKDIR /app # 复制package.json和package-lock.json COPY package*.json ./ # 安装依赖 RUN npm ci --only=production # 复制源代码 COPY . . # 构建应用 RUN npm run build # 生产阶段 FROM nginx:alpine # 复制构建产物到nginx COPY --from=builder /app/build /usr/share/nginx/html # 复制nginx配置 COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
案例3:Java Spring Boot应用(优化大小)
# Java Spring Boot应用 - 使用JRE FROM maven:3.8-openjdk-11 AS build WORKDIR /app # 复制pom.xml和源代码 COPY pom.xml . COPY src ./src # 构建应用(跳过测试) RUN mvn package -DskipTests # 运行阶段 - 使用轻量级JRE FROM openjdk:11-jre-slim WORKDIR /app # 创建非root用户 RUN groupadd -r spring && useradd -r -g spring spring # 复制jar包 COPY --from=build /app/target/*.jar app.jar # 切换用户 USER spring EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
案例4:Go应用(极小镜像)
# Go应用 - 使用scratch生成极小镜像 # 构建阶段 FROM golang:1.18-alpine AS builder WORKDIR /app # 设置Go代理 ENV GOPROXY=https://goproxy.cn,direct # 复制go.mod和go.sum COPY go.mod go.sum ./ RUN go mod download # 复制源代码 COPY . . # 静态编译 RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o main . # 运行阶段 - 使用scratch最小镜像 FROM scratch # 拷贝时区和证书 COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder /app/main /main # 如果应用需要时区 # COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime EXPOSE 8080 ENTRYPOINT ["/main"]
案例5:Python机器学习应用(带GPU支持)
# 机器学习应用 - 带GPU支持
FROM tensorflow/tensorflow:2.9.2-gpu
# 设置环境
ENV PYTHONUNBUFFERED=1 \
DEBIAN_FRONTEND=noninteractive
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
libgl1-mesa-glx \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
# 复制模型和代码
COPY models/ ./models/
COPY src/ ./src/
EXPOSE 8501
# 启动Streamlit应用
CMD ["streamlit", "run", "src/app.py", "--server.port=8501"]
案例6:最佳实践模板
# ===== 最佳实践模板 =====
FROM ubuntu:22.04 AS base
# 元数据
LABEL maintainer="yourname@example.com" \
version="1.0.0" \
description="最佳实践示例"
# 避免交互式提问
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Shanghai
# 使用国内源(用于加速)
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && \
apt-get install -y --no-install-recommends \
curl \
ca-certificates \
tzdata \
&& ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 普通用户
RUN groupadd -r myapp && useradd -r -g myapp -s /sbin/nologin myapp
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# 切换用户
USER myapp
# 复制文件
COPY --chown=myapp:myapp . .
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["./start.sh"]
关键最佳实践:
构建优化
- 合并RUN命令,减少层数
- 利用Docker缓存(先复制依赖文件)
- 使用.dockerignore排除不必要文件
.dockerignore文件
.git node_modules __pycache__ *.pyc *.log .env .DS_Store dist/ .vscode/
安全最佳实践
- 使用非root用户运行
- 使用轻量级基础镜像
- 定期更新基础镜像
- 不存储敏感信息
性能优化
- 使用多阶段构建
- 选择合适的镜像大小
- 使用特定版本的依赖
调试技巧
# 进入容器调试 docker run -it --entrypoint /bin/bash image_name # 查看构建历史 docker history image_name # 多阶段构建查看中间层 docker build --target builder -t debug_image .
这些案例覆盖了常见的应用场景,可以根据实际需求调整使用,记得根据项目特点选择合适的Dockerfile编写策略。