数据库部署

View source
使用 Docker Compose 部署 PostgreSQL 和 Redis
本指南使用 Docker Compose v2+ 部署 PostgreSQL 和 Redis,并通过 SSH 隧道实现安全的远程连接。

项目结构

sh
mkdir -p ~/database
cd ~/database
touch docker-compose.yml

编写 Compose 文件

端口绑定 127.0.0.1 仅允许本地访问,这是推荐的安全配置。远程连接请使用 SSH 隧道。
~/database/docker-compose.yml
services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres
    restart: always
    ports:
      - "127.0.0.1:5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: your_postgres_password
      POSTGRES_DB: app
      TZ: Asia/Shanghai
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    container_name: redis
    restart: always
    ports:
      - "127.0.0.1:6379:6379"
    command: redis-server --requirepass your_redis_password
    volumes:
      - redis_data:/var/lib/redis/data

volumes:
  postgres_data:
  redis_data:

启动服务

sh
cd ~/database
docker compose up -d

验证安装

sh
# 检查容器状态
docker ps

# 测试 PostgreSQL
docker exec -it postgres psql -U postgres -c "SELECT version();"

# 测试 Redis
docker exec -it redis redis-cli -a 'your_redis_password' ping

PostgreSQL 成功时显示版本信息,Redis 成功时返回 PONG

远程连接数据库

不建议将数据库端口直接暴露到公网。强烈推荐通过 SSH 隧道连接。

为什么使用 SSH 隧道

方案安全性适用场景
直接暴露端口❌ 低仅测试环境
IP 白名单⚠️ 中固定 IP 用户
SSH 隧道✅ 高动态 IP 用户(推荐)

新建连接

打开 Navicat,点击 连接PostgreSQL

配置常规选项卡

参数
主机127.0.0.1
端口5432
初始数据库app
用户名postgres
密码your_postgres_password

配置 SSH 选项卡

勾选 使用 SSH 通道

参数
主机服务器公网 IP
端口22
用户名ubuntu(或 root
验证方法密码 或 公钥

测试连接

点击 连接测试,成功后保存连接。

Redis 配置类似,端口为 6379,密码为 your_redis_password

PostgreSQL 管理

常用命令

sh
# 进入 psql
docker exec -it postgres psql -U postgres

# 执行 SQL 文件
docker exec -i postgres psql -U postgres -d app < script.sql

# 查看数据库大小
docker exec -it postgres psql -U postgres -c \
  "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"

psql 内部命令

psql
\l              -- 列出所有数据库
\c dbname       -- 切换数据库
\dt             -- 列出当前数据库的表
\d tablename    -- 查看表结构
\du             -- 列出所有用户
\dx             -- 列出已安装扩展
\q              -- 退出

备份与恢复

sh
# 备份数据库
docker exec -it postgres pg_dump -U postgres -d app > backup.sql

# 压缩备份
docker exec -it postgres pg_dump -U postgres -d app | gzip > backup.sql.gz

# 恢复数据库
cat backup.sql | docker exec -i postgres psql -U postgres -d app

# 从压缩文件恢复
gunzip -c backup.sql.gz | docker exec -i postgres psql -U postgres -d app

添加 PostGIS 扩展

如需处理地理数据,修改镜像并激活扩展:

docker-compose.yml
services:
  postgres:
    image: postgis/postgis:16-3.4-alpine
    # ... 其余配置保持不变
sh
# 重启服务
docker compose down
docker compose up -d

# 激活扩展
docker exec -it postgres psql -U postgres -d app -c "CREATE EXTENSION postgis;"

Redis 管理

常用命令

sh
# 进入 Redis CLI
docker exec -it redis redis-cli -a 'your_redis_password'

redis-cli 内部命令

redis-cli
# 基本操作
SET key "value"           # 设置键值
GET key                   # 获取值
DEL key                   # 删除键
EXPIRE key 60             # 设置过期时间(秒)

# 查看信息
KEYS *                    # 查看所有键(生产环境慎用)
DBSIZE                    # 当前数据库键数量
INFO                      # 服务器信息
INFO memory               # 内存使用信息

# 数据库操作
FLUSHDB                   # 清空当前数据库

# 退出
QUIT

数据持久化

Redis 默认使用 RDB 快照。如需 AOF 持久化,创建自定义配置:

sh
mkdir -p ~/database/redis-conf
~/database/redis-conf/redis.conf
# 启用 AOF 持久化
appendonly yes
appendfsync everysec

# RDB 配置
save 900 1
save 300 10
save 60 10000

# 内存限制
maxmemory 256mb
maxmemory-policy allkeys-lru

更新 docker-compose.yml

docker-compose.yml
services:
  redis:
    image: redis:7-alpine
    container_name: redis
    restart: always
    ports:
      - "127.0.0.1:6379:6379"
    command: redis-server /usr/local/etc/redis/redis.conf --requirepass your_redis_password
    volumes:
      - redis_data:/data
      - ./redis-conf/redis.conf:/usr/local/etc/redis/redis.conf:ro

常用 Docker 命令

sh
# 查看容器状态
docker ps

# 查看日志
docker logs postgres --tail 50
docker logs redis --tail 50

# 重启服务
cd ~/database
docker compose restart

# 停止服务
docker compose down

# 停止并删除数据卷(危险:会丢失数据)
docker compose down -v

安全建议

  1. 使用强密码:建议使用 openssl rand -base64 16 生成
  2. 仅本地监听:端口绑定 127.0.0.1 而非 0.0.0.0
  3. SSH 隧道连接:避免直接暴露数据库端口
  4. 定期备份:配置自动备份脚本
  5. 及时更新:定期更新 Docker 镜像修复安全漏洞
sh
# 更新镜像
docker compose pull
docker compose up -d
Copyright © 2024 - 2025 YiXuan - MIT License