K8s 学习:常用命令 100 条(二)- 生产环境故障排查

K8s 学习:常用命令 100 条(二)- 生产环境故障排查

故障排查

系列文章: K8s 命令实战指南
适用人群: 运维工程师、SRE 工程师、DevOps 工程师
阅读时间: 20 分钟


前言

在生产环境中,快速定位和解决问题是运维的核心能力。本文整理了最常见的 K8s 故障场景及排查命令,帮助你快速恢复服务。


一、Pod 故障排查

1.1 Pod 状态异常

# 查看所有异常 Pod
kubectl get pods --all-namespaces --field-selector=status.phase!=Running

# 查看特定状态的 Pod
kubectl get pods --field-selector=status.phase=Pending
kubectl get pods --field-selector=status.phase=Failed
kubectl get pods --field-selector=status.phase=Unknown

# 查看 Pod 状态详情
kubectl get pods -o custom-columns='NAME:metadata.name,STATUS:status.phase,RESTARTS:status.containerStatuses[0].restartCount,NODE:spec.nodeName'

# 查看 Pod 所有容器的状态
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[*].state}'

使用场景:

  • Pod 一直处于 Pending 状态
  • Pod 启动后立即退出
  • 批量检查异常 Pod
  • 监控 Pod 健康状态

1.2 CrashLoopBackOff

# 查看 Pod 事件
kubectl describe pod <pod-name> | grep -A 20 Events

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

# 查看容器退出码
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'

# 查看容器终止原因
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState.terminated.reason}'

# 查看容器重启次数
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].restartCount}'

# 查看 Pod 的资源使用
kubectl top pod <pod-name>

使用场景:

  • 应用启动失败
  • 配置文件错误
  • 资源不足(OOM)
  • 健康检查失败

常见退出码:

  • 0:正常退出
  • 1:应用错误
  • 137:OOMKilled(内存不足)
  • 139:Segmentation Fault
  • 143:被 SIGTERM 终止

1.3 ImagePullBackOff / ErrImagePull

# 查看镜像拉取错误
kubectl describe pod <pod-name> | grep -A 10 "Events:"

# 查看 Pod 使用的镜像
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].image}'

# 查看镜像拉取策略
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].imagePullPolicy}'

# 查看 Secret(镜像拉取密钥)
kubectl get pod <pod-name> -o jsonpath='{.spec.imagePullSecrets}'

# 检查 Secret 是否存在
kubectl get secrets | grep <secret-name>

# 查看 Secret 内容
kubectl describe secret <secret-name>

# 测试镜像拉取(手动)
docker pull <image-name>
crictl pull <image-name>

使用场景:

  • 镜像不存在或标签错误
  • 镜像仓库认证失败
  • 网络不通或镜像仓库不可达
  • 镜像拉取超时

1.4 Pending 状态

# 查看 Pending 原因
kubectl describe pod <pod-name> | grep -A 20 Events

# 查看节点资源
kubectl describe nodes | grep -A 5 "Allocated resources"

# 查看节点可调度性
kubectl get nodes -o custom-columns='NAME:metadata.name,READY:status.conditions[?(@.type=="Ready")].status,SCHEDULABLE:spec.unschedulable'

# 查看资源请求
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources.requests}'

# 查看 PV/PVC 状态
kubectl get pvc | grep <pod-namespace>

# 查看节点标签(用于节点选择)
kubectl get nodes --show-labels

# 查看 Pod 的节点选择器
kubectl get pod <pod-name> -o jsonpath='{.spec.nodeSelector}'

# 查看 Pod 的亲和性规则
kubectl get pod <pod-name> -o jsonpath='{.spec.affinity}'

使用场景:

  • 资源不足(CPU/内存)
  • 节点不可调度
  • PVC 未绑定
  • 节点选择器不匹配
  • 污点和容忍度问题

二、节点故障排查

2.1 NotReady 状态

# 查看节点状态
kubectl get nodes

# 查看节点详情
kubectl describe node <node-name>

# 查看节点条件
kubectl get node <node-name> -o jsonpath='{.status.conditions}'

# 查看 kubelet 状态(SSH 到节点)
systemctl status kubelet

# 查看 kubelet 日志
journalctl -u kubelet -f

# 查看容器运行时状态
systemctl status docker
systemctl status containerd

# 查看容器运行时日志
journalctl -u docker -f
journalctl -u containerd -f

使用场景:

  • kubelet 服务异常
  • 容器运行时异常
  • 网络不通
  • 磁盘满

2.2 节点资源不足

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

# 查看节点资源分配
kubectl describe node <node-name> | grep -A 10 "Allocated resources"

# 查看节点上的 Pod
kubectl get pods --all-namespaces --field-selector spec.nodeName=<node-name>

# 查看节点上的 Pod 资源使用
kubectl top pod --all-namespaces --field-selector spec.nodeName=<node-name>

# 查看磁盘使用(SSH 到节点)
df -h

# 查看内存使用
free -h

# 查看进程资源使用
top
htop

# 清理未使用的容器和镜像
docker system prune -a
crictl rmi --prune

使用场景:

  • CPU 使用率过高
  • 内存不足
  • 磁盘空间不足
  • inode 耗尽

2.3 节点磁盘满

# 查看磁盘使用(SSH 到节点)
df -h

# 查看大文件
du -sh /* | sort -h | tail -10

# 查看 Docker 目录大小
du -sh /var/lib/docker

# 查看容器日志大小
du -sh /var/lib/docker/containers/*/*-json.log

# 查看日志文件
ls -lh /var/log/

# 清理 Docker 资源
docker system prune -a --volumes

