FTP + Docker:中小团队最简单的部署链路实战
很多没有完整 CI/CD 平台的中小型团队,部署流程仍然是一条非常朴素的工作流:本地写完代码后,通过 FTP 把项目目录传到服务器,再在服务器上用 Docker 构建镜像、启动容器。这个流程看起来不高级,但它解决了一个真实问题——服务器环境可以用 Docker 保持稳定,代码从本地到服务器的传递则交给 FTP 完成。这篇文章从环境准备、FTP 上传、Dockerfile 编写、docker-compose 编排、验证更新和故障排查六个环节,把这条链路完整走通,重点说明每一步为什么这样做,以及失败时从哪里查起。
1. 先理清这条部署链路:FTP 负责传输,Docker 负责运行
1.1 传统部署方式为什么容易出问题
先看没有 Docker 时的部署方式。项目在本地开发完成之后,要么把代码压缩包上传到服务器手工解压,要么在服务器上用 git pull 拉取,然后手工安装运行环境:下载 Node.js 或 Python,配置环境变量,再安装项目依赖。这种方式的痛点在于,服务器环境和本地环境很难完全一致。
最常见的现象是“本地能跑,服务器跑不起来”:本地 Node 版本是 20,服务器装的是 16;本地依赖安装成功,但服务器因为网络或系统库缺失而安装失败;运行一段时间后,服务器上可能还残留多个版本的运行时,互相冲突。Docker 解决的正是环境一致性问题。它把运行环境连同代码一起打包进镜像,同一份镜像在任何装了 Docker 的主机上都能以相同方式启动,从而把“环境差异”这个变量从部署流程中拿掉。
1.2 FTP 和 Docker 在链路中的明确分工
这条链路里的两个工具各有明确职责。FTP 负责文件传输:把本地项目目录里的代码文件传送到服务器磁盘上的某个目录。Docker 负责运行:读取服务器磁盘上的项目代码,通过 Dockerfile 描述如何构建镜像,再通过 docker-compose 描述如何启动容器。
这里容易混淆的是“代码上传到哪里”和“容器从哪里来”两个概念。FTP 上传完成后,代码只是停留在服务器文件系统里,还没有产生任何运行效果。真正让项目跑起来的是后续的 docker build 和 docker compose up 命令。因此,部署流程的正确顺序是:本地代码 → FTP 上传 → 服务器编写 Dockerfile → 构建镜像 → 启动容器 → 验证访问。顺序错了,比如先构建后上传,或者上传目录找错,都会让排查变得困难。
1.3 适合这条链路的项目类型和明显局限
FTP + Docker 的组合比较适合以下场景:
- 中小型团队,还没有搭建统一的 CI/CD 平台。
- 个人服务器、演示环境、学习项目。
- 临时接管一个历史项目,不方便立刻改动代码结构。
- 需要快速把本地已验证的代码搬到服务器跑起来。
但也要看到局限。FTP 本身是明文协议,用户名密码和文件内容都不加密,公网环境下直接用并不安全。手工上传依赖人工记忆“哪些文件改过了”,很容易漏传或误传。如果团队成员不止一个人,多人同时用 FTP 覆盖同一个目录,会产生互相覆盖的问题。文章后面会给出更合适的替代方向,但在小规模场景下,先跑通这条