Docker 镜像基础概念

Docker 镜像是轻量级、可执行的独立软件包,包含运行应用程序所需的一切:代码、运行时环境、库和配置。镜像采用分层存储结构,每一层代表镜像构建过程中的一次修改,这种设计提升了复用性和存储效率。

  • 分层存储:镜像由多个只读层(Layer)叠加而成,修改时通过写时复制(Copy-on-Write)机制创建一个新层,而非直接修改原有层。
  • UnionFS:底层使用联合文件系统(如AUFS、Overlay2)合并多层文件系统,呈现为单一视图。

镜像与容器的关系

镜像是静态的模板,容器是镜像的运行实例。启动容器时,Docker 会在镜像层之上添加一个可写层(容器层),所有运行时修改均保存在此层,不影响原始镜像。

镜像构建与管理

通过 Dockerfile 定义镜像构建步骤,每条指令生成一个层。常用指令包括:

  • FROM:指定基础镜像。
  • RUN:执行命令并创建新层。
  • COPY/ADD:将文件复制到镜像中。
  • CMD/ENTRYPOINT:设置容器启动时的默认命令。

示例 Dockerfile

FROM alpine:latest
RUN apk add --no-cache python3
COPY app.py /app/
CMD ["python3", "/app/app.py"]

构建命令:

docker build -t my-app:latest .

镜像仓库与分发

Docker 镜像可推送到公共或私有仓库(如 Docker Hub、Harbor)。常用操作:

  • 登录仓库:docker login
  • 推送镜像:docker push my-repo/my-image:tag
  • 拉取镜像:docker pull my-repo/my-image:tag

优化镜像体积

  • 多阶段构建:在最终镜像中仅保留必要文件。
    FROM golang:1.18 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o app .
    
    FROM alpine:latest
    COPY --from=builder /app/app /app
    CMD ["/app/app"]
    
  • 减少层数:合并多条 RUN 命令,使用 && 连接。
  • 选择轻量基础镜像:如 Alpine Linux(约5MB)替代 Ubuntu。

镜像安全实践

  • 扫描漏洞:使用 docker scan 或工具(如 Clair、Trivy)检测镜像中的已知漏洞。
  • 最小化权限:避免以 root 用户运行容器,通过 USER 指令切换非特权用户。
  • 签名验证:启用 Docker Content Trust(DCT)确保镜像来源可信。

常用命令速查

  • 列出镜像:docker images
  • 删除镜像:docker rmi <image_id>
  • 查看镜像历史:docker history <image_id>
  • 导出/导入镜像:
    docker save -o my-image.tar my-image:tag
    docker load -i my-image.tar
    

高级特性

  • 镜像标签与摘要:每个镜像有唯一摘要(SHA256),标签为可变的别名。
  • 构建缓存:Docker 重用缓存层加速构建,可通过 --no-cache 禁用。
  • 构建参数(ARG):允许动态传递变量至 Dockerfile

通过理解镜像的分层机制、优化策略及安全实践,可以高效构建可靠且轻量的容器化应用。

更多推荐