社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

同事一个比喻,让我搞懂了Docker和k8s的核心概念

芋道源码 • 3 月前 • 245 次点击  

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 

来源:juejin.cn/post/7592069432228102153


前几天让同事帮忙部署服务,顺嘴问了句"Docker 和 K8s 到底是啥"。

其实这俩概念我以前看过,知道是"打包完整环境、到处运行",但一直停留在似懂非懂的状态。镜像、容器、Pod、集群、节点……这些词都见过,就是串不起来。

同事给我讲了一个非常直观的比喻,一下就通了:

镜像:一个打包好的系统快照

Docker 镜像可以理解成一个系统快照,里面包含了:

  • 操作系统(比如 Debian、Alpine)
  • 运行时环境(比如 Python 3.11、Node 20)
  • 所有依赖包
  • 你的代码
  • 配置文件

这个快照是静态的、只读的 ,就像一张光盘——刻好了就不会变。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

容器:运行起来的快照

容器就是把镜像跑起来。

镜像(静态快照) --docker run--> 容器(运行中的进程)

容器是动态的、可写的 ,可以往里面写文件、改配置。但一旦容器销毁,这些改动就没了(除非你挂载了外部存储)。

一个镜像可以同时跑多个容器,就像一张光盘可以装到多台电脑上。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

Dockerfile 和 docker-compose

搞清楚镜像和容器的关系后,这两个东西就好理解了:

  • Dockerfile :定义如何构建镜像的配方
  • docker-compose :定义如何运行一组容器

举个例子,你写了个 Python 服务:

# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python""main.py"]

这个 Dockerfile 就是一份配方,告诉 Docker:

  1. 基于 Python 3.11 的官方镜像
  2. 把依赖装好
  3. 把代码复制进去
  4. 启动时运行 python main.py

执行 docker build 就会按这个配方生成一个镜像。

为什么说"到处运行"

Docker 的核心价值就是解决"我这能跑,你那跑不了"的问题。

以前部署服务,你得操心:服务器是什么系统?装的什么版本的 Python?依赖库版本对不对?环境变量配了没?

现在有了 Docker,这些都打包进镜像了。不管你的服务器是 Ubuntu、CentOS 还是 Debian,只要装了 Docker,同一个镜像都能跑出一样的结果。

Pod:K8s 调度的最小单元

到了 Kubernetes 这一层,又多了一个概念:Pod 。

Pod 是 K8s 定义的概念,是集群调度的最小单元。一个 Pod 里面可以有一个或多个容器。

你可能会问:为什么不直接调度容器,还要多一层 Pod?

因为有些场景下,几个容器需要紧密配合。比如一个主服务容器 + 一个日志收集容器,它们需要:

  • 共享网络(用 localhost 通信)
  • 共享存储(访问同一个目录)
  • 一起启动、一起销毁

把它们放在一个 Pod 里,K8s 就会把它们调度到同一台机器上,共享资源。

不过大多数情况下,一个 Pod 就放一个容器。微服务架构下,每个服务就是一个 Pod:



K8s 干的事情

K8s 负责管理这些 Pod:

  • 调度 :决定 Pod 跑在哪个节点上
  • 扩缩容 :流量大了自动多启几个 Pod,流量小了缩回去
  • 自愈 :Pod 挂了自动重启
  • 网络 :打通各个 Pod 之间的通信
  • 存储 :管理持久化存储

说白了,Docker 解决的是"打包和运行"的问题,K8s 解决的是"大规模部署和管理"的问题。

一台机器跑几个容器,手动管理就行。但当你有几十台机器、几百个容器的时候,就需要 K8s 这样的编排工具来帮你自动化处理。

Dockerfile → Image → Container → Pod → Node → Cluster
   配方       快照     运行态     调度单元   机器    集群

概念不难,难的是实际操作中的各种坑。但只要这个基础模型搞清楚了,遇到问题知道往哪个层面去排查就行。



欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/194376