当前位置: 首页 > news >正文

docker 原理

一、Docker 是什么?

Docker 是一个 基于容器(Container)技术 的轻量级虚拟化方案。
它可以在同一个操作系统内核上运行多个相互隔离的应用环境。
换句话说:

Docker 让“打包、分发、运行应用”变得像运行一个进程一样简单。


⚙️ 二、Docker 的核心原理

Docker 之所以能快速启动、体积小、隔离性强,主要依赖于 Linux 内核的三大技术

1️⃣ Namespace(命名空间)——“隔离”

Namespace 用于实现 进程之间的资源隔离

Namespace 类型隔离内容
pid进程号(让容器内看到自己的 PID 从 1 开始)
net网络设备、IP、端口
mnt挂载点(文件系统)
ipc进程间通信(共享内存、信号量)
uts主机名和域名
user用户和用户组(容器内 root ≠ 宿主机 root)

👉 这就是为什么容器之间互不干扰:每个容器都在自己的“命名空间”中。


2️⃣ Cgroups(Control Groups)——“限制资源”

Cgroups 用于 限制和分配系统资源,防止某个容器“吃光”CPU、内存等资源。

例如:

docker run --memory=512m --cpus=1 nginx

👉 这条命令背后其实是 Cgroups 在起作用,控制容器只能使用 512MB 内存和 1 个 CPU 核心。


3️⃣ UnionFS(联合文件系统)——“分层存储”

UnionFS 提供了 镜像分层机制,实现了 Docker 的高效构建与复用。

  • 每个镜像由多层(layer)组成;

  • 每层只读(read-only),新改动通过“写时复制(Copy-on-Write)”保存;

  • 构建新镜像时,只新增变化层。

🔹 举例:

FROM ubuntu:20.04 RUN apt install -y python3 RUN pip install flask

最终镜像会包含:

Layer1: ubuntu:20.04 Layer2: 安装 python3 Layer3: 安装 flask

多个镜像共享相同的基础层,大幅节省磁盘空间。


🐳 三、Docker 的核心组件

组件功能
Docker Daemon(dockerd)守护进程,负责管理镜像、容器、网络等
Docker CLI(客户端)用户操作入口,命令如 docker rundocker ps
Docker Image(镜像)应用的只读模板
Docker Container(容器)镜像运行起来的实例
Docker Registry(仓库)存放镜像的地方(如 Docker Hub)

🚀 四、Docker 容器运行流程

1️⃣ 用户执行命令:

docker run nginx

2️⃣ Docker 客户端发送请求给 Docker Daemon。

3️⃣ Daemon 检查本地是否有 nginx 镜像:

  • 没有则从远程仓库(Docker Hub)拉取;

  • 有则直接使用。

4️⃣ Daemon 基于镜像创建一个 容器层(可写层)

5️⃣ 为容器分配:

  • 独立的 Namespace(隔离环境)

  • Cgroups(资源限制)

  • 网络接口(虚拟网卡)

6️⃣ 启动容器内的进程(通常是镜像的 ENTRYPOINT 命令)。

7️⃣ 用户进入容器环境,容器像一个轻量的独立系统一样运行。


🧩 五、Docker vs 虚拟机(VM)

对比项Docker 容器虚拟机(VM)
启动速度秒级分钟级
性能开销接近原生较大(虚拟化硬件)
隔离级别进程级(共享内核)系统级(独立内核)
占用空间小(MB级)大(GB级)
部署灵活性高,镜像可移植较低
安全性相对较低较高(完全隔离)

🔒 六、安全与限制

  • 容器共享宿主机内核 → 内核漏洞可导致逃逸;

  • 不建议容器内运行特权进程;

  • 可结合 seccompAppArmorSELinux 提升隔离。


📘 七、总结一句话

Docker 本质上是一个利用 Linux Namespace、Cgroups、UnionFS 等技术实现的进程级虚拟化环境。
它让应用在一个独立的、可复制的、轻量的环境中运行。

http://www.dtcms.com/a/519473.html

相关文章:

  • 龙岩网站开发较好的公司王战山
  • vllm论文中figure3每个块的区别
  • 西安营销网站建设公司厦门建设局官网
  • 机器视觉的锂电池叠片应用
  • Rhino(犀牛)转换为 3DXML 全指南:迪威模型网在线实操 + 本地方案
  • react报错Cannot find module ‘ajv/dist/compile/codegen‘
  • uv如何配置阿里云源在 pyproject.toml 中 或在 uv.toml 中
  • 【算法】排序算法汇总1
  • 学习笔记 | 图论基础
  • 苏州要服务网站建设视频网站建设多少钱
  • Flink 使用 RocksDB 作为状态后端存储的原因详解
  • 历经一载编程路,褪去青涩踏新程
  • 面试随想录4:吉贝克后端
  • 使用Python操作你的手机(Appium入门)
  • Spire.Doc 实践指南:将Word 文档转换为 XML
  • 【2B篇】阿里通义 Qwen3-VL 新增 2B、32B 两个模型尺寸,手机也能轻松运行
  • 目标检测YOLO实战应用案例100讲-基于多模态和多模型融合 的三维目标检测
  • 【成长纪实】从“Hello World”到分布式实战的进阶之路
  • 图论理论基础(1)
  • 开源 Linux 服务器与中间件(十)Mqtt协议和Emqx服务器安装测试
  • 网站建设实践鉴定手机网站建设讯息
  • 网站管理文档怎么写晚上睡不着看点害羞的东西app
  • uni-app 广告弹窗最佳实践:不扰民、可控制频次、含完整源码
  • 使用eNSP模拟器搭建网络拓扑结构(笔记2):从 0 到 1 掌握华为网络仿真
  • UniApp 多页面编译优化:编译时间从10分钟到1分钟
  • C++变量与函数命名规范技术指南 (基于华为编码规范与现代C++最佳实践)
  • ELK1——elasticsearch
  • 【图像卷积基础】卷积过程卷积实现通道扩充与压缩池化Pooling原理和可视化
  • 杭州公司网站设计外贸手工做兼职的网站
  • 深入浅出Langchain4j——构建Java大语言模型应用的新范式