很多个人项目最初只有一个脚本:在电脑上可以运行,换一台机器就要重新安装依赖、修改配置,再手动启动。2021 年我给一个小工具做整理时,决定把“运行环境”也作为项目的一部分保存下来。
先把服务边界说清楚
我先把程序拆成三个部分:应用本身、持久化数据、配置文件。应用容器可以随时重建,数据目录需要长期保留,配置则通过环境变量注入。这样做的好处是,升级应用时不必碰数据,迁移服务器时也只需要打包数据目录和 compose 文件。
一个最小的 docker-compose.yml 可以这样写:
version: "3.8"
services:
app:
image: example/app:1.0
restart: unless-stopped
ports:
- "8080:8080"
env_file:
- .env
volumes:
- ./data:/var/lib/app
restart: unless-stopped 让机器重启后服务自动恢复;版本号固定则避免“今天能跑、明天突然变样”。开发阶段可以使用 latest,生产环境最好明确写版本。
配置和数据分开
密码、令牌等内容不应该提交到 Git。项目里只保留 .env.example,真正的 .env 放在服务器上,并限制文件权限:
cp .env.example .env
chmod 600 .env
docker compose up -d
备份也围绕数据目录进行。对小项目来说,每天压缩一次数据并保留最近七份,已经比“只在出问题时想起来备份”可靠很多。
让部署变成一个动作
最后我把更新流程固定为:拉取代码、检查配置、构建新镜像、重新创建容器、查看日志。步骤固定之后,部署不再依赖某个人记得哪些命令,也更容易在低配服务器上控制资源。
这个实践让我意识到,轻量化不只是少装软件,更是让每个组件的职责足够单一。服务越小,备份、迁移和排错都越容易。