容器平台总览与跨平台速查
本文件是总览索引 + 跨平台速查,不重复各分册的详细命令。
单平台深度内容请查对应分册(见下方导航)。
更新时间:2026-11(版本事实核对至 2026-11-05)
分册导航
配套:操作系统层见 CentOS-7-10-常规运维指令手册.md / Ubuntu-常用运维指令手册.md,数据库容器化见 MySQL-常用运维指令手册.md。
目录
- 技术栈全景
- 版本生命周期
- 平台选型
- 五大 CLI 命令对照
- 跨平台路径与端口
- 跨平台故障速查
- 跨平台安全基线
- 迁移与互操作
- 统一运维规范
- 附录:常用速查
1. 技术栈全景
1.1 分层关系
| 层 |
组件 |
职责 |
详细分册 |
| 编排层 |
Kubernetes / k3s / Swarm |
多机调度、自愈、滚动发布 |
Kubernetes |
| 单机运行时 + CLI |
Docker Engine / Podman |
镜像、容器、网络、卷管理 |
Docker / Podman |
| 低层运行时 |
containerd / CRI-O |
镜像分发、容器执行(CRI) |
containerd |
| OCI 运行时 |
runc / crun |
创建 namespace/cgroup,exec 进程 |
containerd |
| 镜像格式与仓库 |
OCI Image / Harbor / registry |
存储与分发镜像 |
Harbor |
1.2 必须搞清的四条边界
- Kubernetes 不需要 Docker。v1.24 起内置 dockershim 已移除,kubelet 通过 CRI 直连 containerd/CRI-O。Docker 构建的镜像是 OCI 格式,照样能跑。
- Docker 与 containerd 不是二选一。Docker Engine 内部就带 containerd;29.x 起还有实验性的「内嵌 containerd」模式。
docker 与 podman 命令 90% 兼容,但网络栈、rootless、systemd 集成完全不同,不能简单 alias。
ctr 不是给 k8s 用的。ctr 默认 namespace 是 default,k8s 的镜像在 k8s.io。查 k8s 节点用 crictl。
1.3 一次请求的完整路径
kubectl apply
→ apiserver(认证/准入/写 etcd)
→ controller-manager(创建 ReplicaSet/Pod)
→ scheduler(选节点)
→ kubelet(watch 到 Pod)
→ CRI → containerd(拉镜像、建 sandbox)
→ CNI(分配 IP、配网络)
→ runc(创建 namespace/cgroup,启动进程)
→ 业务进程(PID 1)
排障时按这条链从后往前或从前往后逐段验证,比盲目看日志有效得多。
2. 版本生命周期
2.1 当前版本事实(2026-11)
| 组件 |
当前版本 |
支持窗口 |
关键结论 |
| Kubernetes |
1.37.2(1.37.0 于 2026-08-26) |
N-2:仅 1.35/1.36/1.37 |
1.34 于 2026-10-27 EOL;1.38 预计 2026-12-16 |
| Docker Engine |
29.9.x |
每年 1 个大版本,仅最新版收安全补丁 |
内置 containerd 2.4、BuildKit 0.3x |
| containerd |
2.4.x |
跟随 Docker/k8s |
1.x 自 k8s 1.36 起不受支持 |
| Podman |
5.8.x 稳定线,6.0 已发布 |
滚动,跟随发行版 |
6.0 移除 BoltDB(改 SQLite)、网络转 Netavark/Pasta |
| Harbor |
2.15.x |
最近 3 个 minor,约 9 个月/版 |
升级只支持 n-2 |
2.2 三个决定"能不能建新集群"的时间点
- cgroup v1 已不可用:k8s 1.35 起 kubelet 在 cgroup v1 上默认直接失败。CentOS 7 这类老系统不能再作节点。
- kube-proxy ipvs 模式已弃用(1.35 起):新集群用
iptables 或 nftables。
- Ingress NGINX 已退役(2026-03 归档):新项目上 Gateway API,存量要规划迁移。
2.3 版本识别(一条命令定位)
# 单机
docker version --format '{{.Server.Version}}'
podman version --format '{{.Client.Version}}'
# 运行时
containerd --version; runc --version
# 集群
kubectl version -o yaml | grep gitVersion
kubectl get nodes -o wide # 节点 kubelet 与运行时
# 仓库
curl -sk https://harbor.internal/api/v2.0/systeminfo | jq -r '.harbor_version'
3. 平台选型
3.1 决策树
需要多机编排?
├─ 是 → Kubernetes(标准) / k3s(边缘、单机、资源受限)
└─ 否 → 单机
├─ 需要普通用户跑容器 / 多租户 → Podman(rootless)
├─ RHEL 系且要 systemd 原生集成 → Podman + Quadlet
├─ 工具链强绑 docker.sock / 需要 Swarm → Docker
└─ 只管运行时、被 k8s 调用 → containerd(不直接面向用户)
3.2 对照
| 维度 |
Docker |
Podman |
containerd |
Kubernetes |
| 架构 |
C/S,常驻 daemon |
无 daemon,fork-exec |
常驻 daemon |
分布式控制面 |
| root 权限 |
需 root 或 docker 组 |
原生 rootless |
root |
分层 |
| 编排 |
Compose / Swarm |
pod / kube play |
无 |
完整 |
| 学习成本 |
低 |
低(命令兼容) |
高(底层) |
高 |
| 适合规模 |
单机 |
单机 |
被上层调用 |
多机 |
| 典型用户 |
开发、传统运维 |
RHEL 系、多租户 |
k8s 运维 |
平台团队 |
3.3 常见误区
| 误区 |
事实 |
| "k8s 1.24 之后不能跑 Docker 镜像" |
错。镜像格式无关,只是不再用 dockerd 作运行时 |
| "Podman 就是 Docker 换个名字" |
错。网络栈、rootless、服务化方式完全不同,迁移有坑 |
| "containerd 是 Docker 的一部分,不用单独运维" |
错。独立进程、独立配置、独立升级,k8s 节点上它是关键路径 |
| "Harbor 只是个 registry" |
错。它有 RBAC、复制、扫描、保留策略、配额,是个完整产品 |
| "有了 Harbor 就不需要管磁盘" |
错。删 tag 不等于释放空间,必须跑 GC |
4. 五大 CLI 命令对照
| 操作 |
docker |
podman |
nerdctl |
crictl |
ctr |
| 列容器 |
ps -a |
ps -a |
ps -a |
ps -a |
containers ls |
| 列运行任务 |
ps |
ps |
ps |
ps |
tasks ls |
| 列镜像 |
images |
images |
images |
images |
-n k8s.io images ls |
| 运行 |
run -d |
run -d |
run -d |
需 pod 配置 |
run(底层) |
| 拉镜像 |
pull |
pull |
pull |
pull |
images pull |
| 日志 |
logs -f |
logs -f |
logs -f |
logs -f |
无(看文件) |
| 执行 |
exec -it |
exec -it |
exec -it |
exec -it |
tasks exec |
| 检查 |
inspect |
inspect |
inspect |
inspect / inspecti |
info |
| 删容器 |
rm |
rm |
rm |
rm |
containers rm |
| 删镜像 |
rmi |
rmi |
rmi |
rmi |
images rm |
| 统计 |
stats |
stats |
stats |
stats |
tasks metrics |
| 事件 |
events |
events |
events |
无 |
无 |
| 构建 |
build |
build(buildah) |
build(buildkit) |
无 |
无 |
| 编排 |
compose |
compose / kube play |
compose |
无 |
无 |
| namespace |
隐式 |
隐式 |
-n |
自动(CRI) |
-n(必须显式) |
最容易踩的一条:ctr images ls 看不到 k8s 的镜像,不是镜像没拉到,是 namespace 不同。用 ctr -n k8s.io images ls 或 crictl images。
5. 跨平台路径与端口
5.1 数据与配置路径
| 组件 |
配置 |
数据 |
| Docker |
/etc/docker/daemon.json |
/var/lib/docker |
| Podman(rootful) |
/etc/containers/ |
/var/lib/containers/storage |
| Podman(rootless) |
~/.config/containers/ |
~/.local/share/containers/storage |
| containerd |
/etc/containerd/config.toml、/etc/containerd/certs.d/ |
/var/lib/containerd |
| Kubernetes |
/etc/kubernetes/ |
/var/lib/kubelet、/var/lib/etcd |
| CNI |
/etc/cni/net.d/ |
/var/lib/cni/ |
| Harbor |
/opt/harbor/harbor.yml |
/data/harbor |
5.2 端口
| 端口 |
组件 |
说明 |
| 2375 / 2376 |
Docker daemon |
明文 / TLS(2375 禁止暴露) |
| 5000 |
registry |
私有仓库 |
| 80 / 443 |
Harbor |
Web 与 API |
| 6443 |
kube-apiserver |
集群入口 |
| 2379 / 2380 |
etcd |
客户端 / peer |
| 10250 |
kubelet |
API(exec/logs) |
| 10257 / 10259 |
controller-manager / scheduler |
指标与健康 |
| 30000-32767 |
NodePort |
Service 默认范围 |
| 8472/udp |
Flannel VXLAN |
CNI |
| 4789/udp |
Calico VXLAN |
CNI |
| 4240/tcp |
Cilium |
健康检查 |
| 9323 |
Docker metrics |
metrics-addr |
| 9090 |
Harbor exporter |
指标 |
5.3 Socket
| 组件 |
Socket |
| Docker |
/var/run/docker.sock |
| Podman(rootful) |
/run/podman/podman.sock |
| Podman(rootless) |
/run/user/<uid>/podman/podman.sock |
| containerd |
/run/containerd/containerd.sock |
| CRI(kubelet 用) |
unix:///run/containerd/containerd.sock |
6. 跨平台故障速查
完整版见各分册的「故障速查」章节,这里只列通用症状 → 第一反应。
6.1 容器起不来
| 症状 |
第一反应 |
深入 |
Cannot connect to the daemon |
服务没起 / 权限 |
Docker 分册 18.1 |
| 容器秒退 |
logs + 退出码 |
Docker 分册 8.7 |
OOMKilled(137) |
内存 limit 太小 |
Docker 分册 8.3 / K8s 14.4 |
| 依赖服务连不上 |
网络/DNS |
Docker 分册 10.7 |
| 权限拒绝 |
SELinux 标签 / UID 映射 |
Docker 9.5 / Podman 11.4 |
| 镜像拉不到 |
仓库地址、凭据、CA |
containerd 第 5 章 |
6.2 网络不通
# 通用五步
# 1) 容器内自身监听
docker exec <c> ss -lntp
# 2) 容器 → 宿主
docker exec <c> ping -c2 <host-ip>
# 3) 宿主 → 容器 IP
curl -v http://<container-ip>:<port>
# 4) 外部 → 映射端口
telnet <host-ip> <mapped-port>
# 5) 转发与 DNS
sysctl net.ipv4.ip_forward
docker exec <c> cat /etc/resolv.conf
iptables -t nat -L DOCKER -n -v | head
口诀:容器内通、宿主不通 → 看 iptables/FORWARD;宿主通、外部不通 → 看 firewalld/安全组;只有域名不通 → 看 resolv.conf 与 DNS。
6.3 磁盘满
| 组件 |
高发原因 |
处理 |
| Docker |
容器日志无上限 |
配 log-opts max-size;truncate -s 0 |
| Docker |
悬空镜像 / 构建缓存 |
image prune / builder prune |
| containerd |
ingest 残留 |
停服清 ingest/ |
| containerd |
镜像多 |
crictl rmi --prune |
| Kubernetes |
ImageFs 不足 |
kubelet 镜像回收阈值 |
| Harbor |
删 tag 未 GC |
跑 GC |
| Harbor |
uploads 残片 |
开 upload_purging |
# 通用定位
du -sh /var/lib/docker/* /var/lib/containerd/* /data/harbor/* 2>/dev/null | sort -h
lsof +L1 | grep -iE 'docker|containerd' # 已删但被占用的文件
6.4 k8s 专项(通用症状)
| 症状 |
首查 |
分册 |
| Pod Pending |
describe pod Events |
K8s 14.3 |
| ImagePullBackOff |
describe pod 底部 |
K8s 14.3 |
| CrashLoopBackOff |
logs --previous |
K8s 14.3 |
| Service 不通 |
get ep 是否为空 |
K8s 9.6 |
| 节点 NotReady |
journalctl -u kubelet |
K8s 14.2 |
| cgroup 驱动不一致 |
SystemdCgroup vs cgroupDriver |
containerd 13.3 |
7. 跨平台安全基线
7.1 十条硬规则(所有平台通用)
- 禁止
--privileged,禁止挂载 /var/run/docker.sock。
- 容器内不以 root 运行:
--user 1000:1000 / runAsNonRoot: true。
- 根文件系统只读:
--read-only + --tmpfs /tmp。
--cap-drop ALL,按需 --cap-add。
- 资源限制必配:内存、CPU、PID。
- 日志必须轮转(这是可用性问题,不是优化项)。
- 镜像只从内部仓库拉,开漏洞扫描。
- 密钥用 secret 注入,不写
ENV(docker history 可见)。
- 不用
latest,用 digest 或不可变 tag。
- 远程 API 只开 TLS(2376),永不开 2375。
7.2 五个必须知道的坑
坑 1:docker 组等于 root
docker run -v /:/host -it alpine chroot /host sh # 已经是宿主 root
多租户场景用 rootless Podman 或 userns-remap。
坑 2:volume prune 删数据
prune 删的是「无容器引用的卷」。容器刚删、卷还好着,一条 prune 全没。执行前 docker volume ls 逐个核对。
坑 3:日志不轮转撑爆磁盘
json-file 默认无上限。一个死循环打日志的应用几小时能写满数据盘,然后整机容器全挂。
坑 4:kubeadm reset 不等于清干净
CNI 配置、cni0/flannel.1 网桥、iptables 规则都还在。同 IP 重建集群会网段冲突。见 K8s 17.1。
坑 5:容器时区/时间不对
docker run -e TZ=Asia/Shanghai -v /etc/localtime:/etc/localtime:ro ...
7.3 危险命令清单
docker system prune -a --volumes # 删所有未使用镜像+卷
docker volume prune # 删无主卷
docker rm -f $(docker ps -aq) # 删全部容器
rm -rf /var/lib/docker # 全量数据销毁
kubectl delete ns <ns> # 删命名空间及所有资源
kubectl delete pvc --all -n <ns> # 可能连带删底层存储
kubeadm reset -f # 节点退出,证书全清
curl -X DELETE .../repositories/... # 删镜像(需配合 GC 才释放空间)
# 拦截危险操作(写进 /etc/profile.d/guard.sh)
docker() {
if [[ "$1 $2" == "system prune" ]] && [[ "$*" == *"--volumes"* ]]; then
echo "拒绝:docker system prune --volumes 会删除业务数据卷" >&2; return 1
fi
command docker "$@"
}
8. 迁移与互操作
8.1 Docker → Podman
# 1) 镜像走 registry(最稳)
docker tag nginx:1.25 harbor.internal/mirror/nginx:1.25 && docker push ...
podman pull harbor.internal/mirror/nginx:1.25
# 2) compose 大多可直接用
podman compose -f docker-compose.yml up -d
# 3) 逐项检查(详见 Podman 分册 16.4)
# - 短名镜像改全名
# - docker.sock 依赖的工具要换方案
# - --restart 需 enable podman-restart.service 或改 Quadlet
# - 端口 < 1024 需调 ip_unprivileged_port_start
# - 卷权限用 --userns=keep-id 或 podman unshare chown
# - SELinux 加 :Z
8.2 Docker → containerd(k8s 节点)
kubectl drain <node> --ignore-daemonsets
systemctl disable --now docker docker.socket
dnf install -y containerd.io
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl enable --now containerd
# 改 kubelet 的 container-runtime-endpoint 指向 containerd
systemctl restart kubelet
kubectl uncordon <node>
8.3 单机 → Kubernetes
# 1) Podman:直接把 pod 导出成 k8s yaml
podman kube generate webpod > webpod.yaml
# 2) Docker Compose:用 kompose 转换
kompose convert -f docker-compose.yml
kubectl apply -f .
# 3) 手工重写(生产推荐):显式写 resources / probes / PDB
8.4 迁移的通用原则
| 原则 |
说明 |
| 镜像走 registry,不要整体拷数据目录 |
/var/lib/docker 绑定了 sandbox、cgroup 路径,跨机恢复常失败 |
| 有状态数据用应用层迁移 |
不要靠 tar 整个卷目录跨版本迁 |
| 配置用 Git 管理 |
compose/yaml/daemon.json 都进仓库 |
| 先并行跑,再切流量 |
蓝绿/灰度,不要一次性切换 |
| 迁移后必做冒烟 |
登录、推拉、健康检查、备份恢复各验一次 |
9. 统一运维规范
9.1 四件必配项(比任何排障技巧都值钱)
| 项 |
Docker |
Podman |
Kubernetes |
| 健康检查 |
--health-cmd |
--health-cmd / Quadlet HealthCmd |
readinessProbe + livenessProbe |
| 日志轮转 |
log-opts max-size |
log_driver + journald 轮转 |
kubelet containerLogMaxSize |
| 资源限制 |
-m / --cpus |
--memory / --cpus |
resources.requests/limits |
| 监控告警 |
metrics-addr + cAdvisor |
podman-exporter |
kube-prometheus-stack |
9.2 巡检脚本骨架
#!/usr/bin/env bash
# /opt/scripts/container-check.sh —— 每天 8 点跑
set -uo pipefail
echo "===== $(hostname) $(date '+%F %T') ====="
# 运行时
systemctl is-active docker 2>/dev/null || systemctl is-active podman 2>/dev/null || echo "!! 运行时异常"
systemctl is-active containerd 2>/dev/null || true
# 资源
df -h /var/lib/docker /var/lib/containerd /data/harbor 2>/dev/null | grep -v Filesystem
free -h | head -2
# 容器异常
docker ps -a --filter "status=exited" --format '{{.Names}}\t{{.Status}}' 2>/dev/null | head -10
docker ps --filter health=unhealthy --format '{{.Names}}' 2>/dev/null
# k8s(若有)
command -v kubectl >/dev/null && {
kubectl get --raw='/readyz' >/dev/null 2>&1 && echo "k8s readyz ok" || echo "!! k8s 异常"
kubectl get nodes --no-headers 2>/dev/null | awk '$2!="Ready"{print "!! node:",$1}'
kubectl get pod -A --field-selector status.phase!=Running --no-headers 2>/dev/null | head -10
}
# 磁盘大文件
find /var/lib/docker/containers -name '*-json.log' -size +500M -printf '%s\t%p\n' 2>/dev/null
9.3 备份矩阵
| 对象 |
频率 |
方式 |
| 自有镜像 |
每次发布 |
push 到 Harbor |
| 具名卷 / PVC 数据 |
每日 |
应用层 dump + 卷快照 |
| 编排文件 |
每次变更 |
Git |
| 运行时配置 |
每次变更 |
Git |
| etcd |
每日 + 变更前 |
etcdctl snapshot save |
| Harbor 元数据 + 镜像 |
每周 + 升级前 |
停服 tar 或 pg_dump + rsync |
| 证书 |
签发/续期时 |
加密存储 |
9.4 变更纪律
- 改配置前先备份:
cp x.conf x.conf.bak-$(date +%F)。
- 先 validate 再 reload/restart:
dockerd --validate、containerd config dump、docker compose config、kubectl apply --dry-run=server。
- 生产不用
latest,不用 --force,不手工 ctr rm k8s 容器。
- 升级前必须演练回滚:etcd 快照恢复、Harbor 版本回退、Docker 降版本。
- GC / prune / drain 安排在低峰,且提前通知。
10. 附录:常用速查
10.1 一条命令看全貌
# Docker
docker info | grep -E 'Server Version|Storage Driver|Cgroup|Root Dir|Live Restore'
docker system df
# Podman
podman info --format '{{.Version.Version}} {{.Host.CgroupVersion}} {{.Host.NetworkBackend}} {{.Host.Security.Rootless}}'
podman system df
# containerd
containerd --version; ctr plugin ls | grep -v '\bok\b'; crictl version
# Kubernetes
kubectl get --raw='/readyz?verbose'
kubectl get nodes -o wide
kubectl get pod -A --field-selector status.phase!=Running
# Harbor
curl -sk https://harbor.internal/api/v2.0/health | jq
curl -sk https://harbor.internal/api/v2.0/systeminfo | jq '.harbor_version'
10.2 磁盘占用排序
du -sh /var/lib/docker/* 2>/dev/null | sort -h
du -sh /var/lib/containerd/* 2>/dev/null | sort -h
du -sh /data/harbor/* 2>/dev/null | sort -h
docker ps -s --format 'table {{.Names}}\t{{.Size}}' | sort -k2 -h
ls -lhS /var/lib/docker/containers/*/*-json.log 2>/dev/null | head
10.3 退出码
| 码 |
含义 |
处理 |
| 0 |
正常 |
— |
| 1 |
应用错误 |
看日志 |
| 125 |
容器工具自身失败 |
参数错 |
| 126 |
不可执行 |
权限 / noexec |
| 127 |
命令不存在 |
ENTRYPOINT 路径 |
| 134 |
SIGABRT |
断言/glibc |
| 137 |
SIGKILL / OOM |
查 limit 与 OOMKilled |
| 139 |
SIGSEGV |
段错误、架构不匹配 |
| 143 |
SIGTERM |
正常 stop |
10.4 与工作区其他手册的配合
| 需求 |
翻哪份 |
| 内核参数、cgroup、SELinux、防火墙、磁盘 |
CentOS / Ubuntu / 国产系统手册 |
| 数据库容器化的参数与备份 |
MySQL / PostgreSQL / Redis 等手册 |
| 单机容器详细命令 |
Docker / Podman 分册 |
| 运行时底层(CRI、snapshotter) |
containerd 分册 |
| 集群编排 |
Kubernetes 分册 |
| 镜像仓库 |
Harbor 分册 |
总览的一句话:容器平台的风险从来不是「起不来」,而是「看起来在跑」。健康检查、日志轮转、资源限制、监控告警这四件事配齐,比任何排障技巧都值钱;而排障本身,记住「分层验证 + 先看事件/日志,最后才进容器」就够了。