Docker容器生命周期管理详解

一、Docker容器生命周期状态

Docker容器具有完整的生命周期状态,从创建到销毁,每个阶段都有其特定的作用和命令支持:

  • Created(已创建):容器已创建但尚未运行
  • Running(运行中):容器正在运行,执行进程活跃
  • Paused(暂停):容器进程被挂起,暂时停止调度
  • Stopped/Exited(已停止/退出):容器运行完毕或被手动停止
  • Dead(死掉):异常中止或资源清理失败时的状态

二、Docker容器生命周期管理命令

1. 创建容器

docker create命令:创建容器但不启动

1
docker create --name mycontainer nginx

docker run命令:创建并启动容器

1
docker run -d --name mycontainer nginx

常用参数

  • -d, --detach:后台运行容器
  • --name:指定容器名称
  • -p:端口映射,格式:主机端口:容器端口
  • -v:挂载卷,格式:主机路径:容器路径
  • -e:设置环境变量
  • -m:限制内存使用
  • --cpus:限制CPU使用
  • --restart:设置重启策略
  • --rm:容器退出时自动删除

2. 启动容器

docker start命令:启动已创建的容器

1
docker start mycontainer

常用参数

  • -a, --attach:附加STDOUT/STDERR并向前传递信号
  • -i, --interactive:保持STDIN打开

3. 运行容器

docker run命令:创建并启动容器(常用组合)

1
docker run -d --name webserver -p 80:80 nginx

4. 暂停容器

docker pause命令:暂停容器运行

1
docker pause mycontainer

5. 恢复容器

docker unpause命令:恢复暂停的容器

1
docker unpause mycontainer

6. 停止容器

docker stop命令:优雅停止容器

1
docker stop mycontainer

常用参数

  • -t, --time:停止前等待时间(默认10秒)

7. 强制停止容器

docker kill命令:强制终止容器

1
docker kill mycontainer

常用参数

  • -s, --signal:发送指定信号(默认SIGKILL)

8. 重启容器

docker restart命令:重启容器

1
docker restart mycontainer

常用参数

  • -t, --time:停止前等待时间(默认10秒)

9. 删除容器

docker rm命令:删除已停止的容器

1
docker rm mycontainer

常用参数

  • -f, --force:强制删除运行中的容器
  • -v, --volumes:删除容器关联的卷
  • -l, --link:删除指定的连接

10. 查看容器状态

docker ps命令:查看运行中的容器

1
docker ps

常用参数

  • -a:显示所有容器(包括已停止的)
  • -q:仅显示容器ID

11. 查看容器日志

docker logs命令:查看容器日志

1
docker logs mycontainer

常用参数

  • -f:跟踪日志输出
  • --tail:显示最后N行
  • -t:显示时间戳

12. 进入容器

docker exec命令:在运行中的容器执行命令

1
docker exec -it mycontainer /bin/bash

常用参数

  • -i:保持STDIN打开
  • -t:分配伪终端
    docker attach命令:附加到运行中的容器
1
docker attach mycontainer

13. 查看容器详细信息

docker inspect命令:查看容器详细信息

1
docker inspect mycontainer

14. 查看容器资源使用

docker stats命令:查看容器资源使用情况

1
docker stats mycontainer

15. 查看容器进程

docker top命令:查看容器内运行的进程

1
docker top mycontainer

16. 容器间文件复制

docker cp命令:在容器和主机间复制文件

1
2
docker cp localfile mycontainer:/path/in/container
docker cp mycontainer:/path/in/container localfile

三、常用操作示例

1. 批量操作

批量停止所有运行中的容器

1
docker stop $(docker ps -q)

批量删除已停止的容器

1
docker rm $(docker ps -aq -f status=exited)

批量启动所有容器

1
docker start $(docker ps -aq)

2. 自动重启策略

1
docker run -d --restart unless-stopped nginx

3. 临时容器运行

1
docker run --rm myapp:test ./run_tests.sh

4. 资源限制

1
docker run -d -m 512m --cpus=1.0 nginx

5. 端口映射

1
docker run -d -p 8080:80 nginx