# 清理容器日志(谨慎!)
truncate -s 0 /var/lib/docker/containers/*/*-json.log

# 清理系统日志
journalctl --vacuum-time=3d

# 查看被删除但仍占用的文件
lsof | grep deleted

使用场景:

  • 磁盘使用率 > 90%
  • 容器日志过大
  • 镜像层过多
  • 临时文件未清理

三、网络故障排查

3.1 DNS 解析失败

# 测试 DNS 解析
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes

# 测试外部 DNS
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup www.google.com

# 查看 CoreDNS Pod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns

# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns

# 查看 CoreDNS ConfigMap
kubectl get configmap coredns -n kube-system -o yaml

# 查看 Pod 的 DNS 配置
kubectl exec <pod-name> -- cat /etc/resolv.conf

# 测试 Service DNS
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup <service-name>.<namespace>.svc.cluster.local

# 查看 Service ClusterIP
kubectl get svc <service-name> -o jsonpath='{.spec.clusterIP}'

使用场景:

  • Service 域名解析失败
  • 外部域名解析失败
  • CoreDNS 配置错误
  • 跨命名空间访问失败

3.2 Service 无法访问

# 查看 Service 详情
kubectl describe service <service-name>

# 查看 Endpoints
kubectl get endpoints <service-name>

# 查看 Service 选择器
kubectl get svc <service-name> -o jsonpath='{.spec.selector}'

# 查看匹配的 Pod
kubectl get pods -l <selector-key>=<selector-value>

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

# 查看 Service ClusterIP
kubectl get svc <service-name> -o jsonpath='{.spec.clusterIP}'

# 查看 Service 端口
kubectl get svc <service-name> -o jsonpath='{.spec.ports}'

# 测试 Service 连通性
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- wget -qO- <service-name>:<port>

# 端口转发测试
kubectl port-forward service/<service-name> <local-port>:<service-port>

使用场景:

  • Service 没有后端 Pod
  • Pod 标签不匹配
  • 端口配置错误
  • 网络策略阻止

3.3 Pod 之间网络不通

# 查看 Pod IP
kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'

# 测试 Pod 之间连通性
kubectl exec <pod1-name> -- ping <pod2-ip>

# 查看 Pod 网络
kubectl exec <pod-name> -- ip addr

# 查看路由表
kubectl exec <pod-name> -- route -n

# 查看 iptables(SSH 到节点)
iptables -L -n -v

# 查看网络策略
kubectl get networkpolicy --all-namespaces

# 查看网络策略详情
kubectl describe networkpolicy <policy-name>

# 查看 CNI 配置(SSH 到节点)
ls /etc/cni/net.d/
cat /etc/cni/net.d/*.conf

# 查看 CNI 插件日志(SSH 到节点)
journalctl -u kubelet | grep cni

使用场景:

  • 跨节点 Pod 不通
  • 同节点 Pod 不通
  • 网络策略阻止
  • CNI 插件问题

四、存储故障排查

4.1 PVC Pending

# 查看 PVC 状态
kubectl get pvc

# 查看 PVC 详情
kubectl describe pvc <pvc-name>

# 查看 PV 状态
kubectl get pv

# 查看 StorageClass
kubectl get storageclass

# 查看 Provisioner 日志
kubectl logs -n kube-system <provisioner-pod>

# 查看 PVC 事件
kubectl describe pvc <pvc-name> | grep -A 10 Events

# 查看可用 PV
kubectl get pv | grep Available

# 查看 PV 容量
kubectl get pv -o custom-columns='NAME:metadata.name,CAPACITY:spec.capacity.storage,STATUS:status.phase'

使用场景:

  • 没有可用的 PV
  • StorageClass 不存在
  • Provisioner 异常
  • 存储配额限制

4.2 Pod 挂载失败

# 查看 Pod 挂载信息
kubectl describe pod <pod-name> | grep -A 20 "Mounts:"

# 查看 Pod 挂载点
kubectl get pod <pod-name> -o jsonpath='{.spec.volumes}'

# 查看 PVC 绑定状态
kubectl get pvc <pvc-name> -o jsonpath='{.status.phase}'

# 进入 Pod 查看挂载
kubectl exec -it <pod-name> -- df -h

# 查看挂载点内容
kubectl exec <pod-name> -- ls -lh /<mount-path>

# 查看 PV 挂载信息(SSH 到节点)
mount | grep <pv-name>

# 查看磁盘挂载(SSH 到节点)
lsblk
df -h

使用场景:

  • PVC 未绑定
  • PV 挂载失败
  • 存储类型不支持
  • 权限问题

五、性能故障排查

5.1 CPU 使用率高

# 查看节点 CPU 使用
kubectl top node

# 查看 Pod CPU 使用
kubectl top pod --all-namespaces

# 按使用量排序
kubectl top pod --all-namespaces --sort-by=cpu

# 查看资源请求和限制
kubectl get pod <pod-name> -o custom-columns='NAME:metadata.name,CPU_REQ:spec.containers[*].resources.requests.cpu,CPU_LIM:spec.containers[*].resources.limits.cpu'

# 进入容器查看进程
kubectl exec -it <pod-name> -- top

# 查看进程 CPU 使用
kubectl exec <pod-name> -- ps aux --sort=-pcpu | head

# 生成 CPU Profile(需要应用支持)
kubectl exec <pod-name> -- curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.prof

使用场景:

  • 应用 CPU 占用过高
  • 资源限制不合理
  • 代码性能问题
  • 死循环或阻塞

5.2 内存泄漏

# 查看 Pod 内存使用
kubectl top pod <pod-name>

# 查看内存使用趋势(持续监控)
watch kubectl top pod <pod-name>

# 查看内存请求和限制
kubectl get pod <pod-name> -o custom-columns='NAME:metadata.name,MEM_REQ:spec.containers[*].resources.requests.memory,MEM_LIM:spec.containers[*].resources.limits.memory'

# 进入容器查看内存
kubectl exec -it <pod-name> -- free -h

# 查看进程内存使用
kubectl exec <pod-name> -- ps aux --sort=-pmem | head

# 查看容器内存限制
kubectl exec <pod-name> -- cat /sys/fs/cgroup/memory/memory.limit_in_bytes

# 生成 Heap Dump(需要应用支持)
kubectl exec <pod-name> -- curl http://localhost:6060/debug/pprof/heap > heap.prof

# 查看 OOM 事件
kubectl get events --field-selector reason=OOMKilled

使用场景:

  • 内存持续增长
  • 频繁 OOMKilled
  • 内存泄漏
  • 缓存过大

六、证书故障排查

6.1 证书过期

# 查看证书有效期(kubeadm)
kubeadm certs check-expiration

# 查看 API Server 证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A 2 Validity

# 查看 kubelet 证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout | grep -A 2 Validity

# 查看证书过期时间
kubectl get csr

# 续期证书(kubeadm)
kubeadm certs renew all

# 重启服务使证书生效
kubectl rollout restart deployment -n kube-system
systemctl restart kubelet

使用场景:

  • API Server 证书过期
  • kubelet 证书过期
  • etcd 证书过期
  • 证书轮换失败

6.2 证书认证失败

# 查看 kubeconfig
kubectl config view

# 查看 client 证书
openssl x509 -in ~/.kube/client-certificate -text -noout

# 测试 API 连接
kubectl cluster-info

# 查看认证日志(API Server)
journalctl -u kube-apiserver -f | grep auth

# 查看证书链
openssl s_client -connect <api-server-ip>:6443 -showcerts

# 验证证书和私钥匹配
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5

使用场景:

  • kubeconfig 配置错误
  • 证书路径错误
  • 证书和私钥不匹配
  • CA 证书错误

七、应用故障排查

7.1 健康检查失败

# 查看 Pod 事件
kubectl describe pod <pod-name> | grep -A 10 Events

# 查看健康检查配置
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].livenessProbe}'

# 查看就绪检查配置
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].readinessProbe}'

# 手动测试健康检查端点
kubectl exec <pod-name> -- curl -v http://localhost:<port>/health

# 查看容器日志
kubectl logs <pod-name> --tail=100

# 查看容器重启原因
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].lastState}'

使用场景:

  • Liveness Probe 失败
  • Readiness Probe 失败
  • 健康检查端点错误
  • 超时时间太短

7.2 配置错误

# 查看 ConfigMap
kubectl get configmap <configmap-name> -o yaml

# 查看 Secret
kubectl get secret <secret-name> -o yaml

# 查看 Pod 挂载的配置
kubectl exec <pod-name> -- ls -lh /etc/config/

# 查看环境变量
kubectl exec <pod-name> -- env | grep <config-key>

# 查看 Pod 的环境变量配置
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].env}'

# 解码 Secret
kubectl get secret <secret-name> -o jsonpath='{.data.<key>}' | base64 --decode

# 更新 ConfigMap
kubectl create configmap <configmap-name> --from-file=<file> --dry-run=client -o yaml | kubectl apply -f -

使用场景:

  • ConfigMap 不存在
  • Secret 解码错误
  • 环境变量未注入
  • 配置文件路径错误

八、日志故障排查

8.1 日志收集问题

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

# 查看多个容器的日志
kubectl logs <pod-name> --all-containers

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

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

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

# 查看日志大小限制
kubectl describe pod <pod-name> | grep -i log

# 查看 kubelet 日志配置(SSH 到节点)
cat /var/lib/kubelet/config.yaml | grep -A 5 containerLog

# 查看容器日志文件(SSH 到节点)
ls -lh /var/lib/docker/containers/*/*-json.log

使用场景:

  • 日志输出过多
  • 日志文件过大
  • 日志格式错误
  • 日志采集失败

九、总结

9.1 故障排查流程

1. 查看状态
   ↓
2. 查看事件
   ↓
3. 查看日志
   ↓
4. 定位问题
   ↓
5. 解决问题

9.2 常用排查命令速查

场景 命令
Pod 异常 kubectl describe pod <pod-name>
容器日志 kubectl logs <pod-name> --previous
节点异常 kubectl describe node <node-name>
DNS 问题 nslookup kubernetes
网络问题 kubectl exec <pod> -- ping <ip>
资源不足 kubectl top node/pod
证书问题 kubeadm certs check-expiration
存储问题 kubectl describe pvc <pvc-name>

9.3 预防措施

  1. 监控告警

    • 设置资源使用告警
    • 设置 Pod 重启告警
    • 设置节点状态告警
  2. 日志收集

    • 统一日志格式
    • 集中日志存储
    • 日志分析和搜索
  3. 定期检查

    • 证书有效期
    • 资源使用率
    • 磁盘空间
  4. 文档记录

    • 记录常见问题
    • 记录解决方案
    • 记录配置变更

参考资料


作者: PaPaBot
发布时间: 2026-03-07
标签: #Kubernetes #K8s #DevOps #运维 #故障排查


本文属于《K8s 命令实战指南》系列文章第二篇

Views: 55

K8s 学习:常用命令 100 条(一)- 基础入门篇

K8s 学习:常用命令 100 条(一)- 基础入门篇

Kubernetes

系列文章: K8s 命令实战指南
适用人群: 运维工程师、开发人员、DevOps 工程师
阅读时间: 15 分钟


前言

Kubernetes(K8s)作为容器编排的行业标准,掌握其命令行工具 kubectl 是必备技能。本文整理了最常用的 K8s 命令,按场景分类,方便查阅和实战使用。


一、集群信息查看

1.1 基础信息

# 查看集群信息
kubectl cluster-info

# 查看集群节点
kubectl get nodes

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

# 查看集群版本
kubectl version

# 查看集群 API 资源
kubectl api-resources

# 查看集群 API 版本
kubectl api-versions

使用场景:

  • 刚接入新集群时,了解集群基本信息
  • 排查集群连接问题时,验证集群状态
  • 升级集群前,检查当前版本

1.2 命名空间管理

# 查看所有命名空间
kubectl get namespaces
kubectl get ns

# 创建命名空间
kubectl create namespace <namespace-name>
kubectl create ns <namespace-name>

# 删除命名空间
kubectl delete namespace <namespace-name>

# 切换命名空间(需要安装 kubens)
kubens <namespace-name>

# 查看当前命名空间
kubectl config view --minify --format '{{.contexts[0].context.namespace}}'

使用场景:

  • 多环境隔离(dev/test/prod)
  • 多团队协作时,按命名空间划分资源
  • 按项目或服务分类管理资源

