Docker 与 Kubernetes:从“集装箱”到“远洋舰队”

Docker 与 Kubernetes:从"集装箱"到"远洋舰队"

  • [Docker 与 Kubernetes:从"集装箱"到"远洋舰队"](#Docker 与 Kubernetes:从“集装箱”到“远洋舰队”)
    • [1. Docker 是什么?------把应用装进"集装箱"](#1. Docker 是什么?——把应用装进“集装箱”)
      • [1.1 Docker 解决了什么问题?](#1.1 Docker 解决了什么问题?)
      • [1.2 核心概念(小白版)](#1.2 核心概念(小白版))
      • [1.3 Docker 的常用命令(看一眼就行)](#1.3 Docker 的常用命令(看一眼就行))
    • [2. Docker 火了之后,新的问题来了](#2. Docker 火了之后,新的问题来了)
    • [3. Kubernetes 是什么?------容器的"总司令"](#3. Kubernetes 是什么?——容器的“总司令”)
      • [3.1 Kubernetes 能做什么?](#3.1 Kubernetes 能做什么?)
      • [3.2 核心概念(小白版)](#3.2 核心概念(小白版))
    • [4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队](#4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队)
    • [5. 它们是不是非此即彼?](#5. 它们是不是非此即彼?)
    • [6. 小白常见疑问](#6. 小白常见疑问)
      • [Q1:我能不能不学 Docker 直接学 K8s?](#Q1:我能不能不学 Docker 直接学 K8s?)
      • [Q2:Docker 和虚拟机有什么区别?](#Q2:Docker 和虚拟机有什么区别?)
      • [Q3:K8s 只能管理 Docker 吗?](#Q3:K8s 只能管理 Docker 吗?)
      • Q4:学习顺序是什么?
    • [7. 总结](#7. 总结)

Docker 与 Kubernetes:从"集装箱"到"远洋舰队"

你有没有遇到过这种情况:

在电脑上跑得好好的程序,换到服务器上就报错;

开发说"我这边没问题啊",运维说"环境不一样啊"。

Docker 就是来解决这个问题的。而 Kubernetes 是 Docker 流行之后,用来管理成千上万个 Docker 容器的"总指挥官"。


1. Docker 是什么?------把应用装进"集装箱"

想象一下,你是一家工厂的老板,要出口一批玩具。

  • 传统做法:把玩具直接堆在船上。但每个国家的港口要求不同:有的要贴标签,有的要防潮,有的要单独清关。到了港口,还要重新打包、搬运------非常折腾。

  • 集装箱的做法:把玩具提前装进标准化的集装箱里。箱子里自带标签、防潮、固定措施。无论运到哪个国家,只要把整个箱子吊到船上就行,不用重新打包。

Docker 就是软件世界的"集装箱"。

1.1 Docker 解决了什么问题?

传统痛点 Docker 的解法
"在我电脑上能跑啊" 把环境和代码一起打包,保证到处运行一致。
安装配置依赖很麻烦(Java、Python、数据库驱动) 镜像里什么都装好了,一条命令就启动。
新服务器部署要配半天 拉取镜像,启动容器,几秒钟搞定。
多个应用在同一台服务器上冲突(比如一个要 Python2,一个要 Python3) 每个容器隔离,互不影响。

1.2 核心概念(小白版)

  • 镜像(Image) :一个只读的"模板",就像集装箱的设计图纸。里面装好了操作系统、代码、运行环境。

    (类比:一个已经装好所有东西的"种子文件")

  • 容器(Container) :镜像的一个运行实例。你可以启动、停止、删除它。

    (类比:根据图纸造出来的一个实体集装箱)

  • 仓库(Repository) :存放镜像的地方。Docker Hub 就是官方仓库,你可以从上面拉取别人做好的镜像(比如 nginx、mysql、python)。

    (类比:集装箱码头,放着成千上万种集装箱)

1.3 Docker 的常用命令(看一眼就行)

bash 复制代码
# 拉取镜像
docker pull nginx

# 运行容器
docker run -d -p 80:80 nginx

# 查看运行中的容器
docker ps

# 停止容器
docker stop <容器ID>

# 删除容器
docker rm <容器ID>

你不需要记住这些命令,只需要知道:Docker 把环境和代码打包成一个镜像,然后在任何有 Docker 的地方,一条命令就能跑起来。


2. Docker 火了之后,新的问题来了

假设你的业务成功了,用户量暴涨。一个 Docker 容器不够了,你需要启动 100 个 甚至 1000 个 容器。

这时候问题就来了:

  • 这 1000 个容器应该放在哪些服务器上?
  • 某个容器挂了,谁来重启它?
  • 用户请求来了,怎么平均分给这 1000 个容器?
  • 发布新版本,怎么做到不停机更新(一个一个替换)?
  • 容器越来越多,怎么让它们互相发现、通信?

这些问题的答案:Kubernetes(简称 K8s)。


3. Kubernetes 是什么?------容器的"总司令"

Kubernetes 是一个开源的容器编排平台,它可以自动化地管理成百上千个 Docker 容器。

名字由来:Kubernetes 是希腊语"舵手"的意思,缩写 K8s(K 和 s 之间有 8 个字母)。

3.1 Kubernetes 能做什么?

能力 说明
自动部署 你告诉它"我要跑 10 个 nginx",它负责去找空闲机器创建。
弹性伸缩 流量大了,一键增加容器数量;流量小了,自动缩容。
自动恢复 某个容器挂了,K8s 自动重启一个新的。
负载均衡 流量自动分散到所有容器上。
滚动更新 更新版本时,一次只替换一个容器,全程不中断服务。
服务发现 容器之间不用记 IP,直接通过服务名互相访问。

3.2 核心概念(小白版)

  • Pod :K8s 里最小的部署单元。一个 Pod 里通常只有一个容器(也可以有多个)。

    (类比:一个 Pod 就是一个"工人")

  • Deployment :管理 Pod 的"经理",负责保证始终有指定数量的 Pod 在运行,支持滚动更新、回滚。

    (类比:班组长,盯着工人不要少)

  • Service :给一组 Pod 提供一个固定的访问入口,无论 Pod 怎么重启、IP 怎么变,Service 的地址不变。

    (类比:餐厅的固定电话,谁接听不重要,打这个电话总能找到人)

  • Ingress :七层路由网关,把外部流量(比如 https://api.example.com)导到不同的 Service。

    (类比:公司总机,你拨分机号能找到不同部门)

  • Node:K8s 集群里的一台服务器(物理机或虚拟机)。

  • Namespace:虚拟隔离空间,可以把不同环境(开发、测试、生产)隔开。


4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队

维度 Docker Kubernetes
角色 集装箱 远洋舰队司令
职责 打包、运行单个容器 调度、管理成千上万个容器
处理能力 单机 跨成百上千台机器
自动恢复 不支持(容器挂了就挂了) 支持(自动重启)
弹性伸缩 手动 自动
服务发现 需要额外组件 内置
滚动更新 不支持 支持

一句话总结 :

Docker 负责"把应用装进集装箱,并在一台机器上跑起来"。

Kubernetes 负责"管理一个港口里成千上万个集装箱的调度、装卸、维护"。


5. 它们是不是非此即彼?

不是。它们是互补的、配合使用的。

  • 你可以只用 Docker:如果你只有一两台服务器,跑几个容器,手动管理就够了。
  • 你也可以用 Kubernetes 管理 Docker 容器:K8s 默认使用 Docker 作为容器运行时(也支持 containerd、CRI-O 等)。

在实际生产环境中,典型的使用方式是:

  1. 开发人员用 Docker 打包应用(制作镜像)。
  2. 镜像上传到仓库(如 Docker Hub)。
  3. 运维人员编写 Kubernetes 的 YAML 文件,描述需要多少个 Pod、用什么镜像、暴露什么端口。
  4. K8s 自动拉取镜像,并在集群中启动容器,并持续维护状态。

类比 :

Docker = 集装箱制造公司;

K8s = 全球航运物流系统(调度每一艘船、每一个港口、每一个集装箱)。


6. 小白常见疑问

Q1:我能不能不学 Docker 直接学 K8s?

答:不建议。K8s 管理的就是容器,你得先理解容器是什么、镜像是什么,否则 K8s 的概念(Pod、Deployment)会很抽象。

Q2:Docker 和虚拟机有什么区别?

虚拟机虚拟的是整个操作系统(包括内核),需要 GB 级内存;

Docker 共享宿主机的内核,只隔离进程,启动快(毫秒级),占用 MB 级内存。

Q3:K8s 只能管理 Docker 吗?

不是。K8s 通过 CRI(容器运行时接口)可以对接多种运行时,比如 containerd、CRI-O。Docker 只是其中一种。

Q4:学习顺序是什么?

  1. 先学 Docker:安装、拉取镜像、跑容器、制作自己的镜像(写 Dockerfile)。
  2. 再学 K8s:用 Minikube 或 Docker Desktop 自带的 K8s 跑一个 Deployment + Service。
  3. 深入:Ingress、ConfigMap、持久化存储、Helm。

7. 总结

  • Docker :把应用及其环境打包成容器,实现"一次构建,到处运行"。解决环境不一致、部署繁琐的问题。
  • Kubernetes :当容器数量成百上千时,自动编排它们,解决调度、伸缩、恢复、服务发现等问题。
  • 关系:Docker 是"集装箱",K8s 是"远洋舰队"。它们不是对手,而是黄金搭档。

最后送你一句话:

Docker 让你把应用装进盒子,K8s 让你在几百台服务器上轻松倒腾这些盒子。

从一台电脑到万台集群,K8s 就是那把打开云原生大门的钥匙。

希望这篇博客能帮你理清这两个 buzzword 的关系。如果你想了解如何写第一个 Dockerfile,或者在本地跑一个 K8s 示例,欢迎留言告诉我~

相关推荐
天衍四九-1 小时前
Docker容器实战系列(八):Docker生产最佳实践与避坑指南,系列终章
运维·docker·容器
Zhou1411363 小时前
Docker_03_DockerCompose多容器编排
运维·docker·容器
程序猿阿越3 小时前
containerd如何拉取镜像
后端·kubernetes·源码阅读
Elastic 中国社区官方博客3 小时前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
啊哈一半醒4 小时前
Docker 底层知识:从 Namespace 到 UnionFS
运维·docker·容器
fruge7 小时前
飞牛OS部署Flare导航页:Docker Compose、YAML书签配置与cpolar公网访问
运维·docker·容器
Zhou1411367 小时前
Docker_02_Dockerfile与存储网络
网络·docker·容器
bllovepigpig8 小时前
操作系统个人学习笔记(四):K8s基础
笔记·学习·kubernetes
键盘鼓手苏苏10 小时前
ESLint 规则渐进式升级:从 0 警告到全面开启的迁移策略(续篇)
云原生·kubernetes·k8
guo_wen_qiang10 小时前
云服务器elasticsearch环境搭建-单台
运维·elasticsearch·容器