docker 安装 postgresql16

吴书松
吴书松
发布于 2026-04-08 / 2 阅读
0
0

docker 安装 postgresql16

📄 docker-compose.yml 完整内容

yaml

version: '3.8'

services:
  postgres:
    # 使用指定的镜像(国内加速镜像)
    image: docker.1ms.run/library/postgres:16
    container_name: postgres16
    restart: always

    # 端口映射:宿主机端口:容器端口
    ports:
      - "5432:5432"

    # 环境变量
    environment:
      POSTGRES_PASSWORD: your_strong_password   # 【必填】设置超级用户密码
      POSTGRES_USER: postgres                    # 可选,默认为 postgres
      POSTGRES_DB: postgres                      # 可选,默认创建同名数据库
      TZ: Asia/Shanghai                          # 设置容器时区

    # 挂载卷:数据持久化 + 自定义配置文件
    volumes:
      # 数据目录映射(将容器数据持久化到宿主机的 ./data 目录)
      - ./data:/var/lib/postgresql/data
      # 自定义配置文件挂载(只读),需要提前在宿主机准备 postgresql.conf
      - ./conf/postgresql.conf:/etc/postgresql/postgresql.conf:ro
      # 可选:初始化脚本目录(首次启动时自动执行 .sql/.sh 文件)
      - ./init-scripts:/docker-entrypoint-initdb.d:ro

    # 启动命令:指定使用自定义配置文件
    command: >
      postgres
      -c config_file=/etc/postgresql/postgresql.conf

    # 资源限制(CPU / 内存)
    deploy:
      resources:
        limits:
          cpus: '2'      # 最多使用 2 个 CPU 核心
          memory: 4G     # 最多使用 4GB 内存
        reservations:
          cpus: '1'      # 预留 1 个 CPU 核心
          memory: 2G     # 预留 2GB 内存

    # 可选:设置共享内存大小(PostgreSQL 推荐至少 64MB,默认 64MB)
    # shm_size: 256mb

📝 使用前准备

  1. 创建必要的宿主机目录和文件

    bash

    mkdir -p ./data ./conf ./init-scripts
  2. 准备 PostgreSQL 配置文件(如果不需要自定义配置可跳过此步)

    • 方法一:从官方镜像中导出默认配置

      bash

      docker run -i --rm docker.1ms.run/library/postgres:16 cat /usr/share/postgresql/postgresql.conf.sample > ./conf/postgresql.conf
    • 方法二:直接创建空白文件(容器会使用内置默认值)

      bash

      touch ./conf/postgresql.conf
    • 然后根据需求编辑 ./conf/postgresql.conf

  3. (可选)准备初始化脚本
    .sql.sh 文件放入 ./init-scripts 目录,容器在首次初始化数据库时会自动按文件名顺序执行。

🚀 启动与管理命令

bash

# 启动服务(后台运行)
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看实时日志
docker-compose logs -f postgres

# 停止服务
docker-compose down

# 停止并删除数据卷(危险!会清除所有数据)
# docker-compose down -v

🔧 关键配置说明

配置项

说明

端口映射

"5432:5432" 将容器内 PostgreSQL 默认端口映射到宿主机相同端口。如宿主机端口已被占用,可改为 "5433:5432"

数据持久化

./data 目录挂载到容器数据目录 /var/lib/postgresql/data,即使容器删除,数据依然保留。

配置文件挂载

将宿主机 ./conf/postgresql.conf 以只读方式挂载到容器内,并通过 command 中的 -c config_file=... 指定使用该配置。

资源限制

使用 deploy.resources 进行限制。注意:deploy 配置在 非 swarm 模式下需要添加 --compatibility 标志才能生效,或者直接使用旧版 cpus/mem_limit 字段(见下文兼容写法)。

环境变量

POSTGRES_PASSWORD必填项,否则容器无法启动。请修改为强密码。

⚠️ 关于资源限制的说明

如果你使用的 Docker Compose 版本较老,或者不想依赖 --compatibility 模式,可以将 deploy 部分替换为以下兼容写法(直接放在 postgres 服务下):

yaml

    # 兼容写法(无需 deploy)
    cpus: '2'
    mem_limit: 4g
    mem_reservation: 2g

完整替换示例:

yaml

services:
  postgres:
    # ... 其他配置保持不变 ...
    cpus: '2'
    mem_limit: 4g
    mem_reservation: 2g

✅ 验证配置

启动后,执行以下命令验证资源限制是否生效:

bash

docker stats postgres16

输出中应显示 CPU 和内存限制与你设置的一致。

📌 安全建议

  • 密码管理:生产环境请勿将密码明文写在 docker-compose.yml 中。推荐使用环境变量文件(.env)或 Docker Secret。

    • 示例:创建 .env 文件,写入 POSTGRES_PASSWORD=your_strong_password,然后在 docker-compose.yml 中使用 POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  • 配置文件权限:确保 ./conf/postgresql.conf 文件权限正确,避免被意外修改。

🧹 清理与备份

  • 备份数据:直接备份 ./data 目录即可。

  • 备份配置文件:备份 ./conf/postgresql.confdocker-compose.yml

如果你需要针对特定性能参数(如 shared_buffersmax_connections)进行调优,可以参考 PGTune 生成配置,然后写入 ./conf/postgresql.conf 中。


评论