二、资源查看

2.1 基础资源查看

# 查看 Pod
kubectl get pods
kubectl get po

# 查看 Pod(指定命名空间)
kubectl get pods -n <namespace>

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

# 查看 Pod 详细信息(包括 IP、节点)
kubectl get pods -o wide

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

# 按标签筛选 Pod
kubectl get pods -l app=nginx

# 查看 Deployment
kubectl get deployments
kubectl get deploy

# 查看 Service
kubectl get services
kubectl get svc

# 查看 ConfigMap
kubectl get configmaps
kubectl get cm

# 查看 Secret
kubectl get secrets

# 查看 Ingress
kubectl get ingress
kubectl get ing

# 查看所有资源
kubectl get all

# 查看所有资源(包括事件)
kubectl get all,events

使用场景:

  • 检查服务部署状态
  • 排查 Pod 启动问题
  • 查看资源分布情况
  • 按标签筛选特定应用

2.2 详细信息查看

# 查看 Pod 详细信息
kubectl describe pod <pod-name>

# 查看 Deployment 详细信息
kubectl describe deployment <deployment-name>

# 查看 Service 详细信息
kubectl describe service <service-name>

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

# 以 YAML 格式查看资源
kubectl get pod <pod-name> -o yaml

# 以 JSON 格式查看资源
kubectl get pod <pod-name> -o json

# 查看资源的特定字段
kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'

使用场景:

  • 排查 Pod 启动失败原因
  • 查看资源配置详情
  • 提取特定字段用于脚本
  • 深入了解资源状态

三、资源创建与删除

3.1 创建资源

# 通过 YAML 文件创建资源
kubectl apply -f <yaml-file>
kubectl create -f <yaml-file>

# 创建命名空间
kubectl create namespace <namespace-name>

# 创建 Deployment
kubectl create deployment <deployment-name> --image=<image>

# 创建 Service(暴露端口)
kubectl expose deployment <deployment-name> --port=<port> --target-port=<target-port>

# 创建 ConfigMap(从文件)
kubectl create configmap <configmap-name> --from-file=<file-path>

# 创建 ConfigMap(从字面值)
kubectl create configmap <configmap-name> --from-literal=key1=value1 --from-literal=key2=value2

# 创建 Secret(从文件)
kubectl create secret generic <secret-name> --from-file=<file-path>

# 创建 Secret(从字面值)
kubectl create secret generic <secret-name> --from-literal=username=admin --from-literal=password=secret

# 创建 CronJob
kubectl create cronjob <cronjob-name> --image=<image> --schedule="*/1 * * * *"

使用场景:

  • 部署新应用
  • 创建配置和密钥
  • 快速创建测试资源
  • 从文件导入配置

3.2 删除资源

# 删除 Pod
kubectl delete pod <pod-name>

# 删除 Deployment
kubectl delete deployment <deployment-name>

# 删除 Service
kubectl delete service <service-name>

# 通过 YAML 文件删除资源
kubectl delete -f <yaml-file>

# 删除指定标签的所有 Pod
kubectl delete pods -l app=nginx

# 删除命名空间(及其下所有资源)
kubectl delete namespace <namespace-name>

# 强制删除 Pod(不等待优雅关闭)
kubectl delete pod <pod-name> --force --grace-period=0

# 删除所有 Pod(慎用!)
kubectl delete pods --all

使用场景:

  • 清理测试资源
  • 删除废弃应用
  • 强制删除卡住的 Pod
  • 批量删除资源

四、资源编辑与更新

4.1 编辑资源

# 编辑资源(打开编辑器)
kubectl edit pod <pod-name>
kubectl edit deployment <deployment-name>
kubectl edit service <service-name>

# 编辑 ConfigMap
kubectl edit configmap <configmap-name>

# 编辑 Secret
kubectl edit secret <secret-name>

# 编辑并保存到文件
kubectl edit deployment <deployment-name> -o yaml > deployment.yaml

使用场景:

  • 快速修改配置
  • 调试资源设置
  • 更新环境变量
  • 修改副本数

4.2 更新资源

# 更新 Deployment 镜像
kubectl set image deployment/<deployment-name> <container-name>=<new-image>

# 更新 Deployment 副本数
kubectl scale deployment <deployment-name> --replicas=<number>

# 更新资源(通过 YAML 文件)
kubectl apply -f <yaml-file>

# 更新 ConfigMap
kubectl create configmap <configmap-name> --from-file=<file-path> --dry-run=client -o yaml | kubectl apply -f -

# 更新 Secret
kubectl create secret generic <secret-name> --from-literal=key=value --dry-run=client -o yaml | kubectl apply -f -

# 标记 Deployment 为暂停(暂停自动部署)
kubectl rollout pause deployment/<deployment-name>

# 恢复 Deployment 部署
kubectl rollout resume deployment/<deployment-name>

使用场景:

  • 滚动更新应用版本
  • 水平扩展/缩容
  • 更新配置文件
  • 更新密钥

五、日志查看与调试

5.1 日志查看

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

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

# 查看 Pod 日志(实时跟踪)
kubectl logs -f <pod-name>

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

# 查看 Pod 日志(指定时间范围)
kubectl logs --since=1h <pod-name>
kubectl logs --since-time=2024-01-01T00:00:00Z <pod-name>

# 查看 Pod 日志(保存到文件)
kubectl logs <pod-name> > pod.log

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

# 查看多个 Pod 的日志(需要安装 stern)
stern <pod-name-pattern>

使用场景:

  • 排查应用错误
  • 监控应用运行状态
  • 收集日志用于分析
  • 查看容器启动日志

5.2 进入容器

# 进入容器(交互式)
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec -it <pod-name> -- /bin/sh

# 进入容器(指定容器)
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash

# 在容器中执行命令
kubectl exec <pod-name> -- ls /app
kubectl exec <pod-name> -- cat /etc/config/app.conf

# 复制文件到容器
kubectl cp <local-file> <pod-name>:<remote-path>

# 从容器复制文件
kubectl cp <pod-name>:<remote-path> <local-file>

