前言

本文整理了 Docker 和 Kubernetes 最常用的命令,方便日常开发和运维工作中快速查阅。


一、Docker 常用命令

1.1 镜像管理

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest
docker pull nginx:1.24

# 查看本地镜像
docker images
docker image ls

# 删除镜像
docker rmi nginx:latest
docker image rm nginx

# 导出/导入镜像
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar

1.2 容器管理

# 运行容器
docker run -d --name my-nginx -p 80:80 nginx

# -d: 后台运行
# --name: 指定容器名称
# -p: 端口映射 (宿主机端口:容器端口)
# -v: 挂载卷 (宿主机路径:容器路径)
# -e: 设置环境变量

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看容器详细信息
docker inspect my-nginx

# 查看容器日志
docker logs my-nginx
docker logs -f my-nginx  # 实时查看

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

1.3 容器交互

# 进入容器(推荐)
docker exec -it my-nginx bash

# 在容器中执行命令
docker exec my-nginx cat /etc/nginx/nginx.conf

# 从容器复制文件到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf

# 从宿主机复制文件到容器
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf

1.4 网络管理

# 查看网络
docker network ls

# 创建网络
docker network create my-network

# 连接容器到网络
docker network connect my-network my-nginx

# 断开网络连接
docker network disconnect my-network my-nginx

1.5 数据卷

# 创建数据卷
docker volume create my-volume

# 查看数据卷
docker volume ls

# 删除数据卷
docker volume rm my-volume

1.6 资源限制与统计

# 运行时限制资源
docker run -m 512m --cpus=1.0 nginx
# -m: 限制内存
# --cpus: 限制 CPU 核心数

# 查看容器资源使用情况
docker stats

# 查看指定容器统计
docker stats my-nginx

# 暂停容器(不释放内存)
docker pause my-nginx

# 恢复暂停的容器
docker unpause my-nginx

# 容器健康检查
docker inspect --format='{{.State.Health.Status}}' my-nginx

1.7 镜像构建

# 构建 Docker 镜像
docker build -t myapp:v1 .
docker build -t myapp:v2 -f Dockerfile.prod .

# 查看构建历史
docker history nginx:latest

# 查看镜像层信息
docker inspect nginx:latest

1.8 系统管理

# 查看 Docker 系统信息
docker info

# 查看 Docker 版本
docker version

# 清理未使用的资源
docker system prune -a
docker system prune -a --volumes  # 包括数据卷

# 查看磁盘使用情况
docker system df

二、Kubernetes (kubectl) 常用命令

2.1 集群管理

# 查看集群信息
kubectl cluster-info

# 查看节点状态
kubectl get nodes

# 查看节点详细信息
kubectl describe node <node-name>

# 查看集群版本
kubectl version --client
kubectl version --short

2.2 资源管理

# 查看所有 Pod
kubectl get pods

# 查看所有命名空间的 Pod
kubectl get pods --all-namespaces

# 查看指定命名空间的资源
kubectl get pods -n kube-system

# 查看所有资源类型
kubectl api-resources

# 查看所有资源
kubectl get all

# 查看资源详情
kubectl describe pod <pod-name>

# 编辑资源
kubectl edit pod <pod-name>

# 删除资源
kubectl delete pod <pod-name>
kubectl delete svc <service-name>
kubectl delete deployment <deployment-name>

2.3 Pod 管理

# 创建 Pod
kubectl run nginx --image=nginx

# 查看 Pod
kubectl get pods

# 查看 Pod 详情
kubectl describe pod nginx

# 查看 Pod 日志
kubectl logs nginx

# 实时查看 Pod 日志
kubectl logs -f nginx

# 查看 Pod 中容器的日志
kubectl logs nginx -c <container-name>

# 进入 Pod
kubectl exec -it nginx -- bash

# 在 Pod 中执行命令
kubectl exec nginx -- ls /

# 删除 Pod
kubectl delete pod nginx

2.4 Deployment 管理

# 创建 Deployment
kubectl create deployment nginx --image=nginx

# 扩展副本数
kubectl scale deployment nginx --replicas=3

# 查看 Deployment
kubectl get deployments

# 查看 Deployment 详情
kubectl describe deployment nginx

