K8s 和 Docker 到底是啥?它们之间是什么关系?

前言#

如果你在云计算、DevOps 或后端开发的世界里混过,一定听过 “Docker” 和 “Kubernetes”(简称 K8s)这两个词。很多人认为它们是同一回事,或者搞不清楚它们之间的关系。实际上,它们是两个不同的工具,但关系紧密。本文将从零开始,帮你理清这两个概念。

Docker 是什么?#

核心概念#

Docker 是一个容器化平台。它允许你将应用程序及其所有依赖(代码、运行时、库、配置文件等)打包成一个标准化的单元,称为 容器

想象一下:

  • 传统方式:你需要在服务器上安装 Python 3.9、Node.js 14、MySQL 5.7 等各种依赖,然后才能运行应用。不同的开发者电脑可能配置不同,导致”在我电脑上能跑”的尴尬局面。
  • Docker 方式:你把应用和所有依赖打包成一个镜像,无论在开发者的 Mac、Linux 服务器还是云平台上,都能以完全相同的方式运行。

Docker 的两个核心概念#

  1. 镜像(Image)

    • 一个只读的模板,包含应用程序和所有依赖
    • 类比:电脑的系统安装盘或快照
    • 通过 Dockerfile 定义如何构建镜像
  2. 容器(Container)

    • 镜像的运行实例
    • 类比:从快照启动的一台虚拟机
    • 轻量级、隔离、快速启动

Docker 的价值#

1
2
3
4
5
6
# 一个简单的 Dockerfile 示例
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

用一个 Dockerfile 定义环境,任何有 Docker 的地方都能运行这个应用。这解决了开发环境和生产环境不一致的问题。

Kubernetes 是什么?#

核心概念#

Kubernetes 是一个容器编排平台。它的工作是管理和运行大量的容器。

想象一下:

  • 你有 100 个 Docker 容器需要在 10 台机器上运行
  • 其中某个容器崩溃了,需要自动重启
  • 需要根据流量自动增加或减少容器数量
  • 需要在容器间进行网络通信和负载均衡
  • 需要管理存储、配置、秘密数据等

如果手动处理这些事情,会疯掉。Kubernetes 就是为了解决这个问题而诞生的。

Kubernetes 的核心特性#

  1. 自动化部署和扩展

    • 自动决定容器在哪台机器上运行
    • 根据 CPU/内存使用率自动扩容/缩容
  2. 自我修复(Self-healing)

    • 容器挂掉了自动重启
    • 定期健康检查
  3. 负载均衡和服务发现

    • 自动负载均衡流量
    • 容器间可以互相发现和通信
  4. 资源管理

    • 限制每个容器的 CPU 和内存
    • 高效利用集群资源
  5. 滚动更新

    • 可以无停机更新应用
    • 版本回滚

Docker 和 Kubernetes 的关系#

一句话总结#

Docker 是打包应用的工具,Kubernetes 是运行和管理这些打包好的应用的平台。

更详细的解释#

1
2
开发流程:
代码 → Docker → 镜像 → 容器 → Kubernetes 管理这些容器

1. 包含关系,不是替代关系#

  • Docker 负责 “怎样打包”
  • Kubernetes 负责 “怎样运行和管理”
  • 没有 Docker,你仍然可以使用其他容器(如 Podman、containerd)
  • 没有 Kubernetes,你仍然可以手动运行 Docker 容器(但会很痛苦)

2. 具体例子#

假设你有一个 Web 应用:

第一步:用 Docker 打包

1
2
3
4
5
6
7
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

构建镜像:docker build -t myapp:1.0 .

第二步:用 Kubernetes 管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3 # 运行 3 个容器实例
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0 # 使用 Docker 镜像
ports:
- containerPort: 3000
resources:
limits:
memory: "256Mi"
cpu: "250m"

Kubernetes 会:

  • 根据这个配置创建 3 个容器
  • 在集群的不同节点上分布它们
  • 如果其中一个容器崩溃,自动重启
  • 如果需要更新,逐个替换容器(滚动更新)

Docker 和 Kubernetes 的对比#

方面 Docker Kubernetes
主要功能 容器化 容器编排
作用范围 单个应用或主机 整个集群
部署规模 适合小规模(几个容器) 适合大规模(数百上千容器)
自动化程度 手动操作 高度自动化
学习曲线 较平缓 较陡峭
依赖关系 独立工具 通常依赖 Docker(或其他容器)

什么时候用 Docker?什么时候用 Kubernetes?#

用 Docker 的场景#

  • 本地开发测试
  • 简单应用部署(1-2 台服务器)
  • CI/CD 流程中的打包步骤
  • 学习容器化基础

用 Kubernetes 的场景#

  • 生产环境微服务架构
  • 需要自动扩缩容
  • 需要高可用性
  • 多个服务需要协调
  • 团队规模较大

常见误解#

误解 1:Docker 和 Kubernetes 必须一起用#

真相:Kubernetes 可以使用其他容器运行时(如 containerd、CRI-O)。Docker 也可以独立使用。但在实际中,它们的组合非常流行。

误解 2:学会了 Docker 就能用 Kubernetes#

真相:Docker 是基础,但 Kubernetes 是一个全新的概念。需要学习 Pod、Service、Deployment、ConfigMap 等 K8s 特有的概念。

误解 3:Kubernetes 可以完全替代 Docker#

真相:不能。Kubernetes 需要容器技术作为基础。它只是在容器之上添加了编排层。

快速开始体验#

本地尝试 Docker#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个简单应用
echo 'print("Hello from Docker!")' > app.py

# 创建 Dockerfile
cat > Dockerfile << EOF
FROM python:3.9
COPY app.py /app/
WORKDIR /app
CMD ["python", "app.py"]
EOF

# 构建和运行
docker build -t hello-app .
docker run hello-app

本地尝试 Kubernetes#

1
2
3
4
5
# 安装 minikube 或 Docker Desktop with Kubernetes
# 然后创建上面提到的 deployment.yaml 文件
kubectl apply -f deployment.yaml
kubectl get pods
kubectl logs <pod-name>

总结#

  • Docker 解决的是 “怎样打包应用” 的问题
  • Kubernetes 解决的是 “怎样运行和管理大量容器” 的问题
  • 它们是互补的关系,而不是竞争或替代关系
  • 了解 Docker 是学习 Kubernetes 的前提
  • 在生产环境,它们通常是”黄金搭档”

希望通过这篇文章,你能更清楚地理解这两个工具的关系。如果你有具体的应用场景需要帮助,欢迎继续提问!

推荐学习路径#

  1. 第一步:深入学习 Docker 的基础概念和常用命令
  2. 第二步:用 Docker 打包自己的应用
  3. 第三步:在本地用 Minikube 体验 Kubernetes
  4. 第四步:学习 Kubernetes 的核心资源对象(Pod、Service、Deployment)
  5. 第五步:在真实集群中实践

祝学习愉快!🚀

K8s 和 Docker 到底是啥?它们之间是什么关系?

https://homer.sisubeny.space/posts/24366218.html

Author

Homer

Posted on

2026-03-01

Updated on

2026-04-07

Licensed under