6. 数据卷挂载

1
docker run -d -v /host/path:/container/path nginx

7. 环境变量设置

1
docker run -d -e MYSQL_ROOT_PASSWORD=password mysql

8. 交互式运行

1
docker run -it ubuntu /bin/bash

四、生命周期管理最佳实践

  1. 使用--name参数为容器指定有意义的名称
  2. 合理设置重启策略确保服务可用性
  3. 使用资源限制防止单个容器占用过多资源
  4. 定期清理已停止的容器释放系统资源
  5. 使用docker logs监控容器运行状态
  6. 优雅停止容器使用docker stop而非docker kill
  7. 生产环境建议使用docker-compose或Kubernetes进行管理
  8. 定期备份重要容器的数据卷

🔗 相关文档

Docker 架构解析 | Docker镜像操作详解 | Docker网络模式详解 | OCI 标准概述

Docker数据持久化详解

核心概念

  • Docker数据持久化是容器化应用开发的核心挑战
  • 影响数据安全与应用可靠性
  • 提供Volume和Bind Mount两种主要机制

Volume机制

  • 由Docker管理的持久化数据卷
  • 存储位置:宿主机特定目录(/var/lib/docker/volumes/)
  • 创建命令:docker volume create mydata
  • 使用命令:docker run -d --name webapp -v mydata:/app/data nginx
  • 特点:生命周期独立于容器,适合数据库存储等场景

Bind Mount机制

  • 将宿主机任意目录直接挂载到容器中
  • 开发者对路径有完全控制权
  • 使用命令:docker run -d --name devapp -v $(pwd):/app nginx
  • 特点:适合开发环境,便于代码实时同步

对比分析

  • Volume优势:Docker管理、安全性高、跨平台兼容性好
  • Bind Mount优势:路径可控、适合开发调试
  • Bind Mount劣势:依赖宿主机目录结构

应用场景建议

  • 生产环境:优先使用Volume,提供更安全、易管理的持久化方式
  • 开发环境:Bind Mount更适合代码热重载和实时文件同步

注意事项

  • 确保数据安全保存到宿主机或其他存储位置
  • 避免容器删除导致的数据丢失问题

🔗 相关文档

Docker容器生命周期管理详解 | Docker Compose 多容器编排入门

Docker网络模式详解

Docker四种核心网络模式

1、Bridge桥接模式

  • 特性: 默认模式,Docker为容器分配独立虚拟网卡并接入docker0网桥
  • 网络隔离: 容器间通过Docker网络通信,与外部网络隔离
  • 适用场景: 常规应用隔离部署,需端口映射-p暴露服务

2、Host主机模式

  • 特性: 容器直接共享宿主机网络命名空间,无独立网络栈
  • 性能优势: 性能最佳无NAT转换,但会占用宿主机端口可能冲突
  • 适用场景: 网络密集型应用如负载均衡器,需避免端口转发开销

3、Container容器共享模式

  • 特性: 新容器共享指定容器的网络命名空间,如–net=container:容器名
  • 通信方式: 容器间可通过localhost直接通信,无需暴露端口
  • 适用场景: 依赖紧密的容器组,如日志收集器与应用容器

4、None无网络模式

  • 特性: 不配置任何网络接口,容器完全隔离
  • 配置要求: 需手动自定义网络栈,如通过nsenter命令
  • 适用场景: 安全性要求极高的任务或特殊网络调试

端口映射配置方法

基本配置

  • 参数: 使用-p参数指定端口映射
  • 格式: -p host_port:container_port
  • 示例: docker run -p 8080:80 nginx,将本地的8080端口映射到容器的80端口上

其他配置方式

  • 替代参数: 也可以使用–publish参数,格式相同
  • 多端口映射: 如需映射多个端口,可使用多个-p参数
  • 多端口示例: docker run -p 8080:80 -p 3306:3306 nginx

查看端口映射信息

查看命令

  • 命令: 使用docker port命令查看容器的端口映射信息
  • 语法: docker port container_id

🔗 相关文档

Docker 架构解析 | Docker容器生命周期管理详解 | Docker Compose 多容器编排入门

