← 返回首页
🐘

PostgreSQL🐳 Docker

🔖 版本: v16📦 大小: 350MB📅 添加: 2025-03-15
创建时间:2026-08-17
#数据库#关系型#开源#SQL
镜像名称postgres:16-alpine
镜像大小💿 340MB
支持架构AMD64ARM64
Docker Hub🔗 访问

🔑 默认登录凭据

用户名:admin
密码:secret

💡 说明:默认用户名由 POSTGRES_USER 环境变量设置,密码由 POSTGRES_PASSWORD 设置。生产环境请务必修改。

🔌 常用端口说明

端口服务说明快速访问
5432PostgreSQL 服务PostgreSQL 默认监听端口🔗 访问

⚙️ 环境变量

变量名描述默认值必填
POSTGRES_USER超级用户名admin<span class="required-badge">必填</span>
POSTGRES_PASSWORD超级用户密码secret<span class="required-badge">必填</span>
POSTGRES_DB默认创建的数据库mydb可选
PGDATA数据目录路径/var/lib/postgresql/data可选
TZ时区设置UTC可选

🗄️ 数据库创建脚本

创建基础数据库

创建业务数据库及授权用户的基础脚本

SQL Script
-- 创建业务数据库
CREATE DATABASE mydb
  WITH ENCODING 'UTF8'
  LC_COLLATE = 'zh_CN.UTF-8'
  LC_CTYPE = 'zh_CN.UTF-8'
  TEMPLATE = template0;

-- 连接到新数据库
\c mydb

-- 创建业务用户
CREATE USER app_user WITH PASSWORD 'secure_password'
  CREATEDB
  NOSUPERUSER
  CONNNECTION LIMIT 100;

-- 授权
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;
GRANT ALL ON SCHEMA public TO app_user;

创建示例表结构

创建用户表和索引,包含常用的业务字段

SQL Script
-- 用户表
CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(50) UNIQUE NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(20) DEFAULT 'user',
  status VARCHAR(10) DEFAULT 'active',
  created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_status ON users(status);

-- 插入管理员用户
INSERT INTO users (username, email, password_hash, role)
VALUES ('admin', 'admin@example.com', '$2b$12$...', 'admin')
ON CONFLICT (username) DO NOTHING;

性能调优建议

针对不同硬件配置的推荐参数

SQL Script
-- 查看当前配置
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('shared_buffers', 'effective_cache_size', 'max_connections', 'work_mem');

-- 推荐配置(4GB 内存服务器)
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET effective_cache_size = '3GB';
ALTER SYSTEM SET work_mem = '8MB';
ALTER SYSTEM SET max_connections = '200';
ALTER SYSTEM SET maintenance_work_mem = '256MB';

-- 重新加载配置
SELECT pg_reload_conf();

📖 使用说明文档

PostgreSQL Docker 部署指南

简介

PostgreSQL 是目前功能最强大的开源关系型数据库之一,以其稳定性、功能丰富性和对 SQL 标准的严格遵守而著称。

主要特性

  • ACID 事务:完整的事务支持
  • MVCC:多版本并发控制
  • 丰富的数据类型:支持 JSON、数组、范围类型等
  • 扩展性:通过 PL/pgSQL、Python、Perl 等扩展
  • 高可用:支持流复制、物理/逻辑复制

快速开始

Docker Run 方式

# 最简启动
docker run -d --name postgres -e POSTGRES_PASSWORD=secret postgres:16-alpine

# 自定义配置
docker run -d --name postgres \
  -p 5432:5432 \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16-alpine

# 连接数据库
docker exec -it postgres psql -U admin -d mydb

Docker Compose 方式

环境变量说明

变量名 描述 默认值 是否必填
POSTGRES_USER 超级用户名 postgres 否(建议设置)
POSTGRES_PASSWORD 超级用户密码 -
POSTGRES_DB 默认数据库名 POSTGRES_USER
PGDATA 数据目录 /var/lib/postgresql/data
POSTGRES_INITDB_ARGS initdb 参数 -

持久化存储

重要:PostgreSQL 数据必须持久化,容器重建会丢失数据!

