容器平台总览与跨平台速查

运维指令手册 15.2 KB 原文

容器平台总览与跨平台速查

本文件是总览索引 + 跨平台速查,不重复各分册的详细命令。 单平台深度内容请查对应分册(见下方导航)。 更新时间:2026-11(版本事实核对至 2026-11-05)


分册导航

分册 覆盖版本 行数 什么时候翻它
Docker 常用运维指令手册 Engine 20.10 ~ 29.x 2433 单机容器、镜像构建、Compose、Swarm、daemon 调优
Podman 常用运维指令手册 4.4+ / 5.x / 6.x 1991 无 daemon 运行时、rootless、Quadlet、RHEL 系默认
containerd 常用运维指令手册 1.7 / 2.x 1687 低层运行时、CRI、k8s 节点镜像与容器排障
Kubernetes 常用运维指令手册 1.35 / 1.36 / 1.37 3220 集群部署、工作负载、调度、存储、网络、etcd、升级
Harbor 镜像仓库运维指令手册 2.13 / 2.14 / 2.15 1902 私有仓库部署、RBAC、复制、扫描、GC、备份升级

配套:操作系统层见 CentOS-7-10-常规运维指令手册.md / Ubuntu-常用运维指令手册.md,数据库容器化见 MySQL-常用运维指令手册.md。


目录

  1. 技术栈全景
  2. 版本生命周期
  3. 平台选型
  4. 五大 CLI 命令对照
  5. 跨平台路径与端口
  6. 跨平台故障速查
  7. 跨平台安全基线
  8. 迁移与互操作
  9. 统一运维规范
  10. 附录:常用速查

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 必须搞清的四条边界

  1. Kubernetes 不需要 Docker。v1.24 起内置 dockershim 已移除,kubelet 通过 CRI 直连 containerd/CRI-O。Docker 构建的镜像是 OCI 格式,照样能跑。
  2. Docker 与 containerd 不是二选一。Docker Engine 内部就带 containerd;29.x 起还有实验性的「内嵌 containerd」模式。
  3. docker 与 podman 命令 90% 兼容,但网络栈、rootless、systemd 集成完全不同,不能简单 alias。
  4. 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 三个决定"能不能建新集群"的时间点

  1. cgroup v1 已不可用:k8s 1.35 起 kubelet 在 cgroup v1 上默认直接失败。CentOS 7 这类老系统不能再作节点。
  2. kube-proxy ipvs 模式已弃用(1.35 起):新集群用 iptables 或 nftables。
  3. 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 十条硬规则(所有平台通用)

  1. 禁止 --privileged,禁止挂载 /var/run/docker.sock。
  2. 容器内不以 root 运行:--user 1000:1000 / runAsNonRoot: true。
  3. 根文件系统只读:--read-only + --tmpfs /tmp。
  4. --cap-drop ALL,按需 --cap-add。
  5. 资源限制必配:内存、CPU、PID。
  6. 日志必须轮转(这是可用性问题,不是优化项)。
  7. 镜像只从内部仓库拉,开漏洞扫描。
  8. 密钥用 secret 注入,不写 ENV(docker history 可见)。
  9. 不用 latest,用 digest 或不可变 tag。
  10. 远程 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 变更纪律

  1. 改配置前先备份:cp x.conf x.conf.bak-$(date +%F)。
  2. 先 validate 再 reload/restart:dockerd --validate、containerd config dump、docker compose config、kubectl apply --dry-run=server。
  3. 生产不用 latest,不用 --force,不手工 ctr rm k8s 容器。
  4. 升级前必须演练回滚:etcd 快照恢复、Harbor 版本回退、Docker 降版本。
  5. 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 分册

总览的一句话:容器平台的风险从来不是「起不来」,而是「看起来在跑」。健康检查、日志轮转、资源限制、监控告警这四件事配齐,比任何排障技巧都值钱;而排障本身,记住「分层验证 + 先看事件/日志,最后才进容器」就够了。

容器平台总览与跨平台速查 - 知识库 - 起航社区