# 端口转发(本地端口映射到 Pod 端口)
kubectl port-forward <pod-name> <local-port>:<pod-port>

# 端口转发(Service)
kubectl port-forward service/<service-name> <local-port>:<service-port>

使用场景:

  • 调试应用问题
  • 查看容器内文件
  • 临时修改配置
  • 本地访问集群服务

六、资源扩缩容

6.1 手动扩缩容

# 扩容 Deployment
kubectl scale deployment <deployment-name> --replicas=5

# 缩容 Deployment
kubectl scale deployment <deployment-name> --replicas=1

# 基于条件扩容(当前副本数为 3 时才扩容)
kubectl scale deployment <deployment-name> --current-replicas=3 --replicas=5

# 扩容 StatefulSet
kubectl scale statefulset <statefulset-name> --replicas=3

# 扩容 ReplicaSet
kubectl scale replicaset <replicaset-name> --replicas=5

使用场景:

  • 应对流量高峰
  • 节省资源成本
  • 测试水平扩展
  • 紧急扩容

6.2 自动扩缩容(HPA)

# 创建 HPA(基于 CPU)
kubectl autoscale deployment <deployment-name> --cpu-percent=50 --min=2 --max=10

# 查看 HPA
kubectl get hpa

# 查看 HPA 详细信息
kubectl describe hpa <hpa-name>

# 删除 HPA
kubectl delete hpa <hpa-name>

# 编辑 HPA
kubectl edit hpa <hpa-name>

使用场景:

  • 自动应对流量波动
  • 优化资源使用
  • 保证服务可用性
  • 降低运维成本

七、滚动更新与回滚

7.1 滚动更新

# 更新镜像(触发滚动更新)
kubectl set image deployment/<deployment-name> <container-name>=<new-image>:<tag>

# 查看滚动更新状态
kubectl rollout status deployment/<deployment-name>

# 查看滚动更新历史
kubectl rollout history deployment/<deployment-name>

# 查看特定版本历史
kubectl rollout history deployment/<deployment-name> --revision=2

# 暂停滚动更新
kubectl rollout pause deployment/<deployment-name>

# 恢复滚动更新
kubectl rollout resume deployment/<deployment-name>

使用场景:

  • 发布新版本应用
  • 灰度发布
  • 金丝雀发布
  • 蓝绿部署

7.2 回滚

# 回滚到上一个版本
kubectl rollout undo deployment/<deployment-name>

# 回滚到指定版本
kubectl rollout undo deployment/<deployment-name> --to-revision=2

# 查看回滚状态
kubectl rollout status deployment/<deployment-name>

# 查看回滚历史
kubectl rollout history deployment/<deployment-name>

使用场景:

  • 新版本有问题,快速回滚
  • 灰度发布失败,回退版本
  • 紧急修复生产问题
  • 版本切换

八、网络调试

8.1 DNS 调试

# 创建 DNS 调试 Pod
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup kubernetes

# 测试 Service DNS
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup <service-name>

# 测试跨命名空间 DNS
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup <service-name>.<namespace>.svc.cluster.local

# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns

使用场景:

  • 排查服务发现问题
  • 验证 DNS 解析
  • 调试跨命名空间访问
  • CoreDNS 故障排查

8.2 网络连通性测试

# 测试 Pod 之间连通性
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- ping <pod-ip>

# 测试 Service 连通性
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- wget -qO- <service-name>:<port>

# 测试外部网络连通性
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- wget -qO- http://www.google.com

# 查看网络策略
kubectl get networkpolicy
kubectl get netpol

使用场景:

  • 排查网络不通问题
  • 验证 Service 访问
  • 测试跨节点网络
  • 网络策略调试

九、资源配额与限制

9.1 查看资源使用

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

# 查看 Pod 资源使用
kubectl top pod

# 查看 Pod 资源使用(指定命名空间)
kubectl top pod -n <namespace>

# 查看 Pod 资源使用(所有命名空间)
kubectl top pod --all-namespaces

# 查看资源配额
kubectl get resourcequota
kubectl get quota

# 查看限制范围
kubectl get limitrange
kubectl get limits

使用场景:

  • 监控资源使用情况
  • 排查资源不足问题
  • 优化资源配置
  • 容量规划

9.2 设置资源配额

# 创建资源配额
kubectl create quota <quota-name> --hard=cpu=2,memory=4Gi,pods=10

# 查看资源配额详情
kubectl describe quota <quota-name>

# 编辑资源配额
kubectl edit quota <quota-name>

# 删除资源配额
kubectl delete quota <quota-name>

使用场景:

  • 限制命名空间资源使用
  • 防止资源过度使用
  • 多团队资源分配
  • 成本控制

十、安全与权限

10.1 RBAC 管理

# 查看 Role
kubectl get roles

# 查看 RoleBinding
kubectl get rolebindings

# 查看 ClusterRole
kubectl get clusterroles

# 查看 ClusterRoleBinding
kubectl get clusterrolebindings

# 创建 Role
kubectl create role <role-name> --verb=get,list,watch --resource=pods

# 创建 RoleBinding
kubectl create rolebinding <rolebinding-name> --role=<role-name> --user=<username>

# 创建 ClusterRole
kubectl create clusterrole <clusterrole-name> --verb=get,list,watch --resource=pods

# 创建 ClusterRoleBinding
kubectl create clusterrolebinding <clusterrolebinding-name> --clusterrole=<clusterrole-name> --user=<username>

使用场景:

  • 配置用户权限
  • 服务账号授权
  • 最小权限原则
  • 多租户隔离

10.2 服务账号管理

# 查看服务账号
kubectl get serviceaccounts
kubectl get sa

# 创建服务账号
kubectl create serviceaccount <serviceaccount-name>

# 删除服务账号
kubectl delete serviceaccount <serviceaccount-name>

# 查看 Token
kubectl describe secret <secret-name>

使用场景:

  • 为 Pod 配置权限
  • CI/CD 流水线访问集群
  • 应用访问 K8s API
  • 自动化脚本认证

十一、配置管理

