一个 Docker 镜像包含运行应用程序所需的一切,可以分为以下几个核心部分:
📁 1. 文件系统层(Layers)
镜像由多个只读层叠加而成,每层都是一个文件系统差异:
dockerfile
# Dockerfile 示例
FROM ubuntu:20.04 # 基础层(Base Layer)
RUN apt update && apt install -y curl # 新的一层(安装curl)
COPY app.py /app/ # 新的一层(复制文件)
CMD ["python", "/app/app.py"] # 元数据层
实际查看:
bash
# 查看镜像层
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE
a99ab39ee2e9 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon... 0B
<missing> 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 2 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx... 0B
<missing> 2 weeks ago /bin/sh -c apt-get update && apt-get install... 41.5MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.12 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.25.3 0B
<missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do... 0B
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:db2abcf67a5b6a5d0... 80.8MB
🗂️ 2. 具体包含的内容
A. 操作系统文件(精简版)
bash
# 一个典型的 Linux 镜像包含:
/
├── bin/ # 基础命令:sh, ls, cp, mv, rm 等
├── etc/ # 配置文件
├── lib/ # 共享库(.so文件)
├── usr/ # 用户程序
├── var/ # 可变数据(日志、缓存等)
├── tmp/ # 临时文件
└── opt/ # 可选应用软件
注意 :Docker 镜像是精简的,只包含运行应用必需的组件,不是完整发行版。
B. 应用程序及其依赖
bash
# 以 Python 应用镜像为例:
/
├── app.py # 你的应用代码
├── requirements.txt # Python依赖列表
├── /usr/local/lib/python3.9/ # Python解释器和标准库
├── /usr/bin/python3 # Python可执行文件
└── /app/ # 应用目录
C. 运行时环境
- 解释器/运行时 :如
python、node、java - 系统库 :
glibc、openssl、zlib - 配置文件:时区、语言环境、SSL证书
📄 3. 镜像元数据(Manifest/Config)
A. OCI 镜像规范结构
json
// manifest.json(描述镜像结构)
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a..."
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 32577027,
"digest": "sha256:6c123565ed5..."
}
]
}
B. 容器配置(config.json)
json
{
"User": "nginx", // 运行时用户
"ExposedPorts": {"80/tcp": {}}, // 暴露端口
"Env": ["PATH=/usr/bin", "NGINX_VERSION=1.25"], // 环境变量
"Entrypoint": ["/docker-entrypoint.sh"], // 入口点
"Cmd": ["nginx", "-g", "daemon off;"], // 默认命令
"WorkingDir": "/usr/share/nginx/html", // 工作目录
"Volumes": {"/var/log/nginx": {}}, // 挂载点
"Labels": {"maintainer": "NGINX Docker Maintainers"}
}
🔍 4. 实际查看镜像内容
方法1:直接进入容器查看
bash
$ docker run -it --rm ubuntu:20.04 bash
root@container:/# ls /
bin boot dev etc home lib lib32 lib64 media mnt opt proc root run sbin srv sys tmp usr var
方法2:解压镜像文件
bash
# 保存镜像为tar包
$ docker save nginx:latest -o nginx.tar
# 解压查看
$ tar -xf nginx.tar
$ ls
manifest.json [layers].tar repositories
# 查看具体层的内容
$ tar -tf layer.tar | head -20
./usr/
./usr/sbin/
./usr/sbin/nginx
./var/
./var/cache/
./var/cache/nginx/
...
方法3:使用 dive 工具可视化
bash
$ dive nginx:latest
🎯 5. 不同类型镜像的内容对比
| 镜像类型 | 包含内容 | 大小 |
|---|---|---|
| Alpine | musl libc、busybox工具集 | ~5MB |
| Ubuntu | glibc、apt、常用工具 | ~70MB |
| Python | Python运行时、pip、基础库 | ~100MB |
| Node.js | Node.js、npm、yarn | ~150MB |
| 完整应用 | OS + 运行时 + 应用代码 + 配置 | 自定义 |
💡 关键理解点
- 分层存储:每个Dockerfile指令创建新层,层可复用
- 只读性:镜像层不可修改,容器在顶层添加可写层
- 最小化原则:只包含运行所需的最小组件
- 可重复性:相同镜像在任何环境内容一致