Linux 容器与云原生命令速查
更新时间:2026-08-28。本文是 Linux 命令速查主题第⑬族:容器与云原生,约 20 个命令。容器本质上是内核的 namespace(命名空间,隔离进程看到的视图)加 cgroup(控制组,限制能用多少资源)两个机制的组合,不是虚拟机——理解这一点,很多"容器里看到的和宿主机不一样"的困惑就迎刃而解了。排障基础见 性能观测命令,网络见 网络命令。
一、Docker 日常
docker 把"打包应用+依赖"变成一致可复现的产物(镜像),再用隔离的进程(容器)跑起来。命令行分两类:管理镜像(images/build/pull)和管理容器(run/ps/exec)。日常 90% 的操作集中在后一类。
| 命令 | 作用 | 常用示例 |
|---|---|---|
docker | 容器引擎主命令,构建镜像、运行容器、管理网络与数据卷 | docker run -d --name web -p 8080:80 nginx(后台运行并映射端口);docker ps -a(含已停止的);docker images;docker build -t app:v1 . |
docker exec | 进入运行中的容器执行命令,日常调试的入口 | docker exec -it web bash(交互式进入);docker exec web env(看环境变量);docker exec -u root web sh(指定用户) |
docker logs | 查看容器标准输出与错误,容器内进程日志打到前台时就是应用日志 | docker logs web;docker logs -f web(跟随);docker logs --tail 100 -t web(末 100 行带时间戳) |
docker inspect | 输出容器/镜像的完整配置 JSON,查 IP、挂载、环境变量等一切的真相来源 | docker inspect web;docker inspect -f '{{.NetworkSettings.IPAddress}}' web(模板取值);docker inspect --format '{{.State.Status}}' web |
docker stats | 实时显示容器 CPU/内存/网络/磁盘占用,比进容器里 top 直观 | docker stats;docker stats --no-stream(只输出一次) |
docker system | 查看与清理磁盘占用,长期跑 Docker 的机器迟早要清一次 | docker system df(看占用);docker system prune -a(清理无用镜像容器网络,会删数据);docker system prune --volumes(连卷一起清) |
docker logs看不到日志,八成是应用把日志写进了文件而不是标准输出。容器的日志收集约定就是"打到 stdout/stderr",让 Docker 的日志驱动去接。另外docker exec进去做的任何修改,容器一删就没了——要持久化得改镜像或挂卷。
镜像分层
镜像是分层的只读文件系统:每一条 Dockerfile 指令生成一层,容器启动时只在最上面叠一层可写的容器层。这个设计带来两个容易被忽略的推论——多个容器共享同一份镜像层,所以磁盘占用远小于"容器数 × 镜像大小";反过来说,在容器里 rm 掉一个大文件,并不会释放镜像本身占的空间,因为底下的只读层还在。
| 命令 | 作用 | 常用示例 |
|---|---|---|
docker history | 逐层显示镜像的构建历史与各层大小,定位"镜像为什么这么大" | docker history app:v1;docker history --no-trunc app:v1(显示完整指令) |
docker save / docker load | 把镜像导出成 tar 包 / 从 tar 包导入,离线环境搬迁镜像或做冷备 | docker save app:v1 -o app.tar;docker load -i app.tar |
构建缓存是按层命中的:某条指令变了,它和它之后的所有层都会失效重建。所以把变化最频繁的内容尽量往后放——先
COPY package.json装依赖,最后才COPY . .复制源码,日常改代码时就不用重跑耗时的依赖安装。再配上.dockerignore把node_modules、.git排除掉,既避免污染构建上下文,也能省下可观的传输时间。
二、Docker 编排与辅助
单机跑一两个容器,用 docker run 就够了。但一个真实应用往往要同时拉起数据库、缓存、消息队列,还要给它们配好网络和数据卷——全靠手工记启动参数,第二天自己都记不住谁跟谁连。编排工具做的事,就是把这套"谁依赖谁、端口怎么映射、数据存哪"显式写进配置文件。
| 命令 | 作用 | 常用示例 |
|---|---|---|
docker-compose | 用 YAML 描述多容器应用(服务、网络、卷),一条命令启停整套环境,本地开发标配 | docker-compose up -d;docker-compose down -v(连卷一起删);docker-compose logs -f web;docker-compose ps;docker-compose exec web sh |
lazydocker | 终端里的 Docker 图形化管理界面,不记命令也能操作容器/镜像/日志 | lazydocker |
docker-compose down与docker-compose down -v的区别要记牢:前者只删容器和网络,后者连数据卷一起删(数据库数据会没)。生产环境慎用-v。
三、Kubernetes
kubectl 是 Kubernetes(容器编排系统,负责在多台机器上调度和管理容器)的命令行入口。它的对象模型统一:kubectl get <资源> 看、describe 详情、logs 日志、exec 进容器。掌握这套动词 + 资源名的组合,就能覆盖大部分操作。
| 命令 | 作用 | 常用示例 |
|---|---|---|
kubectl | Kubernetes 集群管理主命令,操作 Pod、Deployment、Service 等所有资源 | kubectl get pods -A(所有命名空间);kubectl get pod -o wide(含节点与 IP);kubectl describe pod web(看事件,排障首选);kubectl delete pod web |
kubectl logs | 查看 Pod 内容器日志,容器已崩溃时用 --previous 看上一次的 | kubectl logs web -f;kubectl logs web -c sidecar(多容器指定容器);kubectl logs web --previous(看崩溃前的日志) |
kubectl exec | 进入 Pod 内容器,排查运行时问题 | kubectl exec -it web -- sh;kubectl exec web -- env |
kubectl apply | 按 YAML 声明式地创建或更新资源,是 GitOps 的基础操作 | kubectl apply -f deploy.yaml;kubectl apply -k ./overlay(kustomize 目录);kubectl apply -f -(从 stdin) |
kubectl port-forward | 把集群内服务端口转发到本地,不暴露 Service 也能调试 | kubectl port-forward svc/web 8080:80;kubectl port-forward pod/web 8080:80 |
helm | Kubernetes 的包管理器,用 chart 模板化部署复杂应用 | helm install web ./chart;helm upgrade web ./chart --set image.tag=v2;helm list -A;helm rollback web 1;helm uninstall web |
k9s | 终端里的 Kubernetes 可视化管理界面,实时看资源、进容器、看日志 | k9s;k9s -n kube-system(指定命名空间) |
Pod 起不来时的标准排查链:
kubectl get pod看状态 →kubectl describe pod看 Events(ImagePullBackOff、CrashLoopBackOff、OOMKilled、调度失败都写在这)→kubectl logs --previous看崩溃原因。绝大多数问题在这三步内就能定位。
四、其他容器运行时
Docker 不是唯一选择。containerd 和 CRI-O 是符合 Kubernetes CRI(Container Runtime Interface,容器运行时接口)的轻量运行时,实际上 Kubernetes 从 1.24 起已不再直接支持 Docker,底层跑的都是 containerd 这类。
| 命令 | 作用 | 常用示例 |
|---|---|---|
podman | 无守护进程的 Docker 替代品,命令几乎完全兼容,且默认以普通用户运行(更安全) | podman run -d nginx;podman ps;podman generate systemd --name web(生成 systemd 单元);alias docker=podman(平滑迁移) |
crictl | 直接调试 CRI 运行时(containerd/CRI-O),绕过 kubelet 看容器与镜像,节点级排障必备 | crictl ps;crictl pods;crictl logs <id>;crictl inspect <id>;crictl images |
nerdctl | containerd 的 Docker 风格命令行,在只有 containerd 的环境里获得接近 docker 的体验 | nerdctl run -d -p 80:80 nginx;nerdctl images |
buildah | 构建 OCI 镜像的工具,不需要守护进程,也支持不用 Dockerfile 的方式构建 | buildah bud -t app:v1 .;buildah from scratch(从零构建) |
skaffold | 自动化开发循环:改代码自动重建镜像并重新部署到集群 | skaffold dev;skaffold run |
kustomize | Kubernetes 原生配置管理,用 overlay 复用基础配置做多环境差异,无需模板引擎 | `kustomize build ./overlays/prod |
五、本地集群与基础设施即代码
| 命令 | 作用 | 常用示例 |
|---|---|---|
kind | 用 Docker 容器模拟 Kubernetes 节点,本地起集群最快的方式,常用于 CI | kind create cluster --name test;kind load docker-image app:v1(把本地镜像塞进集群);kind get clusters;kind delete cluster |
minikube | 本地单节点 Kubernetes,带 Dashboard 与插件生态,学习环境首选 | minikube start;minikube dashboard;minikube service web(直接打开服务);minikube stop |
ansible | 无 Agent 的自动化运维工具,通过 SSH 批量执行任务,配置管理与部署都用它 | ansible all -m ping(连通性测试);ansible all -m shell -a "uptime";ansible all -m command -a "df -h" |
ansible-playbook | 执行 YAML 编排的自动化剧本,把一批操作固化成可重复执行的流程 | ansible-playbook -i hosts site.yml;ansible-playbook site.yml --check(演练不实际执行);ansible-playbook site.yml --limit webservers(限定主机);ansible-playbook site.yml --tags nginx(只跑指定标签) |
terraform | 基础设施即代码(IaC)工具,用配置声明云资源并自动创建/变更 | terraform init;terraform plan(预览变更);terraform apply;terraform destroy;terraform state list |
vagrant | 管理本地虚拟机环境,一条命令起一台可复现的开发用 VM | vagrant up;vagrant ssh;vagrant halt;vagrant destroy |
terraform plan一定要看:它会告诉你这次 apply 会创建、修改、销毁哪些资源。在共享环境里手滑apply导致资源被重建的事故屡见不鲜。state 文件建议放远端 backend,别放本地。
一句话总结
容器云原生速查:本机打包用 docker build/docker-compose up,集群部署用 kubectl apply/helm upgrade,排障走 describe→logs→exec 三板斧,节点级调试用 crictl/nerdctl,批量运维交给 ansible-playbook,云资源声明式管理用 terraform——20 个命令从单机容器一路覆盖到基础设施编排。