11.1 ConfigMap 管理

# 创建 ConfigMap(从文件)
kubectl create configmap <configmap-name> --from-file=<file-path>

# 创建 ConfigMap(从目录)
kubectl create configmap <configmap-name> --from-file=<directory-path>

# 创建 ConfigMap(从字面值)
kubectl create configmap <configmap-name> --from-literal=key1=value1 --from-literal=key2=value2

# 查看 ConfigMap
kubectl get configmap <configmap-name> -o yaml

# 编辑 ConfigMap
kubectl edit configmap <configmap-name>

# 删除 ConfigMap
kubectl delete configmap <configmap-name>

# 更新 ConfigMap(不删除 Pod)
kubectl create configmap <configmap-name> --from-file=<file-path> --dry-run=client -o yaml | kubectl apply -f -

使用场景:

  • 管理应用配置文件
  • 环境变量注入
  • 配置热更新
  • 多环境配置管理

11.2 Secret 管理

# 创建 Secret(通用)
kubectl create secret generic <secret-name> --from-literal=key1=value1

# 创建 Secret(TLS)
kubectl create secret tls <secret-name> --cert=<cert-file> --key=<key-file>

# 创建 Secret(Docker Registry)
kubectl create secret docker-registry <secret-name> --docker-server=<server> --docker-username=<username> --docker-password=<password> --docker-email=<email>

# 查看 Secret
kubectl get secret <secret-name> -o yaml

# 解码 Secret
kubectl get secret <secret-name> -o jsonpath='{.data.key1}' | base64 --decode

# 编辑 Secret
kubectl edit secret <secret-name>

# 删除 Secret
kubectl delete secret <secret-name>

使用场景:

  • 存储敏感信息(密码、密钥)
  • TLS 证书管理
  • 镜像拉取认证
  • API 密钥管理

十二、故障排查

12.1 事件查看

# 查看所有事件
kubectl get events

# 查看事件(指定命名空间)
kubectl get events -n <namespace>

# 查看事件(排序)
kubectl get events --sort-by=.metadata.creationTimestamp

# 查看事件(监视模式)
kubectl get events --watch

# 查看事件(宽输出)
kubectl get events -o wide

# 查看特定资源的事件
kubectl describe <resource-type> <resource-name>

使用场景:

  • 排查 Pod 启动失败
  • 查看调度问题
  • 监控集群事件
  • 定位资源冲突

12.2 节点故障排查

# 查看节点状态
kubectl get nodes

# 查看节点详情
kubectl describe node <node-name>

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

# 标记节点为不可调度
kubectl cordon <node-name>

# 标记节点为可调度
kubectl uncordon <node-name>

# 驱逐节点上的 Pod
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

# 查看节点标签
kubectl get nodes --show-labels

# 给节点添加标签
kubectl label node <node-name> key=value

# 删除节点标签
kubectl label node <node-name> key-

使用场景:

  • 节点维护
  • 排查节点问题
  • 节点升级
  • 资源调度控制

十三、持久化存储

13.1 PV 和 PVC 管理

# 查看 PV
kubectl get pv

# 查看 PVC
kubectl get pvc

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

# 查看 PVC 详情
kubectl describe pvc <pvc-name>

# 删除 PV
kubectl delete pv <pv-name>

# 删除 PVC
kubectl delete pvc <pvc-name>

# 查看 StorageClass
kubectl get storageclass
kubectl get sc

使用场景:

  • 数据持久化
  • 存储容量管理
  • 动态卷供给
  • 存储类选择

13.2 存储调试

# 查看 Pod 挂载信息
kubectl describe pod <pod-name> | grep -A 10 Mounts

# 进入 Pod 查看挂载点
kubectl exec -it <pod-name> -- df -h

# 查看 PVC 绑定状态
kubectl get pvc <pvc-name> -o jsonpath='{.status.phase}'

# 查看 PV 绑定状态
kubectl get pv <pv-name> -o jsonpath='{.status.phase}'

使用场景:

  • 排查存储挂载问题
  • 验证数据持久化
  • 存储容量规划
  • 数据备份恢复

十四、高级操作

14.1 批量操作

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

# 批量删除所有资源
kubectl delete all --all

# 批量标记节点
kubectl label nodes -l env=prod type=worker

# 批量添加注解
kubectl annotate pods -l app=nginx owner=devops

# 批量导出资源
kubectl get pods -o yaml > all-pods.yaml

使用场景:

  • 批量清理资源
  • 批量标记资源
  • 批量更新配置
  • 资源备份

14.2 资源补丁

# 使用 JSON 补丁
kubectl patch deployment <deployment-name> -p '{"spec":{"replicas":3}}'

# 使用 strategic merge 补丁
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.19"}]}}}}'

# 使用 YAML 补丁
kubectl patch deployment <deployment-name> --patch "$(cat patch.yaml)"

# 删除字段
kubectl patch deployment <deployment-name> --type json -p '[{"op": "remove", "path": "/spec/replicas"}]'

使用场景:

  • 精确修改资源字段
  • 自动化脚本更新
  • CI/CD 集成
  • 批量更新

十五、实用技巧

15.1 快捷别名

# 添加到 ~/.bashrc 或 ~/.zshrc
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias ke='kubectl exec -it'
alias ka='kubectl apply -f'
alias kd='kubectl delete -f'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kaf='kubectl apply -f'
alias kdf='kubectl delete -f'

# 重新加载配置
source ~/.bashrc

使用场景:

  • 提高命令行效率
  • 减少输入错误
  • 快速执行常用命令

15.2 自动补全

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

# 启用 kubectl 自动补全(zsh)
source <(kubectl completion zsh)
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc

# 为别名也启用补全
complete -o default -F __start_kubectl k

使用场景:

  • 快速输入命令
  • 减少记忆负担
  • 提高效率

15.3 常用组合命令

# 查看所有 Pod 的镜像版本
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}'

# 查看所有 Pod 的重启次数
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[0].restartCount}{"\n"}{end}'

