插件窝 干货文章 一起跟我来学dockerfile创建镜像

一起跟我来学dockerfile创建镜像

Dockerfile 镜像 构建 使用 839    来源:    2025-05-20

Dockerfile 创建镜像完全指南

Dockerfile 是构建 Docker 镜像的脚本文件,包含了一系列指令来定义如何构建镜像。下面我将详细介绍如何使用 Dockerfile 创建自定义镜像。

1. Dockerfile 基础

基本结构

一个典型的 Dockerfile 包含以下部分: - 基础镜像 (FROM) - 维护者信息 (LABEL) - 镜像操作指令 (RUN, COPY, ADD 等) - 容器启动时执行的命令 (CMD, ENTRYPOINT)

示例 Dockerfile

# 指定基础镜像
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="yourname@example.com"

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 更新软件包列表并安装必要软件
RUN apt-get update && \
    apt-get install -y \
    nginx \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 复制本地文件到镜像中
COPY index.html /var/www/html/

# 暴露端口
EXPOSE 80

# 容器启动时运行的命令
CMD ["nginx", "-g", "daemon off;"]

2. Dockerfile 指令详解

常用指令

  1. FROM - 指定基础镜像

    FROM ubuntu:20.04
    
  2. RUN - 执行命令

    RUN apt-get update && apt-get install -y package
    
  3. COPY - 复制文件

    COPY ./local/path /container/path
    
  4. ADD - 类似 COPY,但功能更多(可解压tar包,可从URL下载)

    ADD http://example.com/file.tar.gz /tmp/
    
  5. CMD - 容器启动时执行的命令

    CMD ["executable", "param1", "param2"]
    
  6. ENTRYPOINT - 类似CMD,但不会被docker run参数覆盖

    ENTRYPOINT ["executable", "param1", "param2"]
    
  7. ENV - 设置环境变量

    ENV PATH /usr/local/bin:$PATH
    
  8. ARG - 构建时变量

    ARG version=1.0
    
  9. EXPOSE - 声明暴露的端口

    EXPOSE 80
    
  10. WORKDIR - 设置工作目录

    WORKDIR /app
    
  11. USER - 指定运行用户

    USER nobody
    
  12. VOLUME - 创建挂载点

    VOLUME /data
    

3. 构建镜像

基本构建命令

docker build -t my-image:1.0 .
  • -t 指定镜像名称和标签
  • . 表示使用当前目录下的 Dockerfile

构建上下文

Docker 构建时会将当前目录(构建上下文)发送给 Docker 守护进程,因此建议: - 使用 .dockerignore 文件排除不需要的文件 - 将 Dockerfile 放在专门目录中,避免发送过多文件

多阶段构建

对于需要编译的应用,可以使用多阶段构建减少最终镜像大小:

# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 第二阶段:运行应用
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

4. 最佳实践

  1. 使用官方镜像:尽量使用官方镜像作为基础镜像

  2. 减少层数:合并 RUN 指令减少镜像层数

    RUN apt-get update && \
       apt-get install -y package1 package2 && \
       rm -rf /var/lib/apt/lists/*
    
  3. 清理缓存:安装软件后清理 apt/yum 缓存

  4. 使用特定标签:避免使用 latest 标签

    FROM ubuntu:20.04
    
  5. 最小化镜像:使用 alpine 等轻量级基础镜像

  6. 非root用户:使用非 root 用户运行应用

    RUN groupadd -r appuser && useradd -r -g appuser appuser
    USER appuser
    
  7. 健康检查:添加 HEALTHCHECK 指令

    HEALTHCHECK --interval=30s --timeout=3s \
     CMD curl -f http://localhost/ || exit 1
    
  8. 标签信息:使用 LABEL 添加元数据

    LABEL version="1.0" \
         description="My custom image"
    

5. 调试技巧

  1. 构建缓存

    • 使用 --no-cache 禁用缓存:docker build --no-cache -t my-image .
    • 在需要重新构建的指令前添加注释 # nocache
  2. 检查构建过程

    docker history my-image
    
  3. 交互式调试

    docker run -it --rm --entrypoint /bin/bash my-image
    
  4. 分析镜像

    docker inspect my-image
    

6. 实际案例

Python 应用示例

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV FLASK_APP=app.py
ENV FLASK_ENV=production

EXPOSE 5000

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Node.js 应用示例

FROM node:14-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install --production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

通过掌握这些 Dockerfile 知识,您应该能够创建高效、安全的 Docker 镜像来满足各种应用场景的需求。