Docker镜像仓库详解

Docker Hub推送与拉取操作

登录Docker Hub

1
docker login

输入用户名和密码完成登录
推送镜像到Docker Hub

1
2
docker tag local-image-name username/repository:tag
docker push username/repository:tag

从Docker Hub拉取镜像

1
docker pull username/repository:tag

Harbor私有仓库推送与拉取操作

配置Docker支持私有仓库
/etc/docker/daemon.json中添加insecure-registries配置,然后重启Docker服务
登录Harbor

1
docker login -u admin -p password harbor地址:port

推送镜像到Harbor

1
2
docker tag 镜像ID harbor地址:port/项目名/镜像名:版本
docker push harbor地址:port/项目名/镜像名:版本

从Harbor拉取镜像

1
docker pull harbor地址:port/项目名/镜像名:版本

轩辕镜像服务

服务概述
轩辕镜像专注公共仓库场景,整合Docker Hub、Google Container Registry、Kubernetes官方仓库等主流镜像源
免费版使用方法

  • 配置registry-mirrors指向docker.xuanyuan.me
  • 或直接使用:docker pull docker.xuanyuan.me/镜像名:tag
  • 仅支持Docker Hub镜像拉取
    专业版功能
  • 提供专属域名拉取方式:docker pull ***.xuanyuan.run/镜像名:tag
  • 支持7+个主流镜像仓库,包括:
    • Docker Hub
    • Google Container Registry (GCR)
    • GitHub Container Registry (GHCR)
    • Kubernetes仓库
    • NVIDIA
    • Quay
    • Microsoft
    • Elastic
      等仓库

🔗 相关文档

Docker镜像操作详解 | Docker 实际应用:构建自定义镜像 | 容器镜像仓库:Docker Hub 与私有仓库

Docker镜像管理详解

Docker 镜像是容器的只读模板,包含应用及其运行环境。本文涵盖常用镜像操作命令、示例和最佳实践。

一、获取镜像

1. docker pull – 拉取镜像

1
docker pull [选项] 镜像名[:标签]
  • 默认标签为 latest
  • 示例:
    docker pull ubuntu:20.04
    docker pull nginx:1.25

2. docker push – 推送镜像

1
docker push 用户名/镜像名:标签
  • 需先登录仓库(docker login)并为镜像打上正确标签
  • 示例:docker push myrepo/hello:v1

二、管理本地镜像

3. docker images (或 docker image ls) – 列出镜像

1
docker images [选项]
  • -a:显示中间层镜像
  • -q:仅显示镜像 ID
  • --digests:显示摘要

4. docker rmi – 删除镜像

1
docker rmi [选项] 镜像名[:标签|镜像ID]
  • -f:强制删除(有容器依赖时)
  • 清理悬挂镜像:docker image prune

5. docker tag – 打标签

1
docker tag 源镜像[:标签] 目标镜像[:标签]
  • 为镜像添加新名称/仓库路径,不复制内容
  • 示例:docker tag nginx:latest myregistry.com/mynginx:v1

三、构建镜像

6. docker build – 通过 Dockerfile 构建

1
docker build [选项] 路径
  • -t 镜像名:标签:指定名称
  • -f Dockerfile:指定文件(默认当前目录下 Dockerfile)
  • --no-cache:忽略缓存
  • 示例:docker build -t myapp:v1 .

7. docker commit – 从容器创建镜像(临时调试,不推荐生产)

1
docker commit 容器名 新镜像名:标签

四、镜像导入/导出与文件系统转换

8. docker save – 保存镜像为 tar 文件(保留层历史)

1
docker save -o 文件名.tar 镜像名:标签

示例:docker save -o ubuntu.tar ubuntu:20.04

9. docker load – 从 tar 文件加载镜像

1
docker load -i 文件名.tar

10. docker export / docker import – 容器快照转为镜像

  • docker export 容器名 > container.tar:导出容器文件系统(丢失历史层)
  • docker import container.tar 新镜像名:标签:导入为镜像(单层)

    save/load 保留完整分层结构,export/import 生成扁平镜像,体积更小但无法追溯构建历史。