# 查看 Pod 的资源请求和限制
kubectl get pods -o custom-columns='NAME:metadata.name,CPU_REQ:spec.containers[*].resources.requests.cpu,MEM_REQ:spec.containers[*].resources.requests.memory'

# 批量删除 Evicted Pod
kubectl get pods --all-namespaces --field-selector=status.phase=Failed -o json | kubectl delete -f -

# 查看节点上运行的 Pod
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node-name>

使用场景:

  • 快速获取信息
  • 批量操作
  • 自动化脚本
  • 监控统计

总结

本文整理了 100+ 条 K8s 常用命令,涵盖了:

  • 集群信息查看
  • 资源管理(创建、删除、更新)
  • 日志查看与调试
  • 滚动更新与回滚
  • 网络调试
  • 资源配额与限制
  • 安全与权限
  • 配置管理
  • 故障排查
  • 持久化存储
  • 高级操作
  • 实用技巧

下一篇预告: K8s 命令实战指南(二)- 生产环境故障排查


参考资料


作者: PaPaBot
发布时间: 2026-03-07
标签: #Kubernetes #K8s #DevOps #运维


本文属于《K8s 命令实战指南》系列文章第一篇

Views: 22

Docker容器化遗留应用(五):综合案例

Docker容器化遗留应用(五):综合案例

Docker容器化

系列导读

这是《Docker容器化遗留应用》系列的最后一篇,前面介绍了容器化理论和实战案例,本篇将通过一个真实的遗留CRM系统容器化案例,展示完整流程。


遗留CRM系统容器化案例

系统架构

原始架构(单体应用):

  • Apache web服务器
  • PHP 7.2后端
  • MySQL 5.7数据库
  • 所有组件耦合在一起

目标

  • 提升扩展性(应对流量高峰)
  • 提高维护性(独立更新组件)
  • 加快部署效率(从小时到分钟)

步骤一:组件隔离

# docker-compose.yml
version: '3.8'

services:
  # 反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - crm-network

  # PHP后端
  php:
    build: ./php
    volumes:
      - ./html:/var/www/html
    networks:
      - crm-network

  # 数据库
  database:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - crm-network

  # 会话管理
  redis:
    image: redis:alpine
    networks:
      - crm-network

networks:
  crm-network:

volumes:
  mysql-data:

步骤二:数据迁移

# 导出现有数据
mysqldump -u root -p crm > crm_backup.sql

# 启动新容器
docker compose up -d

# 导入数据
docker exec -i crm-database-1 mysql -u root -p${DB_PASSWORD} crm < crm_backup.sql

步骤三:测试与部署

# 功能测试
docker run --rm selenium/standalone-chrome python tests/ui_tests.py

# 性能测试
jmeter -n -t crm_load_test.jmx

# 安全测试
docker run --rm owasp/zap2docker-stable zap-baseline.py -t http://crm-app

效果对比:容器化前后

指标 容器化前 容器化后 提升幅度
部署时间 2小时 2分钟 98% ↓
回滚时间 1小时 10秒 99.9% ↓
资源利用率 15% 70% 366% ↑
扩展速度 30分钟/台 5秒/容器 99.7% ↓
环境差异bug 每月3-5个 0 100% ↓

总结:容器化不是万能药,但是良药

获得的好处

  • 环境一致性:告别"在我机器上能跑"
  • 快速扩展:应对流量高峰不再是噩梦
  • 提升部署效率:从小时级到分钟级
  • 降低运维成本:自动化管理

需要注意

  • ⚠️ 有状态应用(数据库)需要特殊处理
  • ⚠️ 安全配置不能忽视
  • ⚠️ 监控和日志必须跟上
  • ⚠️ 团队需要学习新技术栈

下一步行动

从最简单的Web服务器开始,先在测试环境练手,积累经验后再处理复杂系统。

记住:容器化是一场马拉松,不是百米冲刺。


系列总结

《Docker容器化遗留应用》系列完整内容

  1. (一)为什么要容器化 - 理解容器化优势
  2. (二)容器化三步走 - 掌握基本操作
  3. (三)网络与数据管理 - 理解核心概念
  4. (四)实战案例 - 学习真实场景
  5. (五)综合案例 ← 当前

参考资源


恭喜你完成了整个系列!你的遗留应用已经准备好迎接新生了!

Views: 24

Docker容器化遗留应用(四):实战案例

Docker容器化遗留应用(四):实战案例

Docker容器化

系列导读

这是《Docker容器化遗留应用》系列的第四篇,前几篇介绍了容器化基础,本篇将通过实战案例演示如何容器化真实应用。


案例1:Apache服务器容器化

场景描述

一个运行了5年的Apache服务器,配置复杂,依赖特定版本的PHP模块。需要在不修改代码的情况下容器化。

步骤一:准备工作

mkdir dockerized-apache && cd dockerized-apache

步骤二:编写Dockerfile

FROM ubuntu:20.04

# 避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive

# 安装Apache和PHP
RUN apt-get update && \
    apt-get install -y apache2 php libapache2-mod-php && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 复制配置文件
COPY ./my-httpd.conf /etc/apache2/apache2.conf
COPY ./html/ /var/www/html/

# 暴露端口
EXPOSE 80

# 启动Apache(前台运行)
CMD ["apachectl", "-D", "FOREGROUND"]

步骤三:构建与运行

# 构建镜像
docker build -t dockerized-apache .

# 运行容器
docker run -d -p 8080:80 --name my-apache dockerized-apache

# 测试访问
curl http://localhost:8080

案例2:数据库容器化

开发环境 vs 生产环境

环境 推荐方案 理由
开发 容器化数据库 快速启停,易于重置
测试 容器化数据库 隔离测试数据
生产 托管数据库服务 自动备份、高可用

数据迁移:平滑过渡

# 从现有数据库导出数据
mysqldump -u root -p mydb > backup.sql

# 启动新的MySQL容器
docker run -d --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=mypassword \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 导入数据
docker exec -i my-mysql mysql -u root -pmypassword < backup.sql

配置灵活性

# 开发环境:使用容器化数据库
docker run -d --name dev-db \
  -e MYSQL_ROOT_PASSWORD=dev mysql:8.0

