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. 可重复性:相同镜像在任何环境内容一致
相关推荐
sg_knight2 小时前
如何通过 SQL*Plus 连接 Oracle 数据库(使用 Instant Client)
运维·数据库·sql·oracle·database·关系型数据库·sql puls
API开发2 小时前
apiSQL网关 for Docker 离线安装和升级教程
运维·docker·容器·api·api网关·apisql·替代graphql
木子欢儿2 小时前
探索 OpenMediaVault 安装
linux·运维·服务器
Linux运维技术栈2 小时前
运维安全: SSH 公钥认证算法加固
linux·运维·安全
斯普信专业组2 小时前
Nacos-MCP 融合架构:运维nacos的MCP服务项目
运维·nacos·架构
小钻风33662 小时前
Docker入门基础知识(一)
运维·docker·容器
70asunflower2 小时前
Docker Daemon(Docker 守护进程)完全解析
docker·容器·eureka
小钻风33662 小时前
Docker入门基础知识(二)
运维·docker·容器
深圳市恒讯科技2 小时前
2026新加坡服务器配置全攻略:SSL证书、硬件防火墙与CDN加速
运维·服务器·ssl