起一个 PostgreSQL
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD} # 从 .env 读
POSTGRES_DB: app
ports:
- "127.0.0.1:5432:5432" # 仅本机访问
volumes:
- pg-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
pg-data:
.env:
DB_PASSWORD=随便一个长字符串
⚠ .env 加进 .gitignore——别把密码 push 到 git。
连进去
docker compose exec db psql -U app -d app
# psql shell 里:
\dt # 列表
\d users # 看表结构
SELECT * FROM users LIMIT 10;
\q
或本地用 GUI(DBeaver / TablePlus / Navicat)连 localhost:5432。
别把数据库直接暴露公网
ports:
- "127.0.0.1:5432:5432" # 只绑 127,外网连不上
如果不写 127.0.0.1:,默认是 0.0.0.0——全网都能连。生产数据库被扫库一夜的事不少。
起一个 Redis
redis:
image: redis:7-alpine
ports:
- "127.0.0.1:6379:6379"
volumes:
- redis-data:/data
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
restart: unless-stopped
连:
docker compose exec redis redis-cli -a $REDIS_PASSWORD
> SET hi "hello"
> GET hi
备份:每天导出 SQL
cron 每天 3 点导一份:
# /etc/cron.d/db-backup
0 3 * * * wadely cd /path/to/project && docker compose exec -T db pg_dump -U app app | gzip > /backups/db-$(date +\%F).sql.gz
加上 14 天清理:
find /backups -name "db-*.sql.gz" -mtime +14 -delete
下一篇专门讲备份策略(异地 / 增量 / 加密)。
不想自己运维 Postgres
托管选项:
| 平台 | 起价 | 备注 |
|---|---|---|
| Supabase | 免费起步 | Postgres + 内置 API |
| Neon | 免费 0.5GB | Serverless Postgres |
| Railway | $5/月起 | 简单 |
| 阿里云 RDS | ~¥150/月起 | 国内合规 |
托管的好处:自动备份、HA、版本升级、监控全包——值不值看你时间成本。
下一篇:备份策略——拉到本地 / 拉到对象存储 / 异地副本。