Skip to content

Docker

这里主要整理 Docker 这条线。比起只记命令,我更想把它为什么会出现、解决了什么问题讲清楚:

  1. Docker 到底是什么
  2. 它和虚拟机有什么本质区别
  3. 为什么镜像和容器是两回事
  4. Dockerfile 在构建链路里扮演什么角色
  5. 为什么会有网络、数据卷、镜像仓库这些概念
  6. 项目里真正要关注的工程问题是什么

Docker 直接看成一套把应用和运行依赖一起打包,再用容器方式隔离运行的技术和工具体系。

这里的 容器 不太适合简单理解成“小型虚拟机”,更贴近的说法是:它是在操作系统层面做隔离的一种运行单元。

它解决的问题不是“发明一个新的操作系统”,而是让应用能以更一致、更轻量、更方便交付的方式运行。


1. 为什么 Docker 会出现

在没有容器化之前,团队经常会遇到这些问题:

  1. 开发环境能跑,测试环境跑不起来
  2. 依赖版本在不同机器上不一致
  3. 应用迁移到新机器时要重复安装环境
  4. 部署脚本越来越复杂
  5. 一个机器上跑多个应用时,环境容易互相污染

Docker 的价值,就在于把这些问题集中收拾掉。简单说,它把“应用怎么运行”这件事从具体机器环境里抽出来,变成一份更容易复制和交付的运行单元。


2. Docker 最核心的几个概念

2.1 镜像

镜像 可以理解成 一个只读的应用打包模板,里面包含运行应用所需的文件、依赖、配置基础和启动方式

它解决的是 应用如何被标准化打包

2.2 容器

容器 可以理解成 镜像启动之后的运行实例

它不等于镜像本身。

更贴近的理解是:

  1. 镜像是静态模板
  2. 容器是动态运行实例
  3. 一个镜像可以启动多个容器

2.3 仓库

仓库 指的是:存放和分发镜像的地方。

它解决的是 团队如何共享、拉取和发布镜像

2.4 Dockerfile

Dockerfile 可以理解成 一份描述镜像该如何构建出来的脚本文件

它让镜像构建过程从“手工打包”变成“可重复执行的构建流程”。

2.5 数据卷

数据卷 可以理解成 独立于容器生命周期之外的数据存储位置

它解决的是 容器删掉或重建之后,哪些数据还需要保留


3. Docker 和虚拟机到底有什么区别

这是理解容器技术最关键的一步。

对比项Docker 容器虚拟机
隔离层次操作系统层隔离硬件层虚拟化
是否共享宿主机内核通常共享不共享
启动速度更快通常更慢
资源开销更低更高
隔离强度足够强,但不是完整独立 OS更接近完整机器隔离

所以容器的核心优势,不只是“更轻”,而是更适合标准化交付应用。

但也要记住:轻量 不等于 没有隔离边界共享宿主机内核 也不等于 和宿主机完全一样


4. Docker 这条知识线应该怎么学

更推荐按下面这条顺序:

  1. 先理解镜像、容器、仓库这些基础概念
  2. 再理解 Dockerfile 和镜像构建
  3. 再看网络和数据卷
  4. 最后再看项目里的工程实践、运维边界和常见问题

如果顺序反过来,一开始就看一堆命令,很容易只记住表面操作,却不理解底层逻辑。


5. Docker 真正适合解决什么问题

更适合的场景通常包括:

  1. 本地开发环境统一
  2. 测试环境快速拉起
  3. CI/CD 构建和部署
  4. 应用标准化交付
  5. 微服务实例化运行

它不直接解决的事情包括:

  1. 集群调度
  2. 自动扩缩容
  3. 大规模容器编排
  4. 跨主机服务治理

这些问题通常要交给 Kubernetes 一类编排系统继续处理。


6. 当前目录下的专题

推荐阅读顺序:

  1. 看这篇总览,建立容器化主线认知
  2. 再看“镜像、容器与 Dockerfile”,理解构建和运行模型
  3. 再看“网络、端口映射与数据卷”,理解容器之间如何通信、数据如何持久化
  4. 最后看“工程实践与常见问题”,把这套知识落到项目里

7. 常见误区

7.1 误区一:把 Docker 理解成“虚拟机的简化版”

这个说法不够准确。更合理的理解是:它是一套面向应用交付和隔离运行的容器化方案。

7.2 误区二:容器删了,数据理应还在

不一定。

如果没有数据卷或外部存储,容器里的很多数据可能会随着容器生命周期结束而丢失。

7.3 误区三:应用能跑起来,就说明 Docker 用对了

这还不够。

工程里真正要关注的还包括:

  1. 镜像是否过大
  2. 构建是否可缓存
  3. 配置如何注入
  4. 日志如何输出
  5. 数据如何持久化
  6. 镜像是否包含不必要的敏感文件

8. 一句话总结

Docker 最值得先建立的认知,不是“命令怎么敲”,而是它为什么能解决环境一致性和交付效率问题,镜像和容器各自扮演什么角色,以及项目里真正该关注哪些工程问题。

基于 VitePress 构建的个人技术笔记。