Insights·2026-09-17

Docker 与 Kubernetes 是什么 — 把地基一起搬走

在自己电脑上跑得好好的东西到服务器上就不行,原因多半是操作系统、版本或已装工具不同。代码一样,脚下的地基不一样。于是把程序连同它运行的环境整个封成一个包,这种做法就是 Docker;那个包叫镜像,跑起来的叫容器。包一多,谁跑几个、死了何时拉起,这些管理工作就归 Kubernetes。

Docker는 코드가 아니라 돌던 환경까지 함께 옮긴다 — 글의 요약 도식

在我电脑上是好的

软件行业有一句最古老的话:在我电脑上是好的。

以前的部署很简单。把自己电脑上做好的文件原样传到服务器,别人就能看到了。但这种做法有一个沉默的前提:自己的机器和服务器是同一个环境。

实际上并不同。操作系统不同,或者系统相同但版本不同,或者已装工具的版本不同。第一次上传时对齐过,时间一长也会走偏。代码一样而地基不同,于是这边行那边不行。

而且难修,因为怎么盯着代码看都没用,问题根本不在代码里。

所以把地基一起搬走

想法很简单。既然是环境不同造成的问题,那就把环境一起搬过去。

不只搬程序,而是把它运行所在的地基一并取下来,封成一个包。在什么操作系统上、和哪些工具的哪个版本一起跑着,全都装进这个包里。

这个包叫镜像,把镜像跑起来的状态叫容器。这一整套做法就是 Docker。

这样部署就变了。不再一个个上传文件去覆盖,而是整个换掉容器。起新包,撤旧包。出问题就把旧包再起回来。

搬运的单位变了
从前   我的代码 ──────────────────▶ 服务器
       (服务器的环境是服务器的事)

现在   我的代码 + 它运行的环境 ──▶ 镜像 ──▶ 在服务器上以容器运行
       (地基一样,这边行那边就行)

不只是搬运时才用

有人会发现氛围编程做着做着,电脑上某天就多了个鲸鱼图标。多半就是这个用途。

因为可以把别人做好的镜像拿来,在自己电脑上原样跑起来。以数据库为例,不必把上一篇讲的 PostgreSQL 直接装到自己机器上,而是取镜像、以容器跑。安装过程中可能出的所有问题,整个跳过。

用完把容器撤掉就行,自己电脑上几乎不留痕迹。多个项目要求不同版本时,也不会互相打架。

所以 Docker 既是部署工具,也是开发环境工具。前面说过自己的电脑也能当服务器,这也是把好几台这样的服务器并排跑起来的办法。

Kubernetes,以及打开一次 Dockerfile

只有一个包时没什么好管的。包一多情况就不同了。哪个跑几份、死了什么时候拉起、请求涌上来时扩到几份,都要定。

干这活儿的是 Kubernetes。名字太长,把 K 和 s 之间的八个字母缩掉,写成 K8s。这是服务做大之后用的工具,并非一开始就需要。

把部署自动化的事也挂在这里。代码推到仓库后,可以让它自己构建、检查、换成新容器。这条自动流程叫 CI/CD。

有一件现在就能做的事:看看项目最上层有没有一个叫 Dockerfile 的文件,有就打开看看。安装、构建、打包的顺序写着十来行。按下部署键后等的那几分钟里发生了什么,全在那里。

Dockerfile 该怎么读
FROM node:22          ← 从什么地基开始
WORKDIR /app          ← 在哪个文件夹里干活
COPY package.json .   ← 什么要放进包里
RUN npm install       ← 要装什么
COPY . .
RUN npm run build     ← 要构建什么
CMD ["npm", "start"]   ← 起来之后跑什么

部署花的那几分钟,就是这些行按顺序执行的时间

九篇连成一条线

我们从一条线出发:浏览器向服务器发出请求,收到文件,画出画面。

浏览器读的是三个文件。请求靠 IP 和端口确定目的地,域名把它改写成名字。到达的请求该回什么由 Web 服务器决定;画出来的是前端,造出来的是后端。值堆在数据库里,文件堆在存储和 CDN 里。而把这一整套搬到另一台电脑上,用的是容器。

知道了这个顺序,下次遇到陌生的名字,就能先问它挂在哪里。这正是这九篇的目的。