OCI(开放容器倡议)是什么?
什么是 OCI?
OCI(Open Container Initiative,开放容器倡议) 是一个致力于制定容器格式和运行时的开放工业标准的项目。它于 2015 年 6 月由 Docker、CoreOS、Google、Red Hat 等公司共同创立。
graph TB
subgraph OCI 的诞生
DOCKER[Docker 率先定义了镜像和容器格式]
COREOS[CoreOS 开发了 App Container 规范]
INDUSTRY[业界意识到需要统一标准]
DOCKER -->|2015.6.22| OCI[OCI 成立]
COREOS -->|加入| OCI
INDUSTRY -->|推动| OCI
end
subgraph OCI 基金会
OCI --> LF[Linux 基金会托管]
OCI --> SPECS[制定和维护规范]
end
OCI 的两个核心规范
OCI 制定了两个关键规范:
graph LR
subgraph OCI 规范体系
OCI[OCI] --> IS[Image Spec
镜像规范]
OCI --> RS[Runtime Spec
运行时规范]
end
subgraph Image Spec
IS --> IS1[镜像格式定义]
IS --> IS2[层文件系统 tar.gz 格式]
IS --> IS3[config.json 配置]
IS --> IS4[manifest 清单]
end
subgraph Runtime Spec
RS --> RS1[config.json 容器配置]
RS --> RS2[文件系统布局]
RS --> RS3[生命周期操作 create/start/stop]
end
1. OCI Image Spec(镜像规范)
定义了镜像的标准格式和内容:
// OCI 镜像 config.json 示例
{
"architecture": "amd64",
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:a1b2c3...",
"sha256:d4e5f6..."
]
},
"config": {
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["bash"],
"Entrypoint": null
}
}
graph TB
subgraph OCI 镜像布局
INDEX[index.json<br/>镜像索引]
BLOBS[blobs/]
BLOBS --> M[manifest<br/>sha256=...]
BLOBS --> C[config<br/>sha256=...]
BLOBS --> L1[layer 1<br/>sha256=...]
BLOBS --> L2[layer 2<br/>sha256=...]
INDEX -->|指向| M
M -->|指向| C
M -->|指向| L1
M -->|指向| L2
end
2. OCI Runtime Spec(运行时规范)
定义了容器的运行时行为和生命周期:
graph LR
subgraph 容器生命周期(OCI Runtime Spec)
START[开始] -->|create| CREATED[Created<br/>创建配置]
CREATED -->|start| RUNNING[Running<br/>运行进程]
RUNNING -->|kill| STOPPED[Stopped<br/>停止]
RUNNING -->|pause| PAUSED[Paused<br/>暂停]
PAUSED -->|resume| RUNNING
CREATED -->|delete| DEL[Deleted<br/>清理]
STOPPED -->|delete| DEL
end
OCI 的生态影响
graph TB
subgraph OCI 兼容实现
runc[runC<br/>Docker 出品<br/>参考实现]
crun[crun<br/>Red Hat 出品<br/>C 语言实现]
youki[youki<br/>Rust 语言实现]
gVisor[gVisor<br/>Google 出品<br/>内核层隔离]
Kata[Kata Containers<br/>轻量虚拟化]
end
subgraph OCI Specs
RTS[Runtime Spec<br/>v1.0 / v1.1]
IS[Image Spec<br/>v1.0 / v1.1]
end
RTS --> runc & crun & youki & gVisor & Kata
IS --> runc & crun & youki
主要 OCI 兼容实现
| 实现 | 语言 | 特点 |
|---|---|---|
| runc | Go | Docker 的默认运行时,OCI 参考实现 |
| crun | C | 内存占用更小,启动更快 |
| youki | Rust | 安全,性能好 |
| gVisor | Go | 提供应用层内核,强隔离 |
| Kata Containers | Go | 每个容器运行轻量级 VM |
| Firecracker | Rust | AWS Lambda/Fargate 使用的微 VM |
OCI 标准如何影响日常 Docker 使用
1. 镜像的互操作性
# 任何符合 OCI 标准的工具都可以构建和解析 Docker 镜像
# Docker 镜像本质上就是 OCI 镜像
# 使用其他 OCI 兼容工具构建
podman build -t myapp . # Red Hat 的容器工具
nerdctl build -t myapp . # containerd 的命令行工具
buildah build -t myapp . # 无守护进程构建
# 这些镜像都可以被 Docker 运行
docker run myapp
docker run registry.example.com/buildah-image:v1
2. 运行时的可替换性
# Docker 默认使用 runc,但可以替换
# 查看当前运行时
docker info | grep "Runtimes"
# Runtimes: io.containerd.runc.v2 runc
# 切换到 crun(更轻量)
# 需要在 dockerd 配置中注册
# 或使用 Podman(默认 crun)
# 使用 gVisor(更强的安全隔离)
docker run --runtime=runsc myapp # runsc = gVisor
OCI 对行业的意义
graph TB
subgraph 标准化之前
DOCKER_PRE[Docker 自己定义格式]
COREOS_PRE[CoreOS AppC 格式]
RKT_PRE[rkt 自己的格式]
SPLIT[碎片化严重<br/>工具互不兼容]
end
subgraph 标准化之后
OCI_STD[OCI 标准]
DOCKER_OK[Docker 兼容 OCI]
PODMAN_OK[Podman 兼容 OCI]
K8S_OK[K8S CRI 对接 OCI 运行时]
UNITE[生态大一统]
end
DOCKER_PRE --> UNITE
COREOS_PRE --> UNITE
RKT_PRE --> UNITE
OCI_STD --> UNITE
OCI 的出现意味着:
– 镜像标准统一:Docker 构建的镜像,Podman/nerdctl 都可以运行
– 运行时可以替换:不需要修改上层编排工具,就可以换更安全或更高效的运行时
– 生态开放:任何公司都可以实现自己的兼容运行时
面试问答
问:Docker 和 OCI 的关系是什么?
答:Docker 是 OCI 标准的主要发起者和推动者。Docker 将自己的镜像格式和运行时贡献给了 OCI 作为标准的基础,Docker 的 runc 就是 OCI 的官方参考实现。现在 Docker 完全兼容 OCI 标准。
问:没有 OCI 会怎样?
答:会出现类似”操作系统碎片化”的局面:每种容器工具定义自己的镜像格式,不能互通。开发者必须为 Docker、Podman、rkt 等分别构建不同格式的镜像。
总结
OCI 是容器生态的“通用语言”。它让”Build, Ship, Run”不局限于某个特定工具——你可以用 Podman 构建、用 Docker 推送、用 cri-o 在 K8S 中运行。标准化的力量,让整个容器生态繁荣起来。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容