起一个 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、版本升级、监控全包——值不值看你时间成本。

下一篇:备份策略——拉到本地 / 拉到对象存储 / 异地副本。