云容器服务 (Docker 与 ACK 托管集群基础)
一、什么是Docker
📌 【学习目标】
- 理解容器化技术的核心概念与价值
- 掌握Docker与传统虚拟机的本质区别
- 熟悉Docker三大核心要素:镜像、容器、仓库
- 能够使用基础Docker命令完成镜像和容器的基本操作
1、Docker 是什么?
Docker 是一款开源的应用容器化引擎与平台,基于 Go 语言开发,核心依托 Linux 内核的 Namespace(资源隔离)、Cgroups(资源限制)以及联合文件系统等底层技术,实现了应用程序与其运行环境的标准化打包、隔离化运行、跨平台迁移与高效管理。
简单来说,Docker 是一种轻量级的操作系统级虚拟化解决方案,它能将软件应用及其所有依赖项、配置文件、运行库、环境变量打包成一个独立、可移植的容器,彻底解决应用程序在不同环境中运行不一致的难题,践行"一次构建,处处运行"的核心理念。
💡 补充说明
Docker 最初由 dotCloud 公司于 2013 年发布,现已成为容器化领域的事实标准,被全球数百万开发者和企业广泛采用。
2、为什么我们需要 Docker?
在传统的软件开发流程中,我们经常会遇到这样的问题:
- 开发人员在自己电脑上写的代码运行正常,到了测试环境就出问题
- 测试环境没问题,到了生产环境又出问题
- 每次部署都需要手动配置环境,耗时又容易出错
- 不同应用之间的依赖冲突,导致系统不稳定
Docker 的出现完美解决了这些问题,它的核心价值体现在以下三个方面:
1. 打包项目与环境 核心价值
将项目代码、运行环境和配置打包成镜像,实现一致的运行环境。无论你是在 Windows、Mac 还是 Linux 系统上,只要有 Docker,就能运行同一个镜像,得到完全相同的运行结果。
2. 一键部署上线 核心价值
将打包好的镜像传到服务器,通过简单命令即可实现项目上线。传统部署可能需要几个小时甚至几天,而使用 Docker 只需要几秒钟到几分钟。
3. 版本控制与回滚 核心价值
每次发版都生成新镜像,出现问题时可以快速回滚到之前的版本。这大大降低了发布风险,让我们可以更频繁、更安全地进行迭代。
⚠️ 重要提示
Docker 解决的是环境一致性问题,而不是代码本身的 bug 问题。如果代码本身有问题,即使在 Docker 中运行也依然会出错。
3、Docker 与虚拟机的区别
很多人会把 Docker 理解为一个轻量级虚拟机,但其实它们是两种完全不同的技术:
| 特性 | Docker 容器 容器技术 | 传统虚拟机 硬件虚拟化 |
|---|---|---|
| 虚拟化级别 | 操作系统级虚拟化 | 硬件级虚拟化 |
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 极小(MB级) | 极大(GB级) |
| 性能损耗 | 几乎无损耗 | 约10%-30% |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 可移植性 | 极高 | 一般 |
一句话总结:容器是"进程隔离",虚拟机是"硬件虚拟化"。Docker 容器共享宿主机的内核,而虚拟机则拥有自己完整的操作系统内核。
📖 拓展阅读:隔离性对比
- 虚拟机:通过 Hypervisor 模拟完整的硬件环境,每个虚拟机都有独立的内核、内存、CPU 和存储,隔离性最强,但资源开销最大
- Docker 容器:通过 Namespace 实现进程、网络、文件系统等资源的隔离,通过 Cgroups 实现资源限制,隔离性稍弱,但资源开销极小
- 对于大多数应用场景,Docker 的隔离性已经足够满足需求
4、Docker 核心三要素
Docker 有三个核心概念,理解了这三个概念,你就掌握了 Docker 的基础:
1. 镜像(Image) 只读模板
- 镜像就是应用的"只读模板",包含了运行应用所需的所有代码、依赖、配置和环境变量
- 镜像是分层存储的,相同的层可以在不同镜像之间共享,大大节省了存储空间
- 你可以把镜像理解为"Windows系统镜像"或者"游戏安装包"
2. 容器(Container) 运行实例
- 容器是镜像的"运行实例",是真正正在运行的程序
- 容器是可读写的,你可以在容器中进行各种操作
- 一个镜像可以启动无数个容器,就像一个安装包可以安装无数个程序一样
3. 仓库(Repository) 镜像仓库
- 仓库是镜像的"存储仓库",用于集中存放和分发镜像
- 最知名的公共仓库是 Docker Hub,相当于镜像版的 GitHub
- 企业也可以搭建自己的私有仓库,用于存储内部镜像
简单比喻:
- 镜像 = 安装盘
- 容器 = 装好运行的系统
- Dockerfile = 安装教程
- 仓库 = 应用商店
5、Docker 基本工作流程
- 开发阶段:开发人员编写代码和 Dockerfile,使用
docker build命令构建镜像 - 测试阶段:将镜像推送到仓库,测试人员从仓库拉取镜像,使用
docker run命令启动容器进行测试 - 生产阶段:测试通过后,直接将同一个镜像部署到生产环境,确保环境完全一致
6、Docker 常用命令
镜像相关命令 实操
# 查看本地所有镜像
docker images
# 从仓库拉取镜像
docker pull 镜像名:标签
# 构建镜像
docker build -t 镜像名:标签 .
# 删除本地镜像
docker rmi 镜像ID/名称容器相关命令 实操
# 运行容器
docker run -d -p 主机端口:容器端口 --name 容器名 镜像名:标签
# 查看正在运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop 容器ID/名称
# 启动已停止的容器
docker start 容器ID/名称
# 重启容器
docker restart 容器ID/名称
# 删除容器
docker rm 容器ID/名称
# 进入容器内部
docker exec -it 容器ID/名称 /bin/bash💡 命令技巧
- 按 Ctrl + P + Q 可以退出容器但不停止容器运行
- 按 Ctrl + C 可以停止容器并退出
- 大多数 Docker 命令都可以使用容器ID的前几位来代替完整的ID
7、Docker总结
📌 【课程总结】
Docker 是现代软件开发、部署和运维的核心技术之一,它通过容器化技术解决了环境一致性问题,大大提高了开发效率和部署速度,降低了运维成本。
无论是个人开发者还是企业团队,学习和掌握 Docker 都是非常有必要的。它不仅能让你的工作更轻松,还能为你打开云原生、微服务、DevOps 等更广阔的技术领域的大门。
🚀 下一步学习建议
安装 Docker Desktop 并完成基础配置
尝试拉取并运行 Nginx、MySQL 等常用镜像
学习编写 Dockerfile 来构建自己的镜像
了解 Docker Compose 用于编排多容器应用
二、什么是K8s(Kubernetes)
📌 【学习目标】
- 理解容器编排的核心概念与K8s的诞生背景
- 掌握K8s与Docker的本质区别与协同关系
- 熟悉K8s的核心架构组件与关键资源对象
- 了解K8s的基本工作流程与常用命令
1、K8s 是什么?
Kubernetes(简称 K8s,名称源于希腊语"舵手"或"飞行员")是由 Google 基于内部 Borg 系统开源的容器编排平台,于2014年正式发布,后捐赠给云原生计算基金会(CNCF),现已成为容器编排领域的事实标准。
K8s 是一个可弹性运行分布式系统的框架,它能够自动化管理大规模容器化应用的部署、扩展、运维与生命周期,解决了容器数量增多后手动管理效率低下、容灾能力差、资源调度困难等核心问题,让企业能够轻松构建和管理大规模、高可用的云原生应用。
💡 补充说明
K8s 名称中的"8"代表"Kubernete"中间的8个字母,是技术圈常用的缩写方式。目前全球几乎所有主流云厂商(阿里云、腾讯云、AWS、Azure等)都提供了托管K8s服务,极大降低了企业使用K8s的门槛。
2、为什么我们需要 K8s?
Docker 解决了应用的"打包和运行"问题,实现了环境一致性,但当容器数量从几个增长到几百个、几千个时,Docker裸跑(无编排) 会暴露出严重的局限性:
- 无集群能力:仅能单机管理容器,无法跨机器调度
- 无容灾自愈:容器崩溃或节点故障后需手动重启,服务中断时间长
- 无统一调度:手动分配CPU、内存等资源效率极低,易出现资源浪费或过载
- 无网络与存储管理:跨机器容器通信需手动配置,存储无法灵活挂载
- 无版本管理:滚动更新、版本回滚需手动编写复杂脚本
K8s 的出现完美解决了这些"容器编排难题",它的核心价值体现在以下几个方面:
1. 自动化运维 核心价值
无需人工干预,自动完成容器的部署、扩容、缩容、故障恢复等操作。当某个容器或节点故障时,K8s 会自动在其他健康节点上重建容器,保证服务高可用。
2. 弹性伸缩 核心价值
支持根据CPU、内存使用率或自定义指标自动调整容器副本数量。例如电商大促期间,订单服务可以从10个Pod自动扩容至100个,大促结束后再自动缩容,优化资源利用。
3. 声明式配置
你只需要通过 YAML 文件告诉 K8s"你想要什么"(例如运行3个Nginx副本),K8s 会自动将集群的实际状态调整为你期望的状态,无需编写复杂的操作脚本。
4. 服务发现与负载均衡
K8s 提供内置的服务发现机制,通过 DNS 名称或稳定的 IP 地址暴露服务,并自动将流量均匀分发到多个容器实例,避免单容器过载。
⚠️ 重要提示
K8s 不是 Docker 的替代品,而是 Docker 的"管理者"。Docker 负责创建和运行单个容器,K8s 负责在集群层面管理成千上万个 Docker 容器。
3、K8s 与 Docker 的关系
很多人会混淆 K8s 和 Docker 的关系,实际上它们是互补关系,解决的是不同层面的问题:
| 特性 | Docker 容器化平台 | K8s 容器编排平台 |
|---|---|---|
| 核心功能 | 构建、分发、运行单个容器 | 编排、调度、管理容器集群 |
| 作用范围 | 单机(主要关注点) | 集群(多台机器) |
| 主要目标 | 实现应用的环境一致性 | 实现大规模容器化应用的自动化管理 |
| 管理对象 | 容器、单个容器实例 | Pod(一组容器)、Deployment、Service、Node等 |
| 复杂性 | 相对简单,适合单机或小规模 | 复杂,为大规模、生产级部署设计 |
| 依赖关系 | 是容器运行时环境提供者之一 | 依赖容器运行时(如 containerd、CRI-O) |
一句话总结:Docker 是"造集装箱的工人",负责把应用打包成标准化的"集装箱"(容器);K8s 是"港口调度员",负责在整个"港口"(集群)中调度和管理这些"集装箱"。
📖 拓展阅读:容器运行时的演变
早期 K8s 只能使用 Docker 作为容器运行时,但随着容器技术的发展,K8s 引入了 CRI(容器运行时接口)标准,现在可以支持多种容器运行时,如 containerd、CRI-O 等。目前 Docker 已经将其容器运行时部分拆分为 containerd,成为 K8s 最常用的容器运行时。
4、K8s 核心架构与组件
K8s 集群采用主从架构(Master-Worker),分为"控制平面(Control Plane)"和"工作节点(Worker Node)"两部分,各组件通过 K8s API 协同工作。
1. 控制平面(Master Node)集群大脑
控制平面负责集群的全局决策,如调度、资源管理、故障恢复等,通常部署1个或多个(高可用)节点,核心组件包括:
- kube-apiserver:所有操作的"统一入口",接收并处理用户和组件的请求,提供 RESTful API;同时负责认证、授权、准入控制,是唯一与 etcd 直接交互的组件
- etcd:K8s 的唯一数据源,是一个分布式键值数据库,保存了集群的所有状态信息和配置数据
- kube-scheduler:集群的"调度器",负责将新创建的 Pod 调度到最合适的工作节点上
- kube-controller-manager:集群的"控制器管理器",运行各种控制器进程,负责维护集群的期望状态,如节点控制器、副本控制器、端点控制器等
2. 工作节点(Worker Node)集群打工人
工作节点负责实际运行容器化应用,是集群的"工作负载节点",每个工作节点上都运行以下核心组件:
- kubelet:节点的"代理",负责管理本节点上的 Pod 和容器,确保 Pod 按照期望状态运行
- kube-proxy:节点的"网络代理",负责维护节点上的网络规则,实现服务发现和负载均衡功能
- 容器运行时:负责拉取镜像、创建和运行容器,如 containerd、Docker 等
5、K8s 核心资源对象
K8s 通过各种资源对象来描述集群的状态,理解这些核心资源对象是学习 K8s 的基础:
1. Pod 最小调度单位
Pod 是 K8s 中最小的调度和管理单位,一个 Pod 可以包含一个或多个紧密关联的容器。
- 同一个 Pod 里的所有容器共享同一个网络命名空间(即同一个 IP 地址)和存储卷
- 容器之间可以通过
localhost直接通信,无需额外配置网络 - Pod 的生命周期是短暂的,一旦被删除、故障或节点宕机,Pod 会直接消失,需要借助控制器管理
2. Deployment 无状态应用控制器
Deployment 是最常用的控制器,用于管理无状态应用的部署和更新。
- 可以指定应用的副本数量,确保集群中始终运行指定数量的 Pod
- 支持滚动更新和版本回滚,实现应用的无缝升级
- 自动管理 ReplicaSet(副本集),ReplicaSet 再管理 Pod
3. Service 服务访问入口
Service 用于为一组 Pod 提供稳定的访问入口和负载均衡功能。
- 由于 Pod 的 IP 地址是动态变化的,Service 提供了一个固定的 IP 地址和 DNS 名称
- 自动将流量分发到后端的多个 Pod 实例
- 支持多种服务类型:ClusterIP(集群内访问)、NodePort(节点端口访问)、LoadBalancer(云厂商负载均衡)等
4. Namespace 资源隔离
Namespace 用于将一个 K8s 集群逻辑上划分为多个虚拟集群,实现资源的隔离和管理。
- 同一 Namespace 内的资源名称必须唯一
- 可以为不同的 Namespace 设置不同的资源配额和访问权限
- 常用于区分不同的环境(开发、测试、生产)或不同的团队
6、K8s 基本工作流程
以部署一个 Nginx 应用为例,K8s 的基本工作流程如下:
基本工作流程
1、用户下发部署命令
通过本地 kubectl 工具向K8s集群发送部署指令,指定Nginx镜像、2个运行副本:
kubectl create deployment nginx-app --image=nginx:1.25 --replicas=2作用:告知K8s集群需要部署一套2副本的Nginx业务应用。
2、API Server接收请求并持久化存储
- 所有kubectl命令统一请求至K8s唯一入口 API Server;
- 校验请求合法性、权限、参数合规性;
- 将部署需求永久存入集群数据库 etcd。
注:此步骤仅记录需求,不执行任何创建、启动操作。
3、Deployment控制器生成Pod模板
- Deployment(无状态应用核心控制器)持续监听etcd中的部署需求;
- 根据用户配置,自动生成 2个Nginx Pod的资源模板;
- 将Pod模板信息提交API Server,持久化存入etcd数据库。
注:此时仅生成待执行的Pod清单,还未分配服务器节点。
4、Scheduler调度Pod至工作节点
集群调度器 Scheduler 执行自动调度逻辑:
- 实时监测集群内存在未分配节点的待运行Pod;
- 遍历所有Worker工作节点,检测各节点CPU、内存、负载、亲和性等状态;
- 智能择优,将2个Pod分别调度、绑定到空闲、合规的集群节点。
注:此步骤仅决定「Pod跑在哪台机器」,不启动任何容器。
5、Kubelet调用容器运行时启动容器
(核心步骤:完美对应 K8s 管调度、容器运行时干实事)
- 每个节点的 Kubelet 实时监听 API Server,识别归属本节点的Pod任务;
- Kubelet 不直接执行docker命令,通过 CRI标准接口 调用节点容器运行时(containerd);
- 容器运行时执行底层操作:拉取Nginx镜像、配置容器网络、初始化并启动Nginx容器,最终Pod转为运行状态。
6、K8s自动健康检查与故障自愈
Pod启动后,Kubelet 持续守护监控:
- 存活检查:定时访问Nginx服务,校验服务是否正常运行;
- 自愈机制:容器异常崩溃自动重启;节点宕机时,Scheduler自动将Pod调度到其他正常节点重建,始终保证预设副本数量。
7、创建Service暴露外网访问
Pod IP是动态临时的,无法直接对外提供访问,需通过Service统一代理:
- 执行服务暴露命令:
kubectl expose deployment nginx-app --port=80 --type=NodePort- API Server 记录Service资源,各节点
kube-proxy组件自动配置负载均衡规则; - 外部用户通过「集群任意节点IP+随机端口」,即可正常访问Nginx网页服务。
8、集群持续自动化运维
应用稳定运行后,K8s全程全自动托管运维:
- 流量波动:支持手动/自动扩缩容,增减Pod数量;
- 版本迭代:支持镜像滚动升级,业务零中断更新;
- 异常容错:7*24小时监控故障,自动修复、重建、漂移Pod。
💡 关键特点
整个流程是声明式的,用户只需要定义期望状态,K8s 会自动协调实际状态与期望状态一致。如果某个 Pod 故障,ReplicaSet Controller 会自动创建一个新的 Pod 来替代它。
7、K8s 常用命令
集群信息命令
# 查看集群信息
kubectl cluster-info
# 查看集群节点
kubectl get nodes
# 查看集群版本
kubectl version资源管理命令 实操
# 查看所有资源
kubectl get all
# 查看指定类型的资源
kubectl get pods
kubectl get deployments
kubectl get services
# 查看资源详情(排障常用)
kubectl describe pod <pod-name>
kubectl describe deployment <deployment-name>
# 创建/更新资源(推荐)
kubectl apply -f <yaml-file>
# 删除资源
kubectl delete pod <pod-name>
kubectl delete deployment <deployment-name>
kubectl delete -f <yaml-file>容器操作命令
# 查看容器日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> # 实时查看日志
# 进入容器内部
kubectl exec -it <pod-name> -- /bin/bash
# 复制文件到容器或从容器复制文件
kubectl cp <local-file> <pod-name>:<container-path>
kubectl cp <pod-name>:<container-path> <local-file>💡 命令技巧
- 大多数 K8s 命令都可以使用资源名称的前几位来代替完整的名称
- 使用
kubectl get <resource> -o wide可以查看更详细的信息 - 使用
kubectl explain <resource>可以查看资源的详细定义和字段说明 - 按 Ctrl + C 可以中断正在运行的命令
8、总结
📌 【课程总结】
K8s 是云原生时代的核心基础设施,它通过容器编排技术解决了大规模容器化应用的管理难题,实现了应用的自动化部署、弹性伸缩、故障自愈和高可用运行。
K8s 与 Docker 是互补关系,Docker 负责将应用打包成标准化的容器,K8s 负责在集群层面管理这些容器。学习 K8s 不仅能让你掌握现代应用的部署和运维技能,还能为你打开微服务、DevOps、云原生等更广阔技术领域的大门。
🚀 下一步学习建议
- 使用 Minikube 或 Kind 在本地搭建一个单节点 K8s 集群
- 尝试使用 Deployment 部署 Nginx、MySQL 等常用应用
- 学习编写 K8s YAML 配置文件,掌握 Deployment、Service、ConfigMap 等核心资源的使用
- 了解 K8s 的存储和网络机制
- 学习使用 Helm 来管理 K8s 应用包
Kubernetes 与 Docker
三、什么是容器服务Kubernetes版(阿里云产品)
阿里云官方教程介绍(容器服务 Kubernetes 版 ACK)