什么是 Dockerfile
Dockerfile 是一个文本文件,包含用于构建 Docker 镜像的一系列指令。Docker 引擎按照指令顺序逐层构建镜像。
基本结构
# 基础镜像
FROM node:18-alpine
# 工作目录
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
# 安装依赖
RUN npm ci --production
# 复制源码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
为什么需要 Dockerfile 生成器
- 降低学习成本:不需要记住所有指令语法
- 减少配置错误:自动生成最佳实践配置
- 加速容器化:快速为项目创建 Docker 配置
- 统一规范:团队使用统一的 Dockerfile 模板
- 多语言支持:为不同技术栈生成合适的配置
- 最佳实践内置:自动应用安全和性能优化
Dockerfile 常用指令
| 指令 | 说明 | 示例 |
|------|------|------|
| FROM | 指定基础镜像 | FROM node:18-alpine |
| WORKDIR | 设置工作目录 | WORKDIR /app |
| COPY | 复制文件到镜像 | COPY . . |
| RUN | 执行命令 | RUN npm install |
| EXPOSE | 声明端口 | EXPOSE 3000 |
| CMD | 容器启动命令 | CMD ["npm", "start"] |
| ENV | 设置环境变量 | ENV NODE_ENV=production |
| ARG | 构建参数 | ARG VERSION=1.0 |
| ENTRYPOINT | 入口点 | ENTRYPOINT ["node"] |
| ADD | 复制并解压 | ADD archive.tar.gz /app |
多阶段构建
多阶段构建可以显著减小最终镜像大小:
# 阶段1:构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 阶段2:生产
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
镜像优化技巧
| 技巧 | 说明 | 效果 |
|------|------|------|
| 使用 Alpine 基础镜像 | alpine 替代 ubuntu | 镜像从 ~100MB → ~5MB |
| 多阶段构建 | 构建和运行分离 | 移除构建工具 |
| .dockerignore | 排除不需要的文件 | 减小构建上下文 |
| 减少层数 | 合并 RUN 命令 | 减少镜像层数 |
| 利用缓存 | 先 COPY 依赖文件 | 加速重复构建 |
| 固定版本 | node:18.19.0 替代 node:latest | 保证可复现 |
FAQ
Dockerfile 和 docker-compose 有什么关系?
Dockerfile 定义单个镜像的构建过程。docker-compose 定义多容器应用的编排配置。一个 docker-compose 文件可以引用多个 Dockerfile 构建的镜像。
为什么镜像这么大?
常见原因:使用了完整版基础镜像(如 node 而非 node-alpine)、未使用多阶段构建、COPY 了 node_modules 等大文件。使用 docker images 查看镜像大小,逐步优化。
如何安全存储密码和密钥?
使用 Docker Secrets 或环境变量,不要写入 Dockerfile。生产环境使用 docker secret 或 Kubernetes Secrets。开发环境使用 .env 文件(不要提交到 Git)。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。