怎么使用 Docker 部署 PostgreSQL 15 并持久化数据卷

文章导读
使用 Docker 部署 PostgreSQL 15 并持久化数据,最推荐通过挂载宿主机目录或 Docker 卷到容器内的/var/lib/postgresql/data 路径,并固定镜像版本为 postgres:15-slim。关键风险在于宿主机挂载目录的权限必须属于 UID 999,否则容器启动后会因无权写入导致数据丢失或启动失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

使用 Docker 部署 PostgreSQL 15 并持久化数据,最推荐通过挂载宿主机目录或 Docker 卷到容器内的/var/lib/postgresql/data 路径,并固定镜像版本为 postgres:15-slim。关键风险在于宿主机挂载目录的权限必须属于 UID 999,否则容器启动后会因无权写入导致数据丢失或启动失败。

先说结论:Docker 部署 PostgreSQL 15 的核心是正确挂载数据卷并修正目录权限,避免容器删除后数据丢失。

  • 适合:开发测试环境、微服务架构、需要频繁重置数据库的场景
  • 先准备:创建宿主机数据目录、执行 chown -R 999:999 授权、选定 postgres:15-slim 镜像
  • 验收:容器启动后检查/var/lib/postgresql/data 目录下是否有初始化文件、数据库可正常连接

命令速用版

直接使用 docker run 命令快速启动并挂载数据卷,适合单次部署或临时验证:

docker run -d \
  `--name` my-postgres \
  -e POSTGRES_PASSWORD=mysecretpass \
  -v /data/pgdata:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:15-slim

若需长期管理,建议使用 docker-compose.yml 配置文件:

version: '3.8'
services:
  postgres:
    image: postgres:15-slim
    environment:
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD=app123
      - POSTGRES_DB=appdb
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]

为什么会这样

Docker 容器默认是 ephemeral(临时)的,容器删除后内部文件系统会重置。数据持久化的原理是通过 Volume 挂载,将容器内的数据目录映射到宿主机磁盘或 Docker 管理的卷上。PostgreSQL 官方镜像约定数据根路径为/var/lib/postgresql/data,且容器内进程以 postgres 用户(UID 999)运行,因此宿主机对应目录必须允许该 UID 写入,否则数据库无法初始化或写入数据。

分步处理

按以下步骤操作可确保部署成功且数据可持久化:

怎么使用 Docker 部署 PostgreSQL 15 并持久化数据卷
  1. 创建宿主机目录:在宿主机创建用于存储数据的文件夹,例如 mkdir -p /data/pgdata。
  2. 修正目录权限:执行 sudo chown -R 999:999 /data/pgdata,确保容器内 UID 999 有写入权限。
  3. 启动容器:使用上述 docker run 命令或 docker-compose up -d 启动服务。
  4. 检查初始化:首次启动时 PostgreSQL 会自动初始化数据库文件,观察日志确认无 Permission denied 报错。

怎么验证是否生效

部署完成后,通过以下方式确认数据持久化已生效:

  • 检查容器状态:执行 docker ps 查看容器是否处于 Up 状态。
  • 验证数据文件:在宿主机执行 ls -l /data/pgdata,确认目录下生成了 base、global 等 PostgreSQL 系统文件。
  • 测试连接:使用 psql 或客户端工具连接 localhost:5432,确认能登录且数据库存在。
  • 重启验证:执行 docker restart my-postgres 后再次连接,确认数据未丢失。

常见坑

以下错误高频出现,操作时需特别注意:

  • 权限错误:宿主机目录未 chown 为 999:999,导致容器启动报错 permission denied。
  • 路径写反:-v 参数顺序应为宿主机路径:容器路径,写反会导致宿主机目录被清空或数据未挂载。
  • 镜像标签:避免使用 latest 标签,建议固定 postgres:15-slim,防止大版本升级导致数据不兼容。
  • 配置挂载:若需自定义配置文件,应挂载到/etc/postgresql,不要覆盖数据目录。

常见问题

容器删除后数据会丢失吗?

只要正确挂载了数据卷,容器删除后数据仍保留在宿主机目录或 Docker 卷中,重新创建容器挂载同一路径即可恢复。

为什么启动报错 permission denied?

因为 PostgreSQL 容器内以 UID 999 运行,宿主机挂载目录必须执行 chown -R 999:999 授权,否则无法写入数据文件。

应该选哪个 PostgreSQL 镜像版本?

推荐 postgres:15-slim,它在体积和兼容性之间取得平衡;若需极简可选 alpine 版,但需注意 musl libc 可能导致的扩展兼容问题。

参考来源

  • 怎么在 Docker 中部署 PostgreSQL 并配置数据持久化
  • Docker 实战:5 分钟搞定 PostgreSQL 15 轻量级部署 (含数据持久化技巧)
  • Docker 快速部署 PostgreSQL:从安装到高可用实践指南
  • 保姆级教程:用 Docker Compose 一键部署 PostgreSQL 15(含国内镜像加速)
  • Docker Compose 一键部署 PostgreSQL 15:从镜像配置到健康检查全流程
  • [云原生] 使用 Docker 部署 postgres 数据库
  • Docker 安装并持久化 PostgreSQL 数据库
  • PG 系列 3:docker 安装 PG15
  • docker 部署 postgresSQL 并做持久化_docker postgresql 部署 配置文件永久化-CSDN 博客
  • 【保姆级教程】Docker 部署 PostgreSQL + pgAdmin,支持远程连接 + 数据持久化 (docker-compose 版)