生产级 PostgreSQL 容器启动
约 1099 字大约 4 分钟
2025-10-18
在现代应用系统架构中,数据库是业务的核心组件之一。无论是 Web 项目还是微服务,可靠、可扩展、便于维护的数据库部署方式很重要。
本文将带你一步步使用 Docker 启动一个生产可用的 PostgreSQL 数据库实例,并解释启动命令中的每个参数设计思路。
Docker 的轻量运行机制和隔离性,让我们非常容易部署 PostgreSQL。
但如果只是简单运行一个 docker run postgres,那属于“测试级别”,一旦容器重启或宿主机重启,数据有可能丢失,更不安全。本文将演示符合生产使用标准的部署方式,包括:
- 数据持久化
- 自动重启策略
- 命名卷管理数据
- 指定账户密码
- 备份目录准备
最终 Docker 启动命令
docker volume create pgdata
docker volume create pgbackups
docker run -d \
--name postgres-prod \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=Yw9pR3kzN4bT2xV8 \
-e POSTGRES_DB=appdb \
-v pgdata:/var/lib/postgresql/data \
-v pgbackups:/backups \
-p 5432:5432 \
--restart unless-stopped \
docker.1ms.run/library/postgres:latest参数逐个解析
创建数据卷
docker volume create pgdata
docker volume create pgbackupsDocker 默认提供两种持久化方式:绑定挂载 Bind Mount 和 命名卷 Volume。生产环境更推荐 Volume,因为它由 Docker 管理,更稳定安全,避免宿主机目录权限或挂载选项问题。
pgdata用来保存 PostgreSQL 的数据库文件pgbackups用来保存备份(后面可以用脚本自动备份)
数据卷优点: 不受宿主机目录权限影响,可迁移、可备份,不因容器删除而丢失数据
启动 PostgreSQL 容器
docker run -d \
--name postgres-prod \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=Yw9pR3kzN4bT2xV8 \
-e POSTGRES_DB=appdb \
-v pgdata:/var/lib/postgresql/data \
-v pgbackups:/backups \
-p 5432:5432 \
--restart unless-stopped \
docker.1ms.run/library/postgres:latest--name postgres-prod
给容器起一个名字,便于管理。postgres-prod 表示它是生产用数据库。
-e POSTGRES_USER=postgres
设置数据库管理员用户名。默认是 postgres,也可以改成业务账号。
-e POSTGRES_PASSWORD=...
数据库密码,必须设置,否则 PostgreSQL 会拒绝启动。
-e POSTGRES_DB=appdb
初始化时默认创建一个数据库,方便应用直接使用。
-v pgdata:/var/lib/postgresql/data
挂载数据卷到 PostgreSQL 数据目录,实现数据持久化。
-v pgbackups:/backups
提供一个备份目录,后面可以用 pg_dump 自动备份数据库。
-p 5432:5432
映射数据库端口,使外部能连接数据库。5432 是 PostgreSQL 默认端口。
--restart unless-stopped
保证容器在系统重启后自动恢复,非常适合生产环境。
docker.1ms.run/library/postgres:latest
使用 Postgres 镜像的加速源,国内也能快速拉取。
命名卷存储位置
Docker 卷默认存储在:
/var/lib/docker/volumes/查看所有的卷
docker volume ls查看某个卷真实路径:
docker volume inspect pgdata你会看到类似:
"Mountpoint": "/var/lib/docker/volumes/pgdata/_data"进入数据库
docker exec -it postgres-prod psql -U postgres -d appdb进入后可以执行 SQL 命令。
设置远程访问
官方 PostgreSQL 镜像默认不带 vim,所以需要先安装它,然后再编辑文件。这里给出逐步操作:
进入容器
docker exec -it postgres-prod bash安装 vim
容器可能是 Debian/Ubuntu 系列:
apt-get update
apt-get install -y vim如果是 Alpine 系列:
apk add vim修改 postgresql.conf
vim /var/lib/postgresql/data/postgresql.conf找到 #listen_addresses = 'localhost'
修改为:
listen_addresses = '*'保存并退出 (:wq)
修改 pg_hba.conf
vim /var/lib/postgresql/data/pg_hba.conf添加一行允许远程访问:
host all all 0.0.0.0/0 md5保存并退出
重启容器
exit # 退出容器
docker restart postgres-prod自动备份脚本
为了保证数据安全,建议每日自动备份,并保留最近 N 天的备份。
备份脚本示例 /srv/postgres/backups/backup.sh
#!/bin/bash
# 配置
CONTAINER=postgres-prod
BACKUP_DIR=/backups
DB_NAME=appdb
USER=postgres
RETENTION_DAYS=7
# 生成日期
DATE=$(date +%F)
BACKUP_FILE=$BACKUP_DIR/${DB_NAME}_$DATE.sql
# 执行备份
docker exec $CONTAINER pg_dump -U $USER $DB_NAME > $BACKUP_FILE
# 清理旧备份
find $BACKUP_DIR -type f -name "${DB_NAME}_*.sql" -mtime +$RETENTION_DAYS -exec rm {} \;设置每日定时任务(cron)
# 编辑 crontab
crontab -e
# 添加每天凌晨 2 点执行备份
0 2 * * * /srv/postgres/backups/backup.sh >> /srv/postgres/backups/backup.log 2>&1说明
- 保留最近 7 天的备份,避免占用过多空间
- 日志文件记录备份执行情况,方便排查
- 可以根据需要调整
RETENTION_DAYS或备份时间
数据恢复
cat /backups/appdb-2025-10-18.sql | docker exec -i postgres-prod psql -U postgres -d appdb其他
查看运行状态
docker ps查看日志
docker logs -f postgres-prod