五、查看镜像详情

11. docker inspect – 显示镜像元数据(JSON)

1
docker inspect 镜像名:标签

包含架构、环境变量、开放端口、入口点等。

12. docker history – 查看镜像构建历史层

1
docker history 镜像名:标签

每层的创建命令与大小,有助于优化镜像。

六、清理与空间回收

13. docker image prune – 删除未使用的镜像

  • -a:删除所有不被容器引用的镜像
  • -f:跳过确认
    示例:docker image prune -a

14. docker system df – 查看磁盘占用(镜像、容器、卷)

典型工作流示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 拉取基础镜像
docker pull node:18-alpine

# 构建自定义镜像
docker build -t mynodeapp:1.0 .

# 标记以便推送到仓库
docker tag mynodeapp:1.0 mydockerhub/mynodeapp:1.0

# 登录并推送
docker login
docker push mydockerhub/mynodeapp:1.0

# 另一台机器拉取并运行
docker pull mydockerhub/mynodeapp:1.0

# 导出离线包
docker save -o app.tar mynodeapp:1.0
# 加载离线包
docker load -i app.tar

安全与最佳实践

  • 避免使用 latest 标签,指定具体版本号
  • 删除镜像前确认没有依赖容器(包括停止的容器),必要时加 -f
  • 生产环境推荐使用 Dockerfile + docker build,而非 docker commit
  • 定期运行 docker image prune 清理无用镜像

🔗 相关文档

Docker容器生命周期管理详解 | Docker镜像仓库详解 | Docker 实际应用:构建自定义镜像

核心概念解析 📚

一、PV(持久卷)💾

PV是集群级别的存储资源,代表实际的存储设备或存储空间,如NFS、Ceph、云硬盘等。

主要特性

  • 独立生命周期: 即使Pod被删除,PV中的数据仍然保留
  • 访问模式支持:
    • ReadWriteOnce(单节点读写)
    • ReadOnlyMany(多节点只读)
    • ReadWriteMany(多节点读写)

静态PV创建示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /opt/k8s-pods/data
server: 192.168.179.102

二、PVC(持久卷声明)📝

PVC是用户对存储资源的请求,定义了所需存储的大小、访问模式等属性。

核心作用

  • 作为存储的”接口”,封装底层存储复杂性
  • 使开发者无需关心具体存储实现
  • 一个PV只能被一个PVC绑定

PVC创建示例

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
storageClassName: nfs

三、StorageClass(存储类)⚙️

StorageClass是实现动态存储供应的核心组件,定义了如何创建PV的模板。

关键字段

  • provisioner: 存储供应者
  • parameters: 存储参数
  • reclaimPolicy: 回收策略
  • volumeBindingMode: 绑定模式

StorageClass创建示例

1
2
3
4
5
6
7
8
9
10
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client-storageclass
provisioner: nfs-storage
parameters:
archiveOnDelete: "false"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate

存储供应模式 🔄

静态供应模式 📦

由管理员预先创建PV,然后PVC进行绑定。

创建命令

1
2
3
kubectl create -f pv.yaml
kubectl create -f pvc.yaml
kubectl create -f storageclass.yaml

动态供应模式 🚀

通过StorageClass自动创建PV,大大简化存储管理。

创建命令

1
2
3
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f storageclass.yaml

PV生命周期状态 📊

PV的生命周期包括四种状态:

状态 描述
Available 还未与某个PVC绑定
Bound 已与某个PVC绑定
Released 绑定的PVC已经删除,资源已释放,但未被集群回收
Failed 自动资源回收失败

回收策略 ♻️

回收策略决定了PVC删除后PV的处理方式:

策略 描述
Retain PV不会被自动删除,数据依然保留
Delete PV会被自动删除,关联的存储资源也会被清理
Recycle 对卷执行基本清理操作,但已被弃用

完整创建方法 🔧

动态供应完整配置

RBAC权限配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io

