跳到内容

元数据卡

  • 前置知识:终端基础(ch02)、能看懂简单命令行
  • 预计时间:10 分钟
  • 完成标志:能理解为什么需要 Docker,能区分镜像和容器

你的进度

工具墙已经挂得满满当当了——但你意识到一个问题:这套工坊是你的,不是别人的。你的代码换一台机器就水土不服。

"我这配方没问题啊!"你对着图纸喊。你的合金配方在你的锻造炉里淬出一把完美剑刃。但你把图纸拿去隔壁工坊,按同样的步骤操作——炸了。

"你炉温多少?" "1100 度。" "我的炉子只能烧 950……你那配方到我这儿根本达不到熔点……"

你已经不是第一次遇到这种问题了。环境差异像不同的工坊布局——炉子在左边还是右边,风箱拉法不一样,你的成品就会变形。

你需要的不是"传代码",而是"传整个环境"。


问题是环境差异

"问题在哪?"你坐下来梳理。"我的炉子是燃煤的,他的炉子是燃油的——要不要把燃料配方刻在图纸上?"

工坊主人摇头。"刻在图纸上没用的,没人会照着做。你需要的是把整间工坊打包。连炉子带工具带材料,一卷走。"

这就是 Docker 要解决的问题。它是一个"移动工坊箱子"——把你的代码和它需要的整个环境(操作系统、运行时、依赖、配置)打包在一起,在任何机器上打开都是一模一样的。

镜像 vs 容器:蓝图和房子

工坊主人从架子上拿出两张纸。第一张是工坊的完整建筑图纸,第二张是一间已经盖好的小屋子的照片。

"这两样东西有什么区别?"

镜像(Image) 是一份只读的蓝图——它记录了你需要什么系统、装什么软件、配什么环境。

容器(Container)用蓝图造出来的房子——你可以造很多间,每间独立,进去能住能折腾。弄坏了也无所谓,从蓝图重新造一间就是。

bash
# 看看你电脑上已经有了哪些蓝图
docker images

# 从蓝图造一间新房子(并启动它)
docker run hello-world

# 看看现在有哪几间房子在住人
docker ps

你的第一个容器

Docker 有一个官方仓库叫 Docker Hub,里面放着各种别人造好的蓝图。

bash
docker run -d -p 8080:80 --name my-web nginx

这一行里发生了什么?

  • docker run —— 用蓝图造房子并启动
  • -d —— 后台模式,不占你的终端
  • -p 8080:80 —— 端口映射:你的工坊门口(本机 8080)通往容器的门口(容器内 80)
  • --name my-web —— 给这间房子起个名字
  • nginx —— 蓝图的名称

打开浏览器访问 http://localhost:8080。看到 nginx 欢迎页面了吗?

停止并清除:

bash
docker stop my-web
docker rm my-web

一间房子从落成到拆除,不过几秒。这就是容器的威力——用完即弃。

为什么容器比虚拟机轻?

虚拟机是在房间里再盖一个完整房间——有墙(Hypervisor)、地板(Guest OS)、水电(完整的内核),非常重。容器只是在你现有的房间里用屏风隔出一块区域——共享墙和地板(宿主内核),只隔离家具和活动空间。

所以容器启动快到毫秒级,占空间只有几 MB

这个比喻在哪里失效? "屏风隔断"能帮你理解容器为什么轻,但它不能解释真正的隔离机制——容器的隔离靠的是 Linux 的 Namespace 和 Cgroups。当你需要理解容器安全性或配置复杂网络时,屏风模型就不够了。


旅人笔记

镜像是不变的蓝图,容器是它跑起来的副本。Docker 让你把整面工坊墙——系统、依赖、配置、代码——全塞进一个箱子,别人打开箱子,你的东西原样工作。

下一步:写你的第一个 Dockerfile

学会了从 Docker Hub 拉别人造好的蓝图。下一步是自己画蓝图——把你自己的应用打包。

画蓝图 →

Built with VitePress | Software Systems Atlas