# 更新镜像
kubectl set image deployment/nginx nginx=nginx:1.24

# 回滚到上一个版本
kubectl rollout undo deployment nginx

# 查看滚动更新状态
kubectl rollout status deployment nginx

# 查看更新历史
kubectl rollout history deployment nginx

2.5 Service 管理

# 创建 NodePort 服务
kubectl expose pod nginx --port=80 --type=NodePort

# 创建 LoadBalancer 服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer

# 查看服务
kubectl get svc

# 查看服务详情
kubectl describe svc nginx

# 查看服务端点
kubectl get endpoints

2.6 StatefulSet 和 DaemonSet 管理

# StatefulSet 管理(有状态应用)
kubectl get statefulsets
kubectl get sts
kubectl scale statefulset web --replicas=3
kubectl describe statefulset web

# DaemonSet 管理(每个节点运行一个 Pod)
kubectl get daemonsets
kubectl get ds
kubectl edit daemonset flannel -n kube-flannel
kubectl describe daemonset kube-proxy -n kube-system

2.7 Ingress 管理

# 查看 Ingress
kubectl get ingress
kubectl get ing

# 创建 Ingress
kubectl create ingress ing1 --rule=foo.com/bar=svc1:8080,tls=foo-tls

# 查看 Ingress 详情
kubectl describe ingress ing1

# 编辑 Ingress
kubectl edit ingress ing1

2.8 存储管理

# 查看 PersistentVolume
kubectl get pv

# 查看 PersistentVolumeClaim
kubectl get pvc

# 查看 StorageClass
kubectl get sc

# 创建 PVC
kubectl apply -f pvc.yaml

# 查看 PV 详情
kubectl describe pv pv-name

2.9 配置管理

# 创建配置
kubectl create configmap my-config --from-file=config.txt

# 查看 ConfigMap
kubectl get configmaps
kubectl get cm

# 查看 ConfigMap 详情
kubectl describe configmap my-config

# 编辑 ConfigMap
kubectl edit configmap my-config

# 创建 Secret
kubectl create secret generic my-secret --from-literal=key=value
kubectl create secret tls tls-secret --cert=path/to/cert.crt --key=path/to/cert.key

# 查看 Secret
kubectl get secrets
kubectl get secrets -a  # 包括默认隐藏的 secret

# 解码 Secret
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d

2.10 命名空间

# 查看命名空间
kubectl get ns

# 创建命名空间
kubectl create namespace my-namespace

# 在指定命名空间创建资源
kubectl run nginx --image=nginx -n my-namespace

# 删除命名空间(会删除其下所有资源)
kubectl delete namespace my-namespace

# 设置默认命名空间
kubectl config set-context --current --namespace=my-namespace

2.11 标签与选择器

# 添加标签
kubectl label pod nginx app=backend
kubectl label node node1 disk=ssd

# 查看标签
kubectl get pods --show-labels

# 按标签筛选
kubectl get pods -l app=nginx
kubectl get pods -l app!=nginx
kubectl get pods -l 'app in (nginx,redis)'
kubectl get pods -l 'app notin (nginx,redis)'

# 删除标签
kubectl label pod nginx app-

# 按标签删除资源
kubectl delete pods -l app=nginx

2.12 输出格式化

# 宽格式(显示 IP 和节点)
kubectl get pods -o wide

# JSON 格式
kubectl get pods -o json

# YAML 格式
kubectl get pods -o yaml

# 自定义列
kubectl get pods -o custom-columns=NAME:.metadata.name,IP:.status.podIP

# 排序
kubectl get pods --sort-by=.metadata.name

# 只显示特定字段
kubectl get pods -o jsonpath='{.items[*].metadata.name}'

# 查看所有资源
kubectl get all -o wide

2.13 资源配额与限制

# 创建资源配额
kubectl create quota my-quota --hard=cpu=1,memory=1G,pods=2

# 查看配额
kubectl describe quota

# 创建限制范围
kubectl create limitrange my-limits --max=cpu=1,memory=1G --min=cpu=0.1,memory=128Mi

# 查看限制
kubectl describe limits

2.14 高级操作

# 对比差异(不实际应用)
kubectl diff -f deployment.yaml

# 等待条件
kubectl wait --for=condition=Ready pod/nginx
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/nginx