NFS Provisioner部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-storage
- name: NFS_SERVER
value: 192.168.179.102
- name: NFS_PATH
value: /opt/k8s
volumes:
- name: nfs-client-root
nfs:
server: 192.168.179.102
path: /opt/k8s

创建动态供应组件

1
2
3
4
kubectl apply -f rbac.yaml
kubectl apply -f nfs-provisioner.yaml
kubectl apply -f storageclass.yaml
kubectl apply -f dynamic-pvc.yaml

Pod使用PVC创建方法 🐳

Pod使用PVC的YAML示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
name: nginx-pv-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- name: nginx-pv-storage
mountPath: "/usr/share/nginx/html"
volumes:
- name: nginx-pv-storage
persistentVolumeClaim:
claimName: nfs-pvc

StatefulSet使用PVC模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "nfs-client-storageclass"
resources:
requests:
storage: 1Gi

管理命令汇总 🛠️

资源创建命令

1
2
3
kubectl create -f <yaml-file>           # 创建资源
kubectl apply -f <yaml-file> # 应用配置
kubectl apply -f <directory> # 应用目录下所有配置

资源查看命令

1
2
3
4
5
kubectl get pv,pvc,sc                   # 查看所有存储资源
kubectl get pv -o wide # 查看PV详细信息
kubectl get pvc -o wide # 查看PVC详细信息
kubectl describe sc <sc-name> # 查看StorageClass详情
kubectl get pv --sort-by=.spec.capacity.storage # 按容量排序PV

资源删除命令

1
2
3
4
5
kubectl delete pv <pv-name>             # 删除PV
kubectl delete pvc <pvc-name> # 删除PVC
kubectl delete sc <sc-name> # 删除StorageClass
kubectl delete -f <yaml-file> # 删除配置文件中的资源
kubectl delete pod,pvc,pv --all # 删除所有相关资源

故障排查命令

1
2
3
4
5
kubectl describe pvc <pvc-name>         # 查看PVC详细状态
kubectl describe pv <pv-name> # 查看PV详细状态
kubectl logs <provisioner-pod> # 查看Provisioner日志
kubectl get events --sort-by=.metadata.creationTimestamp # 查看事件
kubectl exec -it <pod-name> -- /bin/bash # 进入容器调试

存储资源扩展命令

1
2
kubectl patch pvc <pvc-name> -p '{"spec":{"resources":{"requests":{"storage":"10Gi"}}}}'  # 扩展PVC容量
kubectl get pv,pvc -o wide # 查看扩展后的状态

不同存储类型创建示例 💿

本地存储PV创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1

