Docker 镜像的完整内容解析

一个 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. 运行时环境

  • 解释器/运行时 :如 pythonnodejava
  • 系统库glibcopensslzlib
  • 配置文件:时区、语言环境、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 + 运行时 + 应用代码 + 配置 自定义

💡 关键理解点

  1. 分层存储:每个Dockerfile指令创建新层,层可复用
  2. 只读性:镜像层不可修改,容器在顶层添加可写层
  3. 最小化原则:只包含运行所需的最小组件
  4. 可重复性:相同镜像在任何环境内容一致
相关推荐
牛奶咖啡1340 分钟前
基于Cobbler的系统自动化安装部署——原理
运维·自动化·dhcp·pxe·cobbler·tftp·自动应答配置文件种类
Felven40 分钟前
飞腾平台 UEFI 与 U-Boot 启动方案对比及选型建议
运维·uefi·uboot·飞腾
一只自律的鸡1 小时前
【Linux系统编程】进程 守护进程与实现/系统日志
linux·运维·服务器
tobias.b1 小时前
ubuntu 系统维护
linux·运维·ubuntu
门豪杰1 小时前
使用WSL2安装Ubuntu子系统
linux·运维·ubuntu·wsl
面对疾风叭!哈撒给1 小时前
Linux之Docker使用JDK21安装包制作JDK21镜像包
java·linux·运维·docker
绘梨衣的sakura路1 小时前
[特殊字符] 2026 年 AI 自动化新范式:OpenClaw 核心 Skill 精选与实战指南
运维·人工智能·自动化
big tail1 小时前
Windows本地Docker模拟前端项目发版
前端·windows·docker
点正2 小时前
全栈工程师:运维篇(二):docker-compose 理解
docker
芥子沫2 小时前
Linux下编程有什么优势?
linux·运维·服务器