Docker底层工作原理

Docker底层工作原理:集装箱的魔法揭秘

🏗️ 用一个真实案例理解Docker

想象一下你要开一家连锁奶茶店:

传统方式(虚拟机):

  • 每家店都租一整个商铺(服务器)
  • 每家店都配全套设备:收银机、制冰机、封口机(操作系统+各种软件)
  • 资源浪费严重,开店成本高

Docker方式(容器化):

  • 在大型商场里租几个工位(服务器上的容器)
  • 所有店铺共享商场的电力、水源、空调(共享操作系统内核)
  • 每个工位有标准化的奶茶制作设备(应用+依赖)
  • 快速复制,成本极低

📦 Docker的三大核心技术

1. Namespace:给每个容器独立的"房间"

graph TB A[宿主机 Host] --> B[容器A] A --> C[容器B] A --> D[容器C] B --> B1[进程ID: 1] B --> B2[IP: 172.17.0.2] B --> B3[文件系统: /] C --> C1[进程ID: 1] C --> C2[IP: 172.17.0.3] C --> C3[文件系统: /] D --> D1[进程ID: 1] D --> D2[IP: 172.17.0.4] D --> D3[文件系统: /] E[宿主机真实情况<br>进程ID: 1001,1002,1003<br>IP: 192.168.1.100] -.-> B E -.-> C E -.-> D

就像酒店的客房:

  • 每个客人觉得自己住的是"独立套房"
  • 有独立的卫生间、卧室、客厅(独立的进程树、网络、文件系统)
  • 实际上共享整栋楼的地基、主体结构(共享内核)

2. Cgroups:精确的资源分配系统

宿主机资源池 CPU: 2核 内存: 4GB 磁盘IO: 100MB/s 容器A: 1核 容器B: 0.5核 容器C: 0.5核 容器A: 2GB 容器B: 1GB 容器C: 1GB 容器A: 40MB/s 容器B: 30MB/s 容器C: 30MB/s

就像自助餐厅的食物分配:

  • 每个客人有固定的餐券(资源限制)
  • 不能无限制地取用食物(防止资源耗尽)
  • 保证所有客人都能吃到(公平调度)

3. UnionFS:分层的文件系统魔法

最终文件系统视图 可写层
容器层 镜像层3: 应用代码 镜像层2: Nginx 镜像层1: Ubuntu基础 修改文件时 写时复制
Copy-on-Write 从只读层复制文件
到可写层修改 删除文件时 在白名单层
标记删除

就像做三明治:

  • 第一层:面包(基础镜像)
  • 第二层:生菜(运行环境)
  • 第三层:鸡肉(应用代码)
  • 最上层:酱料(个人配置)

每个人都可以在标准三明治上加自己的酱料,但不会影响下面的标准层。

🔄 Docker完整工作流程

从代码到运行的完整旅程

开发者 Docker Client Docker Host Registry docker build -t myapp . 1. 构建镜像 读取Dockerfile 下载基础镜像层 执行指令创建新层 生成最终镜像 docker push myapp 2. 推送镜像 上传镜像层 存储镜像 docker run myapp 3. 运行容器 创建容器请求 创建Namespace隔离环境 设置Cgroups资源限制 挂载UnionFS文件系统 启动应用进程 返回容器ID 开发者 Docker Client Docker Host Registry

详细步骤解析:

步骤1:构建镜像(打包应用)

dockerfile 复制代码
# Dockerfile 就像食谱
FROM ubuntu:20.04          # 基础食材
RUN apt-get update         # 准备步骤
COPY . /app               # 加入主料
CMD ["python", "app.py"]  # 烹饪方法

步骤2:运行容器(开餐)

bash 复制代码
# 就像按下微波炉启动按钮
docker run -p 80:80 myapp

🎯 核心概念对比表

概念 比喻 实际作用
镜像 Image 菜谱/蓝图 只读模板,包含运行应用所需的一切
容器 Container 做好的菜/建好的房 镜像的运行实例,可读写
Dockerfile 烹饪步骤 构建镜像的指令文件
仓库 Registry 菜谱图书馆 存储和分享镜像的地方
Volume 外卖保温袋 持久化存储数据

💡 实际生活案例:外卖平台

场景:美团外卖系统
美团服务器集群 用户服务容器 订单服务容器 支付服务容器 配送服务容器 Namespace隔离 Cgroups限制 独立文件系统 Namespace隔离 Cgroups限制 独立文件系统 双十一大促 自动扩容 新增10个订单服务容器 新增5个支付服务容器

为什么用Docker?

  • 快速部署:新功能上线像发外卖订单一样快
  • 资源隔离:支付服务挂了不影响用户登录
  • 弹性伸缩:高峰期自动增加容器数量
  • 环境一致:开发、测试、生产环境完全一致

🚀 总结:Docker就像标准化集装箱

传统软件部署:

  • 每次搬家都要重新买家具、布置水电
  • 不同房子配置不同,经常出问题

Docker容器化:

  • 把整个家装进标准化集装箱
  • 搬到任何地方(服务器)都能立即入住
  • 水电网络自动接通,家具摆放一致

通过Namespace、Cgroups、UnionFS这三项核心技术,Docker实现了:

  • 🏠 独立空间:每个应用有自己的"房间"
  • ⚖️ 资源管控:公平分配CPU、内存等资源
  • 🧩 分层管理:像搭积木一样组合应用
  • 🚀 快速迁移:一次构建,随处运行
相关推荐
艾伦_耶格宇25 分钟前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes
余额瞒着我当琳1 小时前
Linux初识:Linux的历史,计算机的发展脉络,发行版本,选购云服务器,安装Xshell,第一次连接,基础命令指南
linux·运维·服务器
时间售卖铺1 小时前
Docker实战:一键部署轻量级容器
运维·docker·云原生
山乐191311 小时前
麒麟系统,安装Nginx并配置https证书
运维·nginx·https
月落汀兰2 小时前
拒绝配置写死镜像!K8s 存储卷与配置管理,PV/PVC、ConfigMap、Secret 实战避坑指南
运维·kubernetes
服务器硬件项目经理2 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
杨云龙UP3 小时前
MySQL 主从复制管理:暂停、恢复、清理主从关系及命令执行位置
运维·数据库·mysql·主从配置·主从命令·reset replica·清除复制
艾伦_耶格宇3 小时前
【kubernetes - 1.28版本】-10 K8S命名空间
云原生·容器·kubernetes
Android系统攻城狮3 小时前
Linux FFmpeg深度解析之avcodec_parameters_from_context调用流程与实战(十六)
linux·运维·ffmpeg·音视频进阶·ffmpeg音视频·车载音视频进阶
隔窗听雨眠3 小时前
从存储引擎到执行计划:OceanBase高效运维的调优逻辑与工程实践
运维·oceanbase