本笔记记录了如何使用 Docker 容器化地安装 PostgreSQL 数据库服务。通过容器化,我们可以轻松地在不同环境中启动一个隔离且配置一致的 PostgreSQL 实例。

为什么选择 Docker 安装 PostgreSQL?

  • 环境隔离: 与宿主机环境的隔离,避免依赖冲突。

  • 快速启动: 几秒钟内即可拉取镜像并启动。

  • 版本管理: 轻松切换不同版本的 PostgreSQL。

  • 可移植性: 部署脚本(如 Docker Compose)在任何支持 Docker 的环境中都可运行。

核心部署策略:使用 Docker Compose

对于开发环境或简单的单机部署,Docker Compose 是最便捷的方式。

docker-compose.yml 示例

services:
  postgres:
    image: postgres
    container_name: postgres
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro # 保持容器时间与宿主机一致
      - /etc/timezone:/etc/timezone:ro # 保持容器时间与宿主机一致
      - /fs/1000/ftp/docker/postgres/db_data:/var/lib/postgresql/data  # 默认数据目录
    ports:
      - "5434:5432"
    environment:
      POSTGRES_PASSWORD: Postgres12#$
      POSTGRES_DB: n8n
      TZ: Asia/Shanghai # 设置时区,例如上海时区
    # 健康检查:确保数据库服务真正可用
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] # 或者 pg_isready -U postgres
      interval: 10s       # 每 10 秒检查一次
      timeout: 5s         # 每次检查的超时时间为 5 秒
      retries: 5          # 失败 5 次后认为服务不健康
      start_period: 30s   # 启动后等待 30 秒再开始健康检查 (给PostgreSQL足够时间启动)

    # 共享内存配置,对于PostgreSQL很重要,尤其是在运行大型查询时
    shm_size: 256mb # 建议256mb或更高

如何运行: 在包含上述 docker-compose.yml 文件的目录下,执行 docker compose up -d 命令。

关键配置解析:

  • 镜像选择 (image: postgres:16-alpine): 优先选择 alpine 版本,体积小,启动快。指定具体版本号,避免不兼容性。
  • 环境变量 (environment): POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD 是必不可少的,用于初始化数据库。
  • 数据持久化 (volumes): postgres_data:/var/lib/postgresql/data 至关重要! 这是确保数据库数据在容器重启或删除后不会丢失的方法。这里使用了Docker 卷
  • 端口映射 (ports): 5432:5432 将容器的 5432 端口映射到宿主机的 5432 端口,允许外部应用连接。
  • 网络 (networks): 将 PostgreSQL 容器放在一个自定义的Docker 网络中,便于与其他应用容器(如 Node.js 应用容器Python Flask 应用容器)进行通信。

进一步考量:

  • 安全性: 不要将生产环境的密码硬编码在 docker-compose.yml 中,应使用环境变量或 Docker Secrets
  • 初始化脚本: 如果需要预先创建表、插入数据,可以通过挂载 initdb.d 目录来实现。
  • 备份与恢复: 考虑如何定期备份 postgres_data 卷。
  • 高可用性: 对于生产环境,可能需要考虑使用 PostgreSQL 流复制Kubernetes Operator 等高级方案。

相关笔记: