Docker PostgreSQL 16 部署要点(Ubuntu 22)
一、镜像相关镜像postgres:16国内服务器必须配置 Docker 加速器否则拉取超时Docker 镜像、容器存储位置默认/var/lib/docker二、挂载卷重点只挂载数据目录即可配置文件已内置在数据目录中不需要额外挂载 conf 文件。宿主机路径容器内路径/home/ubuntu/docker/postgres/data/var/lib/postgresql/data该目录包含全部业务数据、索引、WAL 日志、PG 账号权限系统表、postgresql.conf、pg_hba.conf。删除容器后宿主机目录不变数据与配置全部保留。⚠️ 权限大坑必做容器内部 postgres 进程 UID 固定为999宿主机无此用户名Linux 只识别数字 UID。挂载数据卷pg进程UID为999的用户要操作宿主机目录必须要重新分配数据目录权限sudomkdir-p/home/ubuntu/docker/postgres/datasudochown-R999:999 /home/ubuntu/docker/postgres/datasudochmod700/home/ubuntu/docker/postgres/datachown -R 999:999让容器内 PG 进程拥有目录读写权限chmod 700仅属主可访问PG 强制要求700 挡不住 root 用户❌ 禁止在宿主机直接编辑挂载目录内的 conf 文件用sudo vim保存后文件属主变成 rootUID999 的 PG 进程读取失败容器反复重启。✅ 修改配置正确方式进入容器内部编辑dockerexec-itpg16bashvim/var/lib/postgresql/data/postgresql.confvim/var/lib/postgresql/data/pg_hba.conf三、初始化账号密码逻辑环境变量说明POSTGRES_USER超级用户名省略默认postgres建议显式写明POSTGRES_PASSWORD超级用户密码必填不能为空⚠️仅宿主机数据目录为空首次启动时环境变量才生效如果目录已存在旧数据修改run命令的环境变量完全无效账号密码存储在 PG 系统表中。修改密码需进入 psql 执行ALTER USER。安全规范业务程序不要直接使用 postgres 超级账号启动成功后新建业务用户与业务库。四、日志说明Docker 版 PG 默认日志输出到容器标准输出用docker logs pg16查看不落地磁盘文件无需挂载日志目录需要磁盘日志需修改postgresql.conf开启再额外挂载日志目录普通业务不推荐五、网络安全云服务器必看端口映射-p 5432:5432云服务器安全组严禁开放 5432 到0.0.0.0/0限制为自己本机公网 IP防止爆破更安全的做法-p 127.0.0.1:5432:5432仅本机可连外部完全不可达六、完整容器创建命令sudodockerrun-d\--namepg16\-p5432:5432\-ePOSTGRES_USERpostgres\-ePOSTGRES_PASSWORD替换为你的强密码\-eTZAsia/Shanghai\-v/home/ubuntu/docker/postgres/data:/var/lib/postgresql/data\--restartalways\postgres:16七、启动后校验# 查看容器运行状态dockerps# 查看启动日志出现 database system is ready to accept connections 代表成功dockerlogs pg16# 进入 psql 交互终端测试dockerexec-itpg16 psql-Upostgres八、备份提醒数据库运行时不要直接拷贝宿主机 data 目录会造成数据损坏。逻辑备份使用pg_dump# 备份dockerexecpg16 pg_dump-Upostgres 库名backup.sql# 恢复catbackup.sql|dockerexec-ipg16 psql-Upostgres-d库名九、创建业务用户 数据库在 psql 内执行CREATEUSERbusiness_userWITHPASSWORD业务密码;CREATEDATABASEbusiness_db OWNER business_user;GRANTALLPRIVILEGESONDATABASEbusiness_dbTObusiness_user;十、故障排查要点现象原因解决容器反复重启目录权限问题文件属主变成 rootchown -R 999:999修复权限改了环境变量密码不生效数据目录非空环境变量仅首次生效进入 psql 执行ALTER USER容器启动报权限错误宿主机目录权限不是 700chmod 700修复修改数据库参数两种方式容器内改 conf → 重启容器run命令追加-c参数docker run ... postgres:16 -c max_connections200