# 创建数据卷
docker volume create pgdata

# 使用数据卷
docker run -d -v pgdata:/var/lib/postgresql/data postgres

初始化脚本

可以将 SQL 初始化脚本放入 docker-entrypoint-initdb.d/ 目录:

# 创建初始化脚本
mkdir init
cat > init/01-init.sql << 'EOF'
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
EOF

# 挂载初始化脚本
docker run -v ./init:/docker-entrypoint-initdb.d/ postgres

性能调优参数

生产环境推荐的配置:

参数 小型服务器 中型服务器 大型服务器
shared_buffers 128MB 256MB-512MB 1GB+
effective_cache_size 512MB 1GB-2GB 4GB+
max_connections 100 100-200 200
work_mem 4MB 8MB 16MB
maintenance_work_mem 64MB 128MB 256MB

常用管理命令

# 进入容器
docker exec -it postgres bash

# 连接 psql
docker exec -it postgres psql -U admin

# 备份数据库
docker exec postgres pg_dump -U admin mydb > backup.sql

# 恢复数据库
cat backup.sql | docker exec -i postgres psql -U admin mydb

# 查看数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));

# 查看活动连接
SELECT * FROM pg_stat_activity;

高可用配置

生产环境建议配置:

  1. 主从复制:流复制或逻辑复制
  2. 定期备份:自动化 pg_dump 或 base backup
  3. 监控:使用 pg_stat_statements、Prometheus
  4. 连接池:使用 PgBouncer

安全建议

  • 使用复杂密码
  • 配置 .pgpass 文件管理凭据
  • 限制网络访问(pg_hba.conf)
  • 启用 SSL/TLS 加密
  • 定期更新 PostgreSQL 版本

🐳 Docker 运行命令

docker run
docker run -d --name postgres -p 5432:5432 -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=mydb -v pgdata:/var/lib/postgresql/data postgres:16-alpine

📁 创建目录结构

mkdir
# 创建 PostgreSQL 目录结构
mkdir -p /opt/postgres/{data,init,backup,logs}
# 初始化数据目录 (可选)
mkdir -p /opt/postgres/data/pgdata

💡 说明:执行以上命令创建容器所需的目录结构,用于数据持久化、配置文件挂载等。

🏗️ 容器构建命令

docker build
# Dockerfile 示例 (自定义配置和扩展)
cat > Dockerfile << 'EOF'
FROM postgres:16-alpine
# 安装常用扩展
RUN apk add --no-cache postgresql-contrib
# 复制初始化脚本
COPY init.sql /docker-entrypoint-initdb.d/
# 复制自定义配置
COPY postgresql.conf /etc/postgresql/postgresql.conf
COPY pg_hba.conf /etc/postgresql/pg_hba.conf
EXPOSE 5432
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
EOF

# 构建镜像
docker build -t my-postgres:16 .

# 运行自定义镜像
docker run -d --name postgres -p 5432:5432 \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  my-postgres:16

💡 说明:如果需要自定义 Dockerfile 构建镜像,使用以上命令。记得替换镜像名称和标签。

🔒 Caddy HTTPS 代理配置

Caddyfile
# PostgreSQL 通常不需要 HTTPS 代理
# 如果需要通过 Web 界面管理 (如 Adminer 或 pgAdmin),可以配置如下:

# Adminer 管理界面
db-admin.your-domain.com {
  reverse_proxy localhost:8080
}

# pgAdmin 管理界面
pgadmin.your-domain.com {
  reverse_proxy localhost:5050
}

💡 说明:

  1. 将以上内容保存为 Caddyfile
  2. 替换 your-domain.com 为实际域名
  3. 修改 localhost:端口 为容器实际端口
  4. 使用 caddy runcaddy start 启动
  5. Caddy 会自动申请和续期 HTTPS 证书

📝 Docker Compose 配置

