Skip to content

云容器服务 (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 基本工作流程

  1. 开发阶段:开发人员编写代码和 Dockerfile,使用 docker build 命令构建镜像
  2. 测试阶段:将镜像推送到仓库,测试人员从仓库拉取镜像,使用 docker run 命令启动容器进行测试
  3. 生产阶段:测试通过后,直接将同一个镜像部署到生产环境,确保环境完全一致

6、Docker 常用命令

镜像相关命令 实操

bash
# 查看本地所有镜像
docker images

# 从仓库拉取镜像
docker pull 镜像名:标签

# 构建镜像
docker build -t 镜像名:标签 .

# 删除本地镜像
docker rmi 镜像ID/名称

容器相关命令 实操

bash
# 运行容器
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 等更广阔的技术领域的大门。

🚀 下一步学习建议
  1. 安装 Docker Desktop 并完成基础配置

  2. 尝试拉取并运行 Nginx、MySQL 等常用镜像

  3. 学习编写 Dockerfile 来构建自己的镜像

  4. 了解 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个运行副本:

bash
kubectl create deployment nginx-app --image=nginx:1.25 --replicas=2

作用:告知K8s集群需要部署一套2副本的Nginx业务应用。

2、API Server接收请求并持久化存储

  1. 所有kubectl命令统一请求至K8s唯一入口 API Server
  2. 校验请求合法性、权限、参数合规性;
  3. 将部署需求永久存入集群数据库 etcd

注:此步骤仅记录需求,不执行任何创建、启动操作

3、Deployment控制器生成Pod模板

  1. Deployment(无状态应用核心控制器)持续监听etcd中的部署需求;
  2. 根据用户配置,自动生成 2个Nginx Pod的资源模板
  3. 将Pod模板信息提交API Server,持久化存入etcd数据库。

注:此时仅生成待执行的Pod清单,还未分配服务器节点

4、Scheduler调度Pod至工作节点

集群调度器 Scheduler 执行自动调度逻辑:

  1. 实时监测集群内存在未分配节点的待运行Pod;
  2. 遍历所有Worker工作节点,检测各节点CPU、内存、负载、亲和性等状态;
  3. 智能择优,将2个Pod分别调度、绑定到空闲、合规的集群节点。

注:此步骤仅决定「Pod跑在哪台机器」,不启动任何容器

5、Kubelet调用容器运行时启动容器

(核心步骤:完美对应 K8s 管调度、容器运行时干实事)

  1. 每个节点的 Kubelet 实时监听 API Server,识别归属本节点的Pod任务;
  2. Kubelet 不直接执行docker命令,通过 CRI标准接口 调用节点容器运行时(containerd);
  3. 容器运行时执行底层操作:拉取Nginx镜像、配置容器网络、初始化并启动Nginx容器,最终Pod转为运行状态。

6、K8s自动健康检查与故障自愈

Pod启动后,Kubelet 持续守护监控:

  1. 存活检查:定时访问Nginx服务,校验服务是否正常运行;
  2. 自愈机制:容器异常崩溃自动重启;节点宕机时,Scheduler自动将Pod调度到其他正常节点重建,始终保证预设副本数量。

7、创建Service暴露外网访问

Pod IP是动态临时的,无法直接对外提供访问,需通过Service统一代理:

  1. 执行服务暴露命令:
bash
kubectl expose deployment nginx-app --port=80 --type=NodePort
  1. API Server 记录Service资源,各节点 kube-proxy 组件自动配置负载均衡规则;
  2. 外部用户通过「集群任意节点IP+随机端口」,即可正常访问Nginx网页服务。

8、集群持续自动化运维

应用稳定运行后,K8s全程全自动托管运维:

  • 流量波动:支持手动/自动扩缩容,增减Pod数量;
  • 版本迭代:支持镜像滚动升级,业务零中断更新;
  • 异常容错:7*24小时监控故障,自动修复、重建、漂移Pod。

💡 关键特点

整个流程是声明式的,用户只需要定义期望状态,K8s 会自动协调实际状态与期望状态一致。如果某个 Pod 故障,ReplicaSet Controller 会自动创建一个新的 Pod 来替代它。


7、K8s 常用命令

集群信息命令

bash
# 查看集群信息
kubectl cluster-info

# 查看集群节点
kubectl get nodes

# 查看集群版本
kubectl version

资源管理命令 实操

bash
# 查看所有资源
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>

容器操作命令

bash
# 查看容器日志
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、云原生等更广阔技术领域的大门。

🚀 下一步学习建议
  1. 使用 Minikube 或 Kind 在本地搭建一个单节点 K8s 集群
  2. 尝试使用 Deployment 部署 Nginx、MySQL 等常用应用
  3. 学习编写 K8s YAML 配置文件,掌握 Deployment、Service、ConfigMap 等核心资源的使用
  4. 了解 K8s 的存储和网络机制
  5. 学习使用 Helm 来管理 K8s 应用包

Kubernetes 与 Docker

解释 Kubernetes 与 Docker

三、什么是容器服务Kubernetes版(阿里云产品)

阿里云官方教程介绍(容器服务 Kubernetes 版 ACK)

容器服务 Kubernetes 版 ACK