云存储PV创建(AWS EBS示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolume
metadata:
name: aws-ebs-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: aws-ebs
awsElasticBlockStore:
volumeID: vol-0123456789abcdef0
fsType: ext4

Ceph RBD PV创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-rbd-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ceph-rbd
rbd:
monitors:
- "192.168.1.100:6789"
- "192.168.1.101:6789"
- "192.168.1.102:6789"
pool: rbd
image: foo
fsType: ext4
readOnly: false
user: admin
secretRef:
name: ceph-secret

动态供应工作流程 🔄

动态供应机制的工作流程为:

  1. 用户创建PVC并指定StorageClass 📝
  2. Kubernetes根据StorageClass调用对应的provisioner创建PV ⚙️
  3. PV自动绑定到PVC 🔗
  4. Pod通过PVC使用存储资源 🐳

最佳实践建议 ✨

  1. 存储类规划: 根据应用需求创建多个StorageClass,如高性能存储、标准存储、归档存储等
  2. 回收策略选择: 生产环境建议使用Retain策略以避免数据意外丢失
  3. 容量规划: 合理设置PV容量,避免资源浪费或不足
  4. 监控告警: 定期检查PV/PVC状态,设置存储使用率告警
  5. 备份策略: 为重要数据制定定期备份计划

🔗 相关文档

Kubernetes核心概念详解 | Kubernetes调度与部署机制详解 | ConfigMap配置与密文管理详解

📚 Kubernetes调度与部署机制详解

🎯 学习目标

  • 掌握Kubernetes Pod调度的核心机制
  • 理解部署管理策略和最佳实践
  • 学会配置自动扩缩容和优化调度性能

🏗️ 一、Kubernetes调度机制

1.1 NodeSelector(节点选择器)🎯

  • 概念: 最简单的Pod调度约束方式,通过匹配节点标签控制Pod调度
  • 实现: 在Pod的spec字段中添加nodeSelector字段
  • 应用场景: 将Pod调度到具有特定标签的节点上
  • 示例: 将Pod调度到具有source=qikqiak标签的节点上

1.2 亲和性与反亲和性 🔗

节点亲和性

  • 软策略 (preferredDuringSchedulingIgnoredDuringExecution): 优先满足但不强制
  • 硬策略 (requiredDuringSchedulingIgnoredDuringExecution): 必须满足条件
  • 支持的操作符: In、NotIn、Gt、Lt、Exists、DoesNotExist

Pod亲和性与反亲和性

  • podAffinity: 让Pod与指定Pod部署在同一拓扑域
  • podAntiAffinity: 让Pod不与指定Pod部署在同一拓扑域
  • 拓扑域: 通过topologyKey指定,常用如kubernetes.io/hostname

1.3 污点与容忍 🚫

污点效果

  • NoSchedule: Pod不会被调度到标记的节点
  • PreferNoSchedule: NoSchedule的软策略版本
  • NoExecute: 无对应Tolerate的Pod会被直接逐出

🚀 二、Kubernetes部署管理

2.1 滚动更新 🔄

  • 特点: 默认部署策略,零停机部署
  • 机制: 逐步替换现有Pod实例,确保足够数量的Pod可用
  • 优势: 平滑过渡,最小化服务中断

2.2 回滚机制 ⏪

  • 命令: kubectl rollout undo deployment <DEPLOYMENT-NAME>
  • 作用: 快速恢复生产环境问题
  • 重要性: 保障系统稳定性和可恢复性

2.3 HPA(水平自动扩缩)📈

  • 功能: 根据负载自动调整Pod数量
  • 指标: 基于CPU、内存或自定义指标
  • 特点: 水平扩缩与垂直扩缩不同

💻 三、命令汇总

调度相关命令

1
2
3
4
5
6
# 查看节点标签
kubectl get nodes --show-labels
# 给节点添加标签
kubectl label nodes NODE-NAME KEY=VALUE
# 给节点添加污点
kubectl taint nodes NODE-NAME KEY=VALUE:EFFECT

部署管理命令

1
2
3
4
5
6
7
8
# 更新部署
kubectl apply -f deployment.yaml
# 查看部署状态
kubectl rollout status deployment/<DEPLOYMENT-NAME>
# 回滚部署
kubectl rollout undo deployment/<DEPLOYMENT-NAME>
# 查看部署历史
kubectl rollout history deployment/<DEPLOYMENT-NAME>

自动扩缩命令

1
2
3
4
# 创建HPA
kubectl autoscale deployment <DEPLOYMENT-NAME> --min=2 --max=10 --cpu-percent=80
# 查看HPA状态
kubectl get hpa

🆕 四、最新技术补充

4.1 HPA高级配置 🎛️

基于最新实践,HPA现在支持更丰富的指标类型:

自定义指标扩缩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: custom-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k

4.2 滚动更新优化策略 ⚡

最新的滚动更新实践建议:

优化配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: apps/v1
kind: Deployment
metadata:
name: optimized-deployment
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 额外加1个副本平滑引入新版本
maxUnavailable: 0 # 保证服务不减容
template:
metadata:
labels:
app: my-app
spec:
terminationGracePeriodSeconds: 60
containers:
- name: app
image: my-app:v2
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]

4.3 调度策略最佳实践 🎯

根据2024-2025年的最新实践:

节点亲和性配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu
operator: In
values:
- "true"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- "az1"

📊 五、技术要点总结

调度机制核心要点 🎯

  1. NodeSelector: 简单但功能有限,适合基础场景
  2. 节点亲和性: 支持软硬策略,操作符丰富,灵活性强
  3. Pod亲和性: 基于拓扑域控制Pod间部署关系
  4. 污点容忍: 节点级别的排斥机制,配合Pod容忍使用