docker-compose.yml
version: '3.8'
services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres
    restart: unless-stopped
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=${POSTGRES_USER:-admin}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-secret}
      - POSTGRES_DB=${POSTGRES_DB:-mydb}
      - TZ=Asia/Shanghai
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    command: >
      postgres
      -c max_connections=200
      -c shared_buffers=256MB
      -c effective_cache_size=768MB
      -c work_mem=4MB
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-admin}"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - database
volumes:
  pgdata:
networks:
  database:

使用说明:

  1. 将以上内容保存为 docker-compose.yml
  2. 在文件所在目录执行 docker compose up -d
  3. 停止服务:docker compose down

🐙 Podman 兼容

Podman

Podman 是一个开源的容器管理工具,与 Docker CLI 完全兼容。以下是对应的 Podman 命令:

运行容器
podman run
podman run -d --name postgres -p 5432:5432 -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=mydb -v pgdata:/var/lib/postgresql/data postgres:16-alpine
使用 Compose
启动服务:podman compose up -d
停止服务:podman compose down
查看状态:podman compose ps
查看日志:podman compose logs -f

💡 提示:Podman 无需 root 权限运行,更加安全。所有 docker 命令都可以直接替换为 podman

PostgreSQL Docker 部署指南

简介

PostgreSQL 是目前功能最强大的开源关系型数据库之一,以其稳定性、功能丰富性和对 SQL 标准的严格遵守而著称。

主要特性

  • ACID 事务:完整的事务支持
  • MVCC:多版本并发控制
  • 丰富的数据类型:支持 JSON、数组、范围类型等
  • 扩展性:通过 PL/pgSQL、Python、Perl 等扩展
  • 高可用:支持流复制、物理/逻辑复制

快速开始

Docker Run 方式

# 最简启动
docker run -d --name postgres -e POSTGRES_PASSWORD=secret postgres:16-alpine

# 自定义配置
docker run -d --name postgres \
  -p 5432:5432 \
  -e POSTGRES_USER=admin \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16-alpine

# 连接数据库
docker exec -it postgres psql -U admin -d mydb

Docker Compose 方式

环境变量说明

变量名 描述 默认值 是否必填
POSTGRES_USER 超级用户名 postgres 否(建议设置)
POSTGRES_PASSWORD 超级用户密码 -
POSTGRES_DB 默认数据库名 POSTGRES_USER
PGDATA 数据目录 /var/lib/postgresql/data
POSTGRES_INITDB_ARGS initdb 参数 -

持久化存储

重要:PostgreSQL 数据必须持久化,容器重建会丢失数据!

# 创建数据卷
docker volume create pgdata

# 使用数据卷
docker run -d -v pgdata:/var/lib/postgresql/data postgres

初始化脚本

可以将 SQL 初始化脚本放入 docker-entrypoint-initdb.d/ 目录:

# 创建初始化脚本
mkdir init
cat > init/01-init.sql << 'EOF'
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
EOF

# 挂载初始化脚本
docker run -v ./init:/docker-entrypoint-initdb.d/ postgres

性能调优参数

生产环境推荐的配置:

参数 小型服务器 中型服务器 大型服务器
shared_buffers 128MB 256MB-512MB 1GB+
effective_cache_size 512MB 1GB-2GB 4GB+
max_connections 100 100-200 200
work_mem 4MB 8MB 16MB
maintenance_work_mem 64MB 128MB 256MB

常用管理命令

# 进入容器
docker exec -it postgres bash

# 连接 psql
docker exec -it postgres psql -U admin

# 备份数据库
docker exec postgres pg_dump -U admin mydb > backup.sql

# 恢复数据库
cat backup.sql | docker exec -i postgres psql -U admin mydb

# 查看数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));

# 查看活动连接
SELECT * FROM pg_stat_activity;

高可用配置

生产环境建议配置:

  1. 主从复制:流复制或逻辑复制
  2. 定期备份:自动化 pg_dump 或 base backup
  3. 监控:使用 pg_stat_statements、Prometheus
  4. 连接池:使用 PgBouncer

安全建议

  • 使用复杂密码
  • 配置 .pgpass 文件管理凭据
  • 限制网络访问(pg_hba.conf)
  • 启用 SSL/TLS 加密
  • 定期更新 PostgreSQL 版本