# 查看资源使用
kubectl top nodes
kubectl top pods -n kube-system

# 查看集群事件
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n kube-system --watch

# 资源指标 API
kubectl get --raw /metrics

# 服务器端打印( dry-run 服务器端验证)
kubectl apply -f deployment.yaml --dry-run=server

2.15 YAML 文件管理

# 应用配置
kubectl apply -f deployment.yaml

# 创建资源
kubectl create -f deployment.yaml

# 删除配置文件中的资源
kubectl delete -f deployment.yaml

# 验证配置文件(不创建)
kubectl apply -f deployment.yaml --dry-run=client

# 查看最后生成的配置
kubectl apply -f deployment.yaml --dry-run=client -o yaml

2.16 故障排查

# 查看 Pod 事件
kubectl describe pod <pod-name>

# 查看 Pod 日志
kubectl logs <pod-name>

# 实时查看日志
kubectl logs -f <pod-name>

# 查看之前容器的日志(Pod 重启后)
kubectl logs <pod-name> --previous

# 查看 Pod 中指定容器的日志
kubectl logs <pod-name> -c <container-name>

# 查看所有容器的日志
kubectl logs <pod-name> --all-containers=true

# 查看最近 100 行日志
kubectl logs --tail=100 <pod-name>

# 查看最近 1 小时的日志
kubectl logs --since=1h <pod-name>

# 查看 Pod 在哪个节点上运行
kubectl get pods -o wide

# 端口转发(本地调试)
kubectl port-forward pod/nginx 8080:80
kubectl port-forward svc/nginx 8080:80

# 转发所有端口
kubectl port-forward pod/nginx 8000 8100

# 启动临时调试容器
kubectl debug -it <pod-name> --image=busybox

# 查看节点资源使用
kubectl top nodes

# 查看 Pod 资源使用
kubectl top pods

# 查看集群事件
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n kube-system --watch

# 查看特定资源的日志
kubectl logs -l app=nginx --all-containers=true

# 检查 Pod 是否就绪
kubectl wait --for=condition=Ready pod/nginx --timeout=60s

三、常用技巧

3.1 自动补全

# Bash 自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

# Zsh 自动补全
echo "source <(kubectl completion zsh)" >> ~/.zshrc
source ~/.zshrc

3.2 别名设置

# 常用别名
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kdp='kubectl delete pod'
alias kcp='kubectl create pod'

3.3 上下文管理

# 查看当前上下文
kubectl config current-context

# 查看所有上下文
kubectl config get-contexts

# 切换上下文
kubectl config use-context <context-name>

# 设置默认命名空间
kubectl config set-context --current --namespace=my-namespace

# 删除上下文
kubectl config delete-context <context-name>

# 重命名上下文
kubectl config rename-context <old-name> <new-name>

3.4 批量操作

# 批量删除 Pod
kubectl delete pods -l app=nginx

# 批量重启 Pod
kubectl rollout restart deployment/nginx

# 批量更新标签
kubectl label pods -l app=v1 app=v2 --all

# 批量导出资源
kubectl get all -n my-ns -o yaml > backup.yaml

# 从目录批量应用
kubectl apply -f ./manifests/

# 批量删除目录中的资源
kubectl delete -f ./manifests/

3.5 性能优化

# 减少日志输出
kubectl logs <pod-name> --tail=10

# 限制并发请求数
kubectl get pods --request-timeout=5s

# 使用本地缓存(提高速度)
kubectl get pods --cache-dir=/tmp/kubectl-cache

# 压缩输出
kubectl get pods --compress=true

四、命令对比

操作 Docker Kubernetes
运行容器 docker run kubectl run
查看容器/Pod docker ps kubectl get pods
查看日志 docker logs kubectl logs
进入容器 docker exec kubectl exec
停止容器 docker stop kubectl delete pod
查看镜像 docker images kubectl get pods -o wide

五、实战示例

5.1 部署 Nginx 应用

# 创建部署
kubectl create deployment nginx --image=nginx:latest

# 扩展到 3 个副本
kubectl scale deployment nginx --replicas=3

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务地址
kubectl get svc nginx

# 获取 NodePort 端口
kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}'

5.2 滚动更新

# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.24

