“装一个 Linux 虚拟机,把环境完全搭成一样的试试”
入职三个月时,办公室里的气氛有些不对劲。团队里唯一的前辈已经确定要调去别的项目,别说交接了,他连收拾自己的东西都忙不过来;而组长早就脱离了一线开发,对最新技术趋势也已经相当陌生。
有一天,组长把我叫过去。 “OO,等你前辈一走,能管服务器的人就只剩你了。以后就算服务器炸了,你也得能一个人恢复。你现在用的开发笔记本,Windows,上面装个 Linux 虚拟机(VM),把环境搭得和生产服务器一模一样看看。”
从那天起,我的折腾就开始了。装 VMware、下载 Ubuntu 的 ISO 文件,光是安装就花了我半天时间。我翻着公司的 wiki 去装 Java、Node.js、PostgreSQL。我心想“新版本应该更好吧”,于是装了 Java 17,结果后来才发现遗留代码用的是 Java 8,连构建都过不了,只好删掉重装。每次改完一行代码,都要执行 mvn build,把 jar 文件拷进 VM 里再运行,这整个过程简直痛苦至极。
然后我突然冒出一个疑问。 “等一下,上次部署生产服务器的时候,不是只打一行 docker service update 命令就结束了吗?”
我的本地虚拟机这么沉重、配置项这么多,那生产服务器上的那个“Docker”到底是什么,为什么能靠一条命令就完成更新?

沉重的解决方案:虚拟机 (Virtual Machine)
组长让我做的那种方式,也就是在 Windows 上再安装一层 Linux,其实就是“虚拟机(VM)”。这就像是在一台物理电脑,Host,之上,再完整建起一栋“虚拟的房子”,也就是 Guest OS。
归根结底,VM 在“环境隔离”这件事上当然很可靠,但如果每次开发或部署都要这样来回搬运,它实在太重、太慢了。
轻量级革命:Docker
于是,“Docker”,也就是“容器(Container)”技术出现了。Docker 不像 VM 那样整栋房子都建出来,它只是“搭了一顶帐篷”。
我当时在生产服务器上敲下的 update 命令,并不是去重新安装一个沉重的操作系统,而只是“把旧帐篷拆掉,再搭起一顶装着新版本代码的帐篷”而已。所以它当然会在一瞬间完成。

[Code Verification] Docker 真的有那么轻吗?
别只停留在“Docker 很轻”这种说法上,我们来实际看看。如果目标是运行一个 Linux,也就是 Ubuntu,环境,那么 VM 和 Docker 之间的差距会非常明显。
# 使用 Docker 指令啟動 Ubuntu(若沒有映像則自動下載)
$ docker run -it ubuntu:latest /bin/bash
结果:
我一按下 Enter,就已经进入了 Ubuntu 环境。之所以能做到这一点,是因为 Docker 容器并不是真正的操作系统。它只是“借用 Host OS,也就是我电脑,的内核,同时伪装得像一个独立 OS 的隔离空间”而已。
实务建议:真正应该使用 Docker 的理由
在实务中引入 Docker 之后,我的工作方式彻底改变了。
结语:我们交付的不是可执行文件,而是“环境”
Docker 的出现改变了开发的范式。我们不再只是把源代码,.java,发到服务器上,而是把代码运行所需的 OS 配置、库、环境变量一起固化成“镜像(Image)”再整个交付过去。
那么,这种魔法般的“Docker 镜像”到底是怎么做出来的? 难道它只是一个压缩文件吗? 令人惊讶的是,据说 Docker 镜像其实像“蛋糕”一样,是由多层 Layer 堆叠起来的。
下一次,我们就来继续拆解 Docker 高效背后的秘密,也就是“镜像与层结构”。