第01章:Docker 基础概念

发布时间:2026/7/2 20:30:47

第01章:Docker 基础概念 第01章Docker 基础概念本章目标理解容器技术的本质明白 Docker 解决了什么问题建立正确的技术认知。1.1 从一个痛点说起1.1.1 传统软件交付的噩梦想象一个典型的场景开发人员在我电脑上跑得好好的啊 运维人员但在我服务器上就是跑不起来......这不是段子而是无数团队每天都在经历的真实困境。导致这种环境不一致问题的根源在于问题描述后果操作系统差异开发用 macOS测试用 CentOS生产用 Ubuntu系统调用不兼容依赖版本冲突项目A需要 Python 3.8项目B需要 Python 3.11同一台机器无法共存配置不一致数据库连接串、环境变量各不相同排查问题耗时耗力部署过程不可重复手动安装、手动配置每次部署结果可能不同故障率高、回滚困难1.1.2 传统虚拟机能解决问题吗虚拟机VM确实提供了一种解决方案┌─────────────────────────────────────────┐ │ 物理服务器 │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 虚拟机 A │ │ 虚拟机 B │ │ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ │ │ App A │ │ │ │ App B │ │ │ │ │ ├──────────┤ │ │ ├──────────┤ │ │ │ │ │ Libs/依赖 │ │ │ │ Libs/依赖 │ │ │ │ │ ├──────────┤ │ │ ├──────────┤ │ │ │ │ │ Guest OS │ │ │ │ Guest OS │ │ │ │ │ └──────────┘ │ │ └──────────┘ │ │ │ └──────────────┘ └──────────────┘ │ │ ┌──────────────────────────────────┐ │ │ │ Hypervisor │ │ │ └──────────────────────────────────┘ │ │ ┌──────────────────────────────────┐ │ │ │ Host OS │ │ │ └──────────────────────────────────┘ │ └─────────────────────────────────────────┘但虚拟机有明显的缺点对比维度虚拟机容器启动速度分钟级需要启动完整OS秒级共享宿主机内核资源占用GB 级每个VM都有完整OSMB 级仅包含应用和依赖运行密度一台服务器跑十几个一台服务器跑数百个镜像大小通常 1GB通常 10MB~200MB隔离级别硬件级Hypervisor进程级内核隔离可移植性需要适配虚拟化平台标准化跨平台运行1.2 什么是容器Container1.2.1 容器的本质容器 被隔离的进程容器不是虚拟机它不像虚拟机那样拥有独立的操作系统内核。容器的本质是利用 Linux 内核的隔离机制将一个进程及其依赖资源文件系统、网络、进程空间等打包在一起使其看起来像在一台独立的机器上运行。┌─────────────────────────────────────────────┐ │ 物理服务器 │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 容器 A │ │ 容器 B │ │ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ │ │ App A │ │ │ │ App B │ │ │ │ │ ├──────────┤ │ │ ├──────────┤ │ │ │ │ │ Libs/依赖 │ │ │ │ Libs/依赖 │ │ │ │ │ └──────────┘ │ │ └──────────┘ │ │ │ └──────────────┘ └──────────────┘ │ │ ┌────────────────────────────────────────┐ │ │ │ 容器运行时 (Docker Engine) │ │ │ └────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────┐ │ │ │ Host OS共享内核 │ │ │ └────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────┐ │ │ │ 硬件 │ │ │ └────────────────────────────────────────┘ │ └─────────────────────────────────────────────┘1.2.2 容器技术的核心支柱容器技术建立在三大 Linux 内核特性之上① Namespace命名空间—— 资源隔离Namespace 让每个容器拥有自己独立的视界看起来就像独占了一台机器Namespace功能解决的问题PID进程 ID 隔离容器内 PID 从1开始看不到宿主机进程NET网络隔离每个容器有独立的网络栈IP、端口、路由表MNT文件系统挂载隔离每个容器有独立的文件系统视图UTS主机名隔离每个容器可以有自己的主机名USER用户隔离容器内可以有不同的用户映射IPC进程间通信隔离容器之间的信号量、消息队列等隔离② Cgroups控制组—— 资源限制Cgroups 限制每个容器可以使用的资源量防止某个容器吃光所有资源物理机16核 CPU / 32GB 内存 Cgroups 分配 ├── 容器 A最多 4核 CPU / 8GB 内存 ├── 容器 B最多 4核 CPU / 8GB 内存 └── 容器 C最多 4核 CPU / 8GB 内存 剩余资源留给宿主机和其他容器支持限制的资源类型CPU可以使用多少核、使用时间片比例内存最大使用量、OOM 阈值磁盘 I/O读写速率限制网络带宽上传下载速率限制③ UnionFS联合文件系统—— 分层存储UnionFS 是容器镜像的基石它允许将多个目录叠加在一起形成一个统一的视图最终文件系统视图可读写层 ┌────────────────────────────┐ │ Container Layer (R/W) │ ← 运行时产生的变更 ├────────────────────────────┤ │ App Layer (R/O) │ ← 应用代码和依赖 ├────────────────────────────┤ │ Dependency Layer (R/O) │ ← 运行时库 ├────────────────────────────┤ │ Base Image Layer (R/O) │ ← 基础镜像如 Ubuntu └────────────────────────────┘关键特性镜像的每一层都是只读的被多个容器共享容器运行时在最上面添加一个可写层容器删除后可写层也随之删除镜像层不受影响层与层之间通过内容哈希去重节省存储空间1.3 Docker 是什么1.3.1 Docker 的定义Docker是一个开源的应用容器引擎让开发者可以打包应用及其依赖包到一个可移植的容器中然后发布到任何流行的 Linux 或 Windows 操作系统上。简单说Docker 就是容器技术的产品化实现。它把底层复杂的 Linux 内核隔离技术封装成了简单易用的命令行工具和 API。1.3.2 Docker 的三大核心概念┌──────────────────────────────────────────────┐ │ Docker 核心概念 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 镜像 │ │ 容器 │ │ 仓库 │ │ │ │ Image │ │ Container │ │ Registry │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ 只读模板 运行实例 存储分发 │ │ (类比:类) (类比:对象) (类比:包管理) │ └──────────────────────────────────────────────┘镜像Image一个只读的模板包含了运行应用所需的一切代码、运行时、库、环境变量、配置文件类比理解如果把镜像比作一个Java 类那么它就是一份静态的定义容器Container镜像的一个运行实例拥有独立的文件系统、网络和进程空间类比理解容器就是类创建出来的对象实例可以被创建、启动、停止、删除容器是可以被修改的在可写层中仓库Registry用于存储和分发镜像的服务如 Docker Hub、Harbor类比理解就像Maven 中央仓库或npm registry是镜像的应用商店1.3.3 Docker 的发展历史时间里程碑意义2013dotCloud 开源 Docker容器技术进入大众视野2014Docker 1.0 发布生产环境可用2015OCI开放容器标准成立容器技术标准化2016Docker Swarm 内置容器编排能力2017Kubernetes 成为主流容器编排大战尘埃落定2019Docker Enterprise 被 Mirantis 收购Docker 公司转型2020Docker Desktop 成为主要产品聚焦开发者体验2023Docker Init、Docker Debug、Docker Scout开发者平台全面升级1.4 Docker vs 虚拟机深度对比1.4.1 架构对比虚拟机架构 容器架构 ┌─────────────────┐ ┌─────────────────┐ │ App A App B │ │ App A App B │ ├─────────────────┤ ├─────────────────┤ │ Bins/Libs A/B │ │ Bins/Libs A/B │ ├─────────────────┤ ├─────────────────┤ │ Guest OS A B │ │ Docker Engine │ ├─────────────────┤ ├─────────────────┤ │ Hypervisor │ │ Host OS │ ├─────────────────┤ ├─────────────────┤ │ Host OS │ │ 硬件/硬件虚拟化 │ ├─────────────────┤ └─────────────────┘ │ 硬件 │ └─────────────────┘1.4.2 全维度对比对比维度Docker 容器虚拟机VM虚拟化级别操作系统级共享内核硬件级独立内核操作系统共享宿主机内核每个 VM 独立 OS启动时间毫秒~秒级分钟级资源占用极低MB 级较高GB 级运行密度单机可运行数百个单机通常数十个镜像大小通常 10~200MB通常 1~10GB隔离性进程级隔离强隔离硬件虚拟化安全性共享内核攻击面较大独立内核隔离性更强可移植性极强标准化依赖虚拟化平台性能损耗接近原生2%5%~20% 损耗适用场景微服务、CI/CD、开发测试强隔离需求、运行不同OS1.4.3 什么时候选容器什么时候选 VM需要运行不同内核的操作系统 ├── 是 → 选虚拟机如需要运行 Windows Linux └── 否 → 需要强隔离多租户、不可信代码 ├── 是 → 选虚拟机如公有云租户隔离 └── 否 → 需要快速启动和高密度部署 ├── 是 → 选容器 ✓ └── 否 → 都可以看团队技术栈实际生产中的最佳实践虚拟机 容器混合使用┌────────────────────────────────────┐ │ 物理服务器 │ │ ┌──────────────┬──────────────┐ │ │ │ 虚拟机 A │ 虚拟机 B │ │ │ │ ┌────────┐ │ ┌────────┐ │ │ │ │ │容器 1 2│ │ │容器 3 4│ │ │ │ │ └────────┘ │ └────────┘ │ │ │ └──────────────┴──────────────┘ │ │ ┌──────────────────────────────┐ │ │ │ Hypervisor │ │ │ └──────────────────────────────┘ │ │ ┌──────────────────────────────┐ │ │ │ Host OS │ │ │ └──────────────────────────────┘ │ └────────────────────────────────────┘ 场景公有云环境 - 虚拟机提供租户间的强隔离 - 每个虚拟机内部使用容器部署微服务1.5 Docker 的核心价值1.5.1 对开发团队的价值价值说明环境一致性开发、测试、生产环境完全一致告别在我电脑上能跑快速上手新成员docker-compose up一键拉起整个开发环境多项目并行不同项目的依赖互不干扰轻松切换可复现的 Bug容器可以精确复制问题环境1.5.2 对运维团队的价值价值说明标准化部署所有应用使用相同的部署流程秒级伸缩容器的秒级启动让弹性伸缩成为可能资源利用率同一台服务器运行更多应用实例灰度发布轻松实现蓝绿部署、金丝雀发布故障恢复容器故障后秒级重启无需重新配置环境1.5.3 对企业架构的价值价值说明微服务架构落地每个微服务独立容器化部署DevOps 文化统一构建和运行环境打破开发运维壁垒云原生基础容器是 Kubernetes、Service Mesh 等云原生技术的基石多云策略容器可以在任意云平台运行避免厂商锁定1.6 动手实验你的第一个容器实验 1.1运行 Hello World# 运行 Docker 的 Hello World 示例dockerrun hello-world输出解读Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the hello-world image from Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.这段输出揭示了 Docker 的工作流程客户端docker 命令→ 2.守护进程dockerd→ 3.拉取镜像→ 4.创建容器→ 5.执行并返回结果实验 1.2运行一个 Ubuntu 容器# 启动一个 Ubuntu 容器并进入交互式终端dockerrun-itubuntu:22.04 /bin/bash进入容器后你可以# 查看容器内的系统信息cat/etc/os-release# 查看容器内的进程只有你自己的进程psaux# 查看容器内的磁盘df-h# 退出容器exit你会发现虽然你的宿主机可能运行的是 Windows但容器内却是一个完整的 Ubuntu 系统实验 1.3运行一个 Nginx Web 服务器# 后台运行 Nginxdockerrun-d-p8080:80 nginx:latest# 查看运行中的容器dockerps# 打开浏览器访问 http://localhost:8080# 你应该能看到 Nginx 的欢迎页面# 停止容器dockerstop容器ID# 清理已停止的容器dockerrm容器ID1.7 本章小结要点内容容器的本质利用 Linux 内核特性实现的轻量级进程隔离Docker 的定位容器技术的产品化实现降低了使用门槛三大核心概念镜像模板、容器实例、仓库分发三大技术支柱Namespace隔离、Cgroups限制、UnionFS分层存储核心价值环境一致性、快速部署、高效利用资源、标准化交付1.8 课后练习思考题为什么容器比虚拟机启动更快从架构角度分析原因。实操题分别用docker run启动一个 Ubuntu 和 CentOS 容器进入容器查看操作系统信息体会容器的隔离性。扩展阅读了解 Linux Namespace 和 Cgroups 的系统调用接口。 下一章Docker 架构原理 —— 深入理解 Docker 的内部工作机制

相关新闻