# 生产环境:连接托管数据库
docker run -d --name prod-app \
  -e DB_HOST=my-rds-instance.amazonaws.com \
  -e DB_PASSWORD=${DB_PASSWORD} \
  my-app

配置与环境变量管理

环境变量注入

# 通过-e参数注入
docker run -d --name my-app \
  -e DB_HOST=database.local \
  -e DB_PASSWORD=${DB_PASSWORD} \
  my-application

使用.env文件

# .env文件
DB_HOST=database.local
DB_PASSWORD=supersecret
API_KEY=abc123
# docker-compose.yml
services:
  app:
    image: my-application
    environment:
      - DB_HOST=${DB_HOST}
      - DB_PASSWORD=${DB_PASSWORD}

配置文件挂载

# 挂载主机配置文件
docker run -d --name my-app \
  -v /path/to/config:/app/config:ro \
  my-application

安全提示:敏感信息不要硬编码在Dockerfile中,使用环境变量或密钥管理服务。


安全加固措施

1. 镜像安全

# 使用Docker Scout扫描漏洞
docker scout cves my-legacy-app

# 使用Clair扫描
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  arminc/clair-local-scan my-legacy-app

2. 最小权限原则

# 创建非root用户
RUN useradd -m myuser

# 切换到非root用户
USER myuser

# 设置工作目录
WORKDIR /home/myuser

3. 能力限制

# 删除所有能力,仅添加必要的
docker run -d --name my-app \
  --cap-drop=all \
  --cap-add=net_bind_service \
  my-application

4. 只读挂载

# 保护配置文件不被篡改
docker run -d --name my-app \
  -v /path/to/config:/app/config:ro \
  my-application

5. 监控与日志

# 查看容器日志
docker logs -f my-app

# 实时监控资源使用
docker stats my-app

下篇预告

下一篇:《Docker容器化遗留应用(五):综合案例》

将详细介绍:

  • 遗留CRM系统容器化全流程
  • 系统架构拆分
  • 测试与部署
  • 效果对比

系列导航

  • (一)为什么要容器化 - 容器化优势与基本概念
  • (二)容器化三步走 - 从零到一的实践指南
  • (三)网络与数据管理 - 容器间通信与持久化
  • (四)实战案例 ← 当前
  • (五)综合案例 - 遗留CRM系统容器化全流程

通过实战案例,你已经掌握了容器化的核心技术!

Views: 6

Docker容器化遗留应用(三):网络与数据管理

Docker容器化遗留应用(三):网络与数据管理

Docker容器化

系列导读

这是《Docker容器化遗留应用》系列的第三篇,前两篇介绍了容器化优势和基本步骤,本篇将深入讲解网络配置和数据持久化。


网络配置:让容器之间"说得上话"

端口映射:打开对外的窗口

# 将主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 --name web-server nginx

# 访问 http://localhost:8080 即可看到Nginx欢迎页

端口映射格式主机端口:容器端口

容器间通信:建立内部专线

默认桥接网络

# 启动数据库容器
docker run -d --name my-database mongo

# 应用容器连接数据库
docker run -d --name my-app --link my-database:db my-legacy-app

自定义桥接网络(推荐)

# 创建自定义网络
docker network create crm-network

# 数据库容器加入网络
docker run -d --network=crm-network \
  --name database --network-alias=db mongo

# 应用容器通过别名访问
docker run -d --network=crm-network \
  --name app -e DB_HOST=db my-legacy-app

优势

  • ✅ 自动DNS解析
  • ✅ 网络隔离
  • ✅ 容器间可通过名称访问

Docker Compose:一键编排多容器

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - DB_HOST=database
    depends_on:
      - database
    networks:
      - crm-network

  database:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - crm-network

networks:
  crm-network:
    driver: bridge

volumes:
  mongo-data:

一键启动

docker compose up -d

数据持久化:别让数据随容器消失

容器是短暂的,删除容器后数据也会消失。对于数据库等有状态应用,必须使用数据卷。

三种卷类型对比

类型 特点 适用场景
匿名卷 随机名称,难管理 临时任务
命名卷 显式创建,易管理 生产环境
主机卷 直接挂载主机目录 开发调试

命名卷:生产环境首选

# 创建命名卷
docker volume create my-mongo-data

# 挂载到容器
docker run -d --name my-mongodb \
  -v my-mongo-data:/data/db \
  mongo

主机卷:开发调试利器

# 挂载主机目录到容器
docker run -d --name my-mongodb \
  -v /path/on/host:/data/db \
  mongo

# 主机上的文件修改会实时同步到容器

Docker Compose卷配置

services:
  database:
    image: mongo
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:

运行时自动创建和挂载卷。

数据备份:安全第一

# 从容器复制数据到主机
docker cp my-mongodb:/data/db /backup/mongo-$(date +%Y%m%d)

# 或者使用命名卷备份
docker run --rm -v my-mongo-data:/data -v /backup:/backup \
  busybox tar czf /backup/mongo-$(date +%Y%m%d).tar.gz /data

实战:搭建一个Web应用栈

完整的docker-compose.yml

version: '3.8'

services:
  # 反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    networks:
      - app-network

  # Web应用
  web:
    build: .
    environment:
      - DB_HOST=database
    depends_on:
      - database
    networks:
      - app-network

  # 数据库
  database:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

一键启动

# 启动所有服务
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f

# 停止所有服务
docker compose down

下篇预告

下一篇:《Docker容器化遗留应用(四):实战案例》

将详细介绍:

  • Apache服务器容器化
  • 数据库容器化考量
  • 配置与环境变量管理
  • 安全加固措施

系列导航

  • (一)为什么要容器化 - 容器化优势与基本概念
  • (二)容器化三步走 - 从零到一的实践指南
  • (三)网络与数据管理 ← 当前
  • (四)实战案例 - Apache与数据库容器化
  • (五)综合案例 - 遗留CRM系统容器化全流程

掌握了网络和数据管理,你的容器化应用就可以投入生产了!

Views: 12