# 查看更新状态
kubectl rollout status deployment nginx

# 暂停滚动更新
kubectl rollout pause deployment nginx

# 恢复滚动更新
kubectl rollout resume deployment nginx

# 如果有问题,回滚
kubectl rollout undo deployment nginx

# 回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=2

5.3 调试 Pod

# 查看 Pod 状态
kubectl get pods

# 查看 Pod 详情和事件
kubectl describe pod <pod-name>

# 查看日志
kubectl logs <pod-name>

# 实时查看日志
kubectl logs -f <pod-name>

# 进入 Pod 调试
kubectl exec -it <pod-name> -- bash

# 复制文件到 Pod
kubectl copy ./local.txt <pod-name>:/path/

# 从 Pod 复制文件
kubectl copy <pod-name>:/path/file.txt ./local.txt

5.4 完整部署流程

# 1. 创建命名空间
kubectl create namespace myapp

# 2. 创建 ConfigMap
kubectl create configmap app-config --from-file=config.properties -n myapp

# 3. 创建 Secret
kubectl create secret generic app-secret --from-literal=db-password=secret123 -n myapp

# 4. 部署应用
kubectl create deployment myapp --image=myapp:v1 -n myapp

# 5. 扩展副本
kubectl scale deployment myapp --replicas=3 -n myapp

# 6. 暴露服务
kubectl expose deployment myapp --port=8080 --type=LoadBalancer -n myapp

# 7. 验证部署
kubectl get all -n myapp

# 8. 查看日志
kubectl logs -l app=myapp -n myapp --all-containers=true

六、常见问题与解决方案

6.1 Pod 一直处于 Pending 状态

# 查看原因
kubectl describe pod <pod-name>

# 常见原因:
# 1. 资源不足:kubectl top nodes
# 2. 节点污点:kubectl describe node <node-name> | grep Taint
# 3. 存储问题:kubectl get pv,pvc

6.2 镜像拉取失败

# 查看 Pod 事件
kubectl describe pod <pod-name> | grep Image

# 解决方案:
# 1. 提前拉取镜像:docker pull <image>
# 2. 使用镜像拉取凭证:kubectl create secret docker-registry
# 3. 使用国内镜像源

6.3 容器崩溃重启

# 查看重启次数
kubectl get pods

# 查看之前容器的日志
kubectl logs <pod-name> --previous

# 查看容器退出码
kubectl describe pod <pod-name> | grep exit code

6.4 网络连接问题

# 测试 Pod 网络连通性
kubectl exec -it <pod-name> -- ping <target-ip>

# 查看 Service 端点
kubectl get endpoints <service-name>

# 查看 DNS 解析
kubectl exec -it <pod-name> -- nslookup <service-name>

七、最佳实践

7.1 资源管理

# 始终设置资源限制
kubectl set resources deployment nginx --limits=cpu=1,memory=512Mi --requests=cpu=0.5,memory=256Mi

# 使用命名空间隔离环境
kubectl create namespace dev
kubectl create namespace prod

7.2 安全最佳实践

# 使用非 root 用户运行容器
# 在 Dockerfile 中添加:USER nginx

# 限制 Pod 权限
kubectl run nginx --image=nginx --security-context=runAsUser=1000

# 使用 NetworkPolicy
kubectl apply -f network-policy.yaml

7.3 监控与日志

# 定期检查资源使用
kubectl top nodes
kubectl top pods --all-namespaces

# 收集日志
kubectl logs -l app=myapp --all-containers=true > app.log

# 导出资源配置
kubectl get all -o yaml > backup.yaml

八、速查表总结

Docker 核心命令

操作 命令
运行容器 docker run
查看容器 docker ps
停止容器 docker stop
删除容器 docker rm
查看镜像 docker images
删除镜像 docker rmi
查看日志 docker logs
进入容器 docker exec
构建镜像 docker build

Kubernetes 核心命令

操作 命令
查看 Pod kubectl get pods
查看 Pod 详情 kubectl describe pod
查看日志 kubectl logs
进入 Pod kubectl exec
创建部署 kubectl create deployment
扩展副本 kubectl scale deployment
更新镜像 kubectl set image
暴露服务 kubectl expose
应用配置 kubectl apply -f
删除资源 kubectl delete

参考资源