第51章:Containerd 与 Podman
11 分钟阅读
第五十一章:Containerd 与 Podman
51.1 Containerd 简介
Containerd是什么?
如果说Docker是一个"全能管家",那Containerd就是管家的"专业部门"——专门负责容器生命周期的管理。
Containerd是CNCF(云原生计算基金会)的毕业项目,它是从Docker中剥离出来的容器运行时。
flowchart TB
subgraph "Docker(以前)"
D[Docker Daemon]
D --> C[containerd]
C --> R[runc]
R --> Cont[容器]
end
subgraph "Docker(现在)"
D2[Docker Daemon]
D2 --> C2[containerd]
C2 --> R2[runc]
R2 --> Cont2[容器]
end
style C fill:#ff9999
style C2 fill:#ff9999Containerd的历史
2013年:Docker诞生,containerd是Docker的一部分
↓
2015年:Docker将containerd贡献给CNCF
↓
2017年:Docker 1.11开始使用containerd
↓
2019年:containerd成为CNCF毕业项目
↓
2022年:containerd 1.6发布,成为Kubernetes默认运行时
Containerd vs Docker
| 对比项 | Containerd | Docker |
|---|---|---|
| 定位 | 容器运行时 | 容器平台 |
| 功能 | 容器生命周期管理 | 构建、运行、网络、存储… |
| 复杂性 | 简单 | 复杂 |
| 使用场景 | Kubernetes节点 | 开发、测试 |
Containerd的架构
flowchart TB
subgraph "Containerd架构"
API[Containerd API<br/>GRPC]
API --> S[Service Layer<br/>服务层]
S --> M[Metadata Store<br/>元数据]
S --> S2[Snapshotter<br/>快照管理]
S --> C[Container<br/>容器]
C --> R[runtime<br/>运行时]
R --> O[OCI Runtime<br/>如runc]
end
style API fill:#99ccff
style S fill:#90EE90
style R fill:#ff9999Containerd的核心功能:
- 镜像管理:拉取、推送镜像
- 容器管理:创建、启动、停止容器
- 快照管理:管理容器的文件系统快照
- 网络管理:管理容器网络
为什么要用Containerd?
理由1:Kubernetes默认运行时
- Kubernetes从1.24开始默认使用containerd
- 更轻量,更稳定
理由2:简单直接
- 没有Docker那么复杂
- 只需要容器运行时
理由3:减少依赖
- 不需要完整的Docker
- 减少维护成本
Containerd适用场景
| 场景 | 适合使用Containerd |
|---|---|
| Kubernetes节点 | ✅ 最常见 |
| 边缘计算 | ✅ 资源受限 |
| 嵌入式系统 | ✅ 轻量 |
小结
Containerd是什么?
- 容器运行时:管理容器生命周期
- Docker的组件:从Docker剥离出来
- CNCF项目:云原生标准
Containerd vs Docker:
- 更轻量
- 更专注
- K8s默认支持
下一节我们将学习如何安装Containerd!
51.2 Containerd 安装
安装前准备
Containerd需要以下组件:
- containerd:主程序
- runc:OCI运行时
- cni:网络插件(可选)
在Ubuntu上安装
方法一:使用apt安装
| |
在CentOS上安装
| |
配置文件说明
| |
安装runc
Containerd需要runc作为OCI运行时:
| |
安装CNI网络插件
| |
Containerd作为Kubernetes运行时
如果要将Containerd配置为Kubelet的运行时:
| |
一图总结安装流程
flowchart TD
A[安装Containerd] --> B[安装runc]
B --> C[安装CNI]
C --> D[配置containerd]
D --> E[启动服务]
E --> F[验证安装]
style A fill:#99ccff
style F fill:#90EE90小结
Containerd安装要点:
apt install containerd或yum install containerd.io- 生成配置文件:
containerd config default - 开启
SystemdCgroup = true - 安装runc和CNI插件
下一节我们将学习 nerdctl命令,这是containerd的命令行工具!
51.3 nerdctl 命令
nerdctl是什么?
nerdctl 是containerd的官方命令行工具,类似于Docker CLI。
flowchart LR
A[nerdctl] --> B[containerd]
C[docker] --> D[dockerd]安装nerdctl
| |
nerdctl vs docker 命令对比
nerdctl的很多命令和Docker类似:
| Docker命令 | nerdctl命令 | 说明 |
|---|---|---|
docker pull | nerdctl pull | 拉取镜像 |
docker images | nerdctl images | 查看镜像 |
docker run | nerdctl run | 运行容器 |
docker ps | nerdctl ps | 查看容器 |
docker exec | nerdctl exec | 进入容器 |
docker logs | nerdctl logs | 查看日志 |
docker build | nerdctl build | 构建镜像 |
镜像操作
| |
容器操作
| |
构建镜像
| |
nerdctl特有功能
| |
使用nerdctl作为Docker替代
| |
小结
nerdctl命令:
- nerdctl是containerd的CLI工具
- 命令与Docker类似
- 支持镜像加密等特有功能
下一节我们将学习 Podman,这是Docker的无守护进程替代品!
51.4 Podman 简介
Podman是什么?
Podman 是Docker的无守护进程替代品,由Red Hat开发。
最大的特点:不需要Docker守护进程(daemon)!
flowchart LR
subgraph "Docker架构"
D[Docker Daemon<br/>需要root运行]
D --> C[容器]
end
subgraph "Podman架构"
U[Podman<br/>无守护进程]
U --> C2[容器]
end
style D fill:#ff9999
style U fill:#90EE90Podman vs Docker
| 对比项 | Podman | Docker |
|---|---|---|
| 守护进程 | 无 | 需要 |
| 运行用户 | 普通用户 | 需要root |
| Pod支持 | 原生支持 | 需要额外工具 |
| 兼容性 | 兼容Docker | - |
| 开发公司 | Red Hat | Docker Inc. |
Podman的优势
1. 无守护进程
- 不需要运行Docker daemon
- 减少资源占用
- 减少攻击面
2. 可以非root运行
- 普通用户可以运行容器
- 更安全
3. 原生支持Pod
- Pod是Kubernetes的概念
- Podman直接支持
4. 兼容Docker
- 可以直接替换Docker
- 零成本迁移
Podman的核心概念
Pod(容器组):
┌─────────────────────────────────┐
│ Pod │
│ ┌───────────┐ ┌───────────┐ │
│ │ Container1│ │ Container2│ │
│ └───────────┘ └───────────┘ │
│ 共享网络和存储 │
└─────────────────────────────────┘
Podman的适用场景
| 场景 | 说明 |
|---|---|
| 开发环境 | 无需root,更安全 |
| 替代Docker | 零成本迁移 |
| 学习K8s | 原生Pod支持 |
| 桌面环境 | 减少资源占用 |
小结
Podman是什么?
- Docker替代品:无守护进程
- Red Hat开发:企业级
- 兼容Docker:命令几乎一样
Podman vs Docker:
- 无需守护进程
- 可非root运行
- 原生Pod支持
下一节我们将详细对比Podman和Docker!
51.5 Podman vs Docker
命令对比
Podman的命令与Docker几乎完全兼容:
| Docker命令 | Podman命令 | 区别 |
|---|---|---|
docker pull | podman pull | 相同 |
docker push | podman push | 相同 |
docker images | podman images | 相同 |
docker run | podman run | 相同 |
docker build | podman build | 相同 |
docker-compose | podman-compose | 需要安装 |
架构对比
flowchart TB
subgraph "Docker"
D[Docker Daemon<br/>root运行]
D --> R[runc]
R --> C[容器]
end
subgraph "Podman"
P[Podman<br/>普通用户运行]
P --> R2[runc]
R2 --> C2[容器]
V[Volume插件]
V -.->|volumes| C2
end
style D fill:#ff9999
style P fill:#90EE90安全对比
| 特性 | Docker | Podman |
|---|---|---|
| root运行 | 需要 | 不需要 |
| 容器root映射 | 可能需要 | 可选 |
| 攻击面 | 较大(daemon) | 较小 |
| SELinux支持 | 有限 | 完整 |
Podman的高级功能
1. 无根容器(Rootless)
| |
2. 原生Pod支持
| |
迁移到Podman
| |
小结
Podman vs Docker:
- 命令兼容,可以无缝切换
- 无守护进程,更安全
- 原生支持Pod
下一节我们将学习Podman的实际使用!
51.6 Podman 使用
Podman安装
| |
镜像操作
| |
容器操作
| |
Pod操作
Podman原生支持Kubernetes Pod:
| |
Pod + 多容器示例
| |
构建镜像
| |
与Docker无缝切换
| |
Podman生成Kubernetes YAML
| |
常用配置
| |
小结
Podman使用要点:
- 安装:
apt install podman或brew install podman - 命令与Docker几乎相同
- 原生支持Pod
- 支持无根运行
本章小结
本章我们学习了Containerd和Podman:
Containerd
| 命令 | 说明 |
|---|---|
containerd --version | 查看版本 |
| 配置文件 | /etc/containerd/config.toml |
nerdctl
- containerd的CLI工具
- 命令与Docker类似
- 支持镜像加密等特有功能
Podman
| 特性 | 说明 |
|---|---|
| 无守护进程 | 更安全 |
| 可非root运行 | 更灵活 |
| 兼容Docker | 零成本迁移 |
| 原生Pod支持 | K8s友好 |
命令对比
| 功能 | Docker | Podman | nerdctl |
|---|---|---|---|
| 拉取镜像 | docker pull | podman pull | nerdctl pull |
| 运行容器 | docker run | podman run | nerdctl run |
| 构建镜像 | docker build | podman build | nerdctl build |
下章预告
下一章我们将学习 Kubernetes,这是容器编排的王者,敬请期待!
趣味彩蛋:Containerd和Podman在一起喝茶,讨论谁是Docker的最佳替代品。
Containerd说:“我是Docker的亲儿子,K8s都用我!” Podman说:“我是无守护进程,安全性碾压你!”
Docker在旁边默默喝着咖啡,心想:“你们都是我生的…” 😏
记住:没有最好的工具,只有最适合你场景的工具! 🛠️