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.0
、myapp:latest
- 标签管理有助于回滚、升级与多环境发布。
六、镜像的最佳实践与优化
- 选择合适的基础镜像:如 Alpine 体积小,Ubuntu 兼容性强。
- 尽量合并 RUN 指令,减少层数。
- 清理无用文件,如 apt-get clean、删除缓存。
- 多阶段构建:只将最终产物复制到生产镜像。
- 只添加必要内容,避免泄露敏感信息(如源码、证书)。
- 合理使用 .dockerignore 文件,排除不需要加入镜像的文件。
七、镜像安全
- 定期扫描:使用 trivy、clair 等工具扫描漏洞。
- 只用可信镜像:优先使用官方或权威源发布的镜像。
- 最小权限原则:镜像不应以 root 用户运行。
八、常见命令速查
docker pull 镜像名:标签 # 拉取镜像
docker images # 查看本地镜像
docker rmi 镜像名/ID # 删除镜像
docker build -t 名:标签 . # 构建镜像
docker tag 源名 目标名 # 镜像重命名/打标签
docker save/load # 镜像导出/导入
docker history 镜像名 # 查看镜像构建历史