镜像(Image)详解——AI教你学Docker

发布于:2025-06-26 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.3 镜像(Image)详解

Docker 镜像(Image)是构建和运行容器的基础。理解镜像的结构、制作、管理和优化,是成为 Docker 专家的关键一步。

一、什么是 Docker 镜像?

  • 定义:镜像是一个只读模板,包含了应用运行所需的代码、库、依赖、配置文件,以及运行环境(如操作系统底层依赖)。
  • 作用:镜像用于创建容器。容器运行时会基于镜像生成一个可写层,作为应用的运行环境。
  • 本质:本质上,镜像是一组分层的文件系统快照(Layer)。

二、镜像的结构与分层机制

1. 分层(Layer)

  • 每一层是只读的文件系统变更(如增加文件、安装依赖等)。
  • 镜像的最底层一般是基础操作系统(如 Ubuntu、Alpine 等)。
  • 后续每一层代表 Dockerfile 中的一个指令(如 RUN、COPY、ADD)。
  • 镜像的分层允许镜像复用缓存加速,大大提升构建效率。
分层示意图
+------------------------+
| 应用文件/配置(RUN、COPY等)|
+------------------------+
| 安装依赖(RUN apt-get等)  |
+------------------------+
| 基础OS层(FROM ubuntu)    |
+------------------------+

2. 分层优势

  • 高效复用:相同的基础层只需下载一次,多个镜像间可共享。
  • 缓存加速:镜像构建时复用已有层,只有变更的部分才会新增层。
  • 小幅更新:升级应用时只需下载最新变化层。

三、镜像的获取与管理

1. 获取镜像

  • 拉取镜像
    docker pull [镜像名]:[标签]
    # 例:docker pull nginx:latest
    
  • 镜像标签(tag):区分同一镜像的不同版本,如 nginx:1.24
  • 默认仓库:不指定仓库时默认从 Docker Hub 获取。

2. 查看本地镜像

docker images            # 列出本地所有镜像
docker images -a         # 包含中间层镜像
docker image inspect [ID] # 查看镜像详细信息

3. 删除镜像

docker rmi [镜像名或ID]   # 删除镜像
docker image prune       # 删除所有未被容器使用的镜像

4. 镜像导入导出

  • 导出镜像到本地 tar 包
    docker save -o myimage.tar [镜像名:标签]
    
  • 从 tar 包导入镜像
    docker load -i myimage.tar
    
  • 导入其他格式快照
    docker import [文件或URL] [镜像名:标签]
    # 与 load 区别:import 可以从容器快照生成镜像
    

四、自定义镜像制作(Dockerfile)

1. 编写 Dockerfile

  • Dockerfile 是描述镜像构建过程的脚本文件,包含一系列“指令”。
  • 常用指令有:
    • FROM:指定基础镜像
    • RUN:执行命令
    • COPY/ADD:复制文件
    • CMD/ENTRYPOINT:容器启动命令
    • ENV:设置环境变量
    • EXPOSE:声明端口
    • WORKDIR:工作目录

示例 Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . /app
CMD ["python", "main.py"]

2. 构建镜像

docker build -t myapp:latest .
# -t 指定镜像名:标签,. 表示当前目录为构建上下文

3. 多阶段构建(Multi-stage Build)

  • 利用多个 FROM,减少最终镜像体积,提升安全性和构建效率。
FROM node:20 as builder
WORKDIR /src
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /src/dist /usr/share/nginx/html

五、镜像的版本和标签管理

  • 每个镜像可有多个标签(tag),如 myapp:1.0myapp:latest
  • 标签管理有助于回滚、升级与多环境发布。

六、镜像的最佳实践与优化

  1. 选择合适的基础镜像:如 Alpine 体积小,Ubuntu 兼容性强。
  2. 尽量合并 RUN 指令,减少层数。
  3. 清理无用文件,如 apt-get clean、删除缓存。
  4. 多阶段构建:只将最终产物复制到生产镜像。
  5. 只添加必要内容,避免泄露敏感信息(如源码、证书)。
  6. 合理使用 .dockerignore 文件,排除不需要加入镜像的文件。

七、镜像安全

  • 定期扫描:使用 trivy、clair 等工具扫描漏洞。
  • 只用可信镜像:优先使用官方或权威源发布的镜像。
  • 最小权限原则:镜像不应以 root 用户运行。

八、常见命令速查

docker pull 镜像名:标签     # 拉取镜像
docker images              # 查看本地镜像
docker rmi 镜像名/ID       # 删除镜像
docker build -t 名:标签 .   # 构建镜像
docker tag 源名 目标名      # 镜像重命名/打标签
docker save/load           # 镜像导出/导入
docker history 镜像名      # 查看镜像构建历史

九、参考资料