部署管理核心要点 🚀

  1. 滚动更新: 零停机部署,通过maxSurge和maxUnavailable控制
  2. 回滚机制: 支持快速回退到历史版本
  3. HPA: 基于指标自动扩缩,支持多种指标类型

最佳实践建议 💡

  1. 合理设置资源请求和限制: 确保调度决策准确
  2. 使用readinessProbe: 确保Pod就绪后才接收流量
  3. 配置优雅终止: 通过preStop和terminationGracePeriodSeconds实现平滑关闭
  4. 监控调度效果: 使用Prometheus等工具监控调度性能

🎓 六、学习建议

学习路径 📈

  1. 基础掌握: 先理解NodeSelector和基本亲和性配置
  2. 实践操作: 通过实际部署练习滚动更新和回滚
  3. 深入理解: 学习HPA的自定义指标配置
  4. 性能优化: 掌握调度策略的性能调优技巧

实践建议 🛠️

  • 从简单的NodeSelector开始,逐步学习复杂的亲和性配置
  • 在测试环境中充分练习滚动更新和回滚操作
  • 结合监控工具观察调度效果和性能指标
  • 关注Kubernetes版本的更新和新特性

🔗 相关文档

Kubernetes核心概念详解 | Kubernetes网络模型与实现详解 | Kubernetes存储抽象详解 | ConfigMap配置与密文管理详解 | Kubernetes资源管理详解

第二阶段:Docker(容器引擎入门)·多容器编排

多容器编排入门

  • 概念:通过声明式 YAML 文件定义多容器应用的服务、网络、卷等依赖关系,单命令实现整体启动和停止。
  • 实现
    • Compose 解析 YAML 文件,生成每个服务的容器配置。
    • 自动创建项目专属的桥接网络,服务名解析为容器 IP(通过内部 DNS)。
    • 依赖关系(depends_on)仅控制启动顺序,不保证健康。
    • Compose v3 支持定义多种部署模式(swarm 模式除外,单纯 Compose 是单机编排)。

🔗 相关文档

Docker 网络模型 | Docker 数据持久化 | Docker多容器编排详解

第三阶段:Docker 的实际应用(部署项目概念与实现)·安装与部署 Nginx

安装 Docker Engine 的概览

  • 概念:Docker Engine 是一组软件包,包括 dockerd、containerd、runc 以及客户端。
  • 实现:Linux 版本通过包管理器安装,利用 systemd 管理守护进程。守护进程以 root 权限运行,监听 Unix socket(/var/run/docker.sock),客户端通过该 socket 通信。

部署 Web 应用的基本流程

  • 概念:容器化部署指将应用及依赖打包到镜像,运行容器并对外暴露服务。
  • 实现
    • 镜像拉取:从仓库下载镜像各层,存储到本地内容寻址存储。
    • 容器创建:分配 rootfs(镜像层 + 容器可写层)、网络 netns、IP 地址及 Cgroups 配置。
    • 端口映射:在宿主机 iptables 上添加 DNAT 规则。
    • 卷挂载:通过绑定挂载或 volume 挂载将数据目录映射进容器。

🔗 相关文档

Docker 容器生命周期 | Docker 网络模型 | Docker 数据持久化

第三阶段:Docker 的实际应用(部署项目概念与实现)·构建自定义镜像

本地构建 Docker 镜像

  • 概念:通过 Dockerfile 描述镜像构建步骤,生成可复用的应用镜像。
  • 实现
    • 构建上下文:Docker 将指定目录(或 URL)发送到守护进程。
    • 指令执行:守护进程逐条解析 Dockerfile 指令,每条指令启动临时容器执行(如 RUN),并将结果文件系统提交为新层。
    • 缓存机制:若指令及依赖文件未变更,则复用已有层(避免重复构建)。
    • 多阶段构建:构建器维护多个阶段镜像,最终仅将最后阶段的层导出为结果镜像。

🔗 相关文档

Docker 镜像管理 | Docker镜像仓库详解 | Docker 实际应用:安装与部署 Nginx
0%