很多人纯靠 vibe coding 把项目做出来,一到部署,第一选择就是 Docker。
原因很简单。
原生部署要装环境、装数据库、配 Web 服务器,前前后后一大堆步骤。
Docker 却经常只让你复制一条命令、回车,项目就跑起来了。
看上去,比原生部署省事太多了。
但我要先给你泼盆冷水:Docker 不一定真的适合你。
尤其是你完全没有技术背景,只会跟着 AI 操作。
Docker 越像一键部署,你就越容易忽略后面那些真正要命的坑。
顺利的时候,它像条捷径。
真出问题时,你才发现,自己连问题藏在哪一层都不知道。
一天一个 vibe coding 小技巧:今天我们讲讲 Docker 部署。

一、Docker 到底把什么变简单了
一个项目想在服务器上运行,光有代码不够。
它还需要对应版本的语言环境、系统工具和各种依赖。
把这些东西直接装进服务器,就叫原生部署。
上一节讲的,就是这种方式。
Docker 则换了一个思路。
Docker 可以把应用和它运行时需要的大部分文件,提前整理成一个标准化的模板。
这个模板叫镜像。
镜像真正跑起来以后,就成了一个容器。
容器本质上还是服务器里的进程,只是和外面相对隔离。
你可以把镜像理解成一份已经配好的安装包,把容器理解成这份安装包真正跑起来的样子。
不过,一个完整项目通常不只一个容器。
后端可以放在一个容器里,数据库放在另一个容器里,缓存再放一个。
可这些容器怎么启动、怎么连接,总得有人安排。
哪些端口要开放,数据放在哪里,也得提前写清楚。
所以 Docker 还需要一张总清单。
这张清单通常叫 compose.yaml,有些老项目写成 docker-compose.yml。
你还经常会看到另一个文件:Dockerfile。
Dockerfile 负责写明“镜像怎么制作”。
Compose 文件负责写明“做出来以后,这些容器怎么一起运行”。
所以你执行:
docker compose up -d
Docker 就会照着清单下载或者制作镜像。
然后创建容器、接好内部网络和数据位置,再把整套服务启动起来。
原生部署是把步骤摊开来,一件一件做。
Docker 则把这些步骤提前写好,以后可以反复使用。
很多人第一次认识 Docker,就是在别人的开源项目里。
项目介绍里经常写着一句:“本项目支持 Docker 部署。”
为什么这句话到处都是?
因为开源项目的作者根本不知道,别人会拿什么电脑、什么服务器来运行他的项目。
于是作者提前做好镜像和配置。
别人拿去部署时,就更容易还原出相近的运行环境。
这才是 Docker 真正解决的问题:少装几遍环境,也少一点“在我电脑上明明能跑”的扯皮。
以后换服务器,也能拿同一套配置重新部署,不用全靠记忆从头再装。
看到这里,Docker 就没那么神秘了。
所谓一键启动,不过是有人提前把活儿写进了配置。
二、真要用 Docker,完整部署不是只敲一条命令
可换成你自己的项目,这些配置不会凭空出现。
AI 还得先把五件事做完。
第一,读懂项目,再写 Docker 配置。
它要先弄清前端、后端、数据库分别怎么运行,再决定这些 Docker 配置该怎么写。
常见的就是 Dockerfile、Compose 和 .dockerignore。
第二,检查服务器。
系统版本、CPU 架构、磁盘、端口,还有 Docker 和 Compose 装没装,都得先查。
如果没装,就按 Docker 官方文档来,别随手跑来路不明的一键脚本。
第三,放好上线配置和长期数据。
密码、令牌不能写进镜像或代码仓库。
数据库和上传文件,则要放进数据卷,或者挂到服务器目录里。
这样重建容器时,数据才不会跟着消失。
第四,制作镜像,启动容器。
准备完成后,才会执行类似 docker compose up -d 的命令。
第五,接上域名和 HTTPS。
做到这里,用户才能通过域名安全地访问你的网站。
所以 Docker 没有跳过部署。
它只是把其中一部分步骤,提前写进了配置里。
三、怎么让 AI 带你完成 Docker 部署
听着步骤不少,但你不用背 Docker 命令。
你真正要盯的,是别让 AI 跳步骤。
别只甩给它一句“帮我用 Docker 部署”,就让它直接在服务器上开干。
正确顺序是:先看项目,再查服务器,最后才动手。
你可以把下面这段直接发给当前正在处理项目的 AI:
“我要把当前项目用 Docker 部署到一台 Linux 服务器上。先只做检查,不要改代码,也不要开始部署。
先读懂当前项目。告诉我前端、后端、数据库和缓存分别是什么,项目怎么构建、怎么启动。再找出项目使用的端口、后台任务,以及必须长期保存的数据和文件。
检查项目里现有的 Dockerfile、.dockerignore 和 Compose 文件。能用就说明为什么能用,有问题就指出问题,不要直接覆盖。
然后给我几条只读命令,用来检查服务器的系统版本、CPU 架构、Docker 与 Compose 版本、磁盘、已占用端口和当前服务。告诉我每条命令在哪里执行、要看什么。等我把结果发回来,你再继续。
如果服务器没装 Docker,请根据这套系统对应的 Docker 官方文档给出安装步骤,不要使用来源不明的一键脚本。
拿到检查结果后,先给方案,不要直接执行。方案要讲清楚:准备新增或修改哪些 Docker 文件;上线配置放哪里;数据库和上传文件怎么持久化;怎么备份和恢复;公网开放哪些端口;域名和 HTTPS 怎么接;怎么启动、看状态、看日志;服务器重启后怎么恢复;以后怎么升级和回退。
另外检查四类高风险配置:高权限运行、直接使用主机网络、挂载 Docker 控制接口、挂载服务器重要目录。出现一项,就单独解释为什么需要。
密码、令牌和证书只告诉我在哪里填写,不要让我发给你,也不要写进代码或镜像。删除容器、删除数据卷、覆盖配置、修改防火墙、重启现有服务,都要先说明影响,等我单独确认。”
这段话看着长,但读者真正要做的只有两件事。
复制给 AI。
再把它给你的检查命令,一条条放进服务器执行。
如果 AI 工具能远程操作服务器,也别把长期使用的 root 密码或 SSH 私钥直接发给它。
更稳妥的做法,是单独创建一个临时、权限受限的账号或密钥。
但要记住:只要这个账号能控制 Docker,它就能对服务器做很多高权限操作。
别真把它当成普通的小号。
操作完成后,再删除临时账号、公钥和令牌,并检查它到底改了哪些东西。
只改一次 SSH 密码,不代表其他访问凭证也跟着失效。
四、页面能打开以后,还要验收这几件事
Docker 最容易给人的错觉,就是命令成功了,页面也打开了,部署便结束了。
这时候人最容易松一口气,也最容易提前收工。
可下一次重启、更新或者重建容器,才可能是真正翻车的时候。
这时候,还要验收五件事。
第一,所有需要的容器是不是真的正常。
不能只看“正在运行”。
还要让 AI 检查容器状态和应用日志。
后端要能连上数据库,关键服务也不能反复崩溃、重启。
第二,从服务器外面真实访问一次。
首页能开不够,还要试登录、保存数据、上传文件这些关键功能。
因为容器启动成功,不代表整条业务链路都通了。
第三,做一次重启和重建验证。
趁项目还没有真实用户数据,先保存一条测试数据、上传一个测试文件。
然后让 AI 按部署方案重启服务,再安全地重建一次对应容器。
服务恢复以后,刚才的数据和文件都还在,才能证明持久化真的生效了。
第四,检查对公网开放的端口。
网站入口需要开放,数据库和缓存通常只需要在 Docker 内部网络里互相访问。
让 AI 核对三个地方:Compose 配置、Docker 实际发布的端口、云服务器安全组。
少看一个,都可能漏。
第五,做备份和恢复验证。
有备份文件,不代表它一定能恢复。
还得找一份测试数据,真走一遍恢复流程。
上面五项都过了,才算把 Docker 部署真正做完。
到这一步,你拿到的才不是一个“碰巧能打开”的网站,而是一套经得住重启和重建的部署。
五、Docker 这么方便,我为什么仍然不推荐纯小白优先用
讲到这里,Docker 的好处应该很清楚了。
它能把运行环境标准化,部署和迁移更容易重复。
只要 AI 真正读懂了项目,Docker 配置也经过检查,它当然能成为一套稳定的部署方案。
前提是,数据、端口、备份、升级和回退,一个都没落下。
但如果你完全没有技术背景,我个人仍然不建议把 Docker 当成第一选择。
不是 Docker 不好。
是它把简单放在了启动那一刻,把复杂留在了后面的维护里。
好在这些坑并不玄学。
只要提前看见,就能提前堵住。
下面这些,就是新手真正容易踩的坑。
第一个坑,数据持久化不等于备份。
容器自身可写层里的数据,会随着容器被删除而丢失。
用了数据卷,哪怕容器被删掉重建,数据通常还在。
但这个数据卷,大多还在原来那台服务器上。
服务器损坏、数据卷被误删,数据照样会没。
而且有些清理命令会连数据卷一起删除。
网站没了还能重新部署,真实用户的数据没了,未必还能找回来。
所以“配了数据卷”和“有一份能恢复的备份”,是两回事。
怎么解决?
让 AI 把长期数据一项项列出来。
每一项存在哪个数据卷、哪个服务器目录,都要写清楚。
然后再制定定时备份方案。
备份还得放到别的地方。
可以是另一台机器,也可以是对象存储。
总之,不能和原数据一起留在同一块硬盘上。
最后再用测试环境做一次恢复,确认备份不是摆设。
第二个坑,端口可能开得比你以为的多。
Compose 里的 ports,负责把容器端口发布到服务器上。
如果没有限制监听地址,这些端口通常会监听服务器的所有网卡,也就可能直接暴露到公网。
在 Linux 上,Docker 还会创建自己的网络转发规则。
Ubuntu 里常见的防火墙工具叫 ufw。
Docker 发布的容器流量,可能还没经过 ufw,就已经被转走了。
所以不能只看 ufw 的规则,就认定数据库已经被拦住了。
网站需要对外开门,数据库通常不需要。
这个门一旦开错,外面的人甚至不用经过你的网站,就能直接碰到数据库端口。
解决办法是,只给真正需要外部访问的网站入口配置 ports。
数据库和缓存留在 Docker 内部网络里,不要发布到公网。
如果只需要让服务器自己访问,就绑定到 127.0.0.1。
最后再让 AI 核对 Docker 实际发布的端口和云服务器安全组。
第三个坑,更新并不是重新拉一下镜像那么简单。
latest 只是镜像上的一个标签。
这个标签可以被反复覆盖,所以你每次拉到的内容未必一样。
正式上线时,最好使用明确版本。
更新前,还要备份数据,记下旧版本和旧配置。
新程序如果改了数据库结构,失败后也未必只换回旧镜像就能恢复。
最麻烦的情况是:新版本没跑起来,旧版本也已经退不回去了。
怎么解决?
每次更新前,先让 AI 检查代码改了什么,数据库要不要跟着升级。
当前版本、目标版本、失败后怎么退,也要提前写清楚。
这些说不清,就不要直接拉新镜像覆盖。
第四个坑,容器里的临时修改留不住。
有人遇到问题,会让 AI 直接进入正在运行的容器里改文件。
眼前可能修好了,可容器下次重建,修改就跟着消失。
你以为问题已经解决,下次部署,同一个毛病又原样回来。
真正要留下的修改,必须回到项目代码、Dockerfile 或者外部配置里。
解决办法很简单。
容器里只查问题,不做正式修改。
找到原因后,让 AI 回到项目代码、Dockerfile 或 Compose 配置里修改。
改完重新制作镜像、重建容器,再验证一次。
第五个坑,某些配置会把容器的权限开得非常大。
比如看见 privileged: true,说明这个容器拿到了很高的权限。
看见 network_mode: host,说明它直接共用了服务器网络。
看见 /var/run/docker.sock,则说明容器拿到了控制 Docker 的入口。
把服务器的重要目录直接挂进容器,也可能让容器里的程序改到服务器文件。
一旦容器里的程序出错,受影响的就不一定只剩这个容器。
这些做法不是绝对不能用,但必须有明确理由。
网上抄来的 Compose 文件,还有 AI 临时生成的配置,执行前都要审查。
别因为最后只有一条启动命令,就直接相信。
怎么解决?
让 AI 把这些高风险配置逐项找出来,说明用途和影响。
你的项目没有明确需要、AI 也讲不清必要性的,先去掉,再看服务能不能正常运行。
第六个坑,服务在跑,服务器却可能慢慢被拖死。
容器可能反复崩溃、无限重启。
日志如果没有限制,也会一直往硬盘里写。
时间一长,CPU、内存或者硬盘,都可能被吃光。
所以还要配置合理的重启规则、健康检查和日志轮转。
让 AI 说清三件事。
服务异常后,什么时候重启。
怎么判断它真的健康。
日志最多多大,又保留多少份。
部署后,再检查一次 CPU、内存和硬盘。
别等网站挂了,才发现资源已经吃光。
Docker 的坑,不在那条启动命令里。
它们藏在后面的数据、网络、权限、更新和维护里。
对懂它的人,这层标准化很好用。
对只会照着 AI 敲命令的人,一旦出问题,要查的地方反而更多。
这就是我不推荐纯小白优先用 Docker 的原因。
六、最后
Docker 当然可以用,而且很多时候确实很好用。
真正的问题,是别把“一键启动成功”,当成“一切都部署好了”。
如果 AI 能把数据、端口、备份、升级和回退都安排清楚,还能拿出部署后的验证结果,那 Docker 可以用。
如果它只给你写出一条能启动的命令,连数据放哪、开放什么、失败怎么退都说不明白,那就先别执行。
用不用 Docker,不看那条启动命令有多短。
要看命令背后的东西,你和 AI 能不能管得住。
能管住,它就是省事的工具。
管不住,就别让一条命令替你做决定。