银河麒麟v10服务器版Docker部署PostgreSQL 14教程

银河麒麟v10服务器版Docker部署PostgreSQL 14教程

1. 前言

本教程旨在指导用户在银河麒麟v10服务器版上使用Docker容器化技术部署PostgreSQL 14数据库。PostgreSQL是一个功能强大的开源关系型数据库管理系统,具有丰富的特性和良好的可扩展性。

1.1 适用环境

  • 银河麒麟v10服务器版
  • 至少2GB内存(建议4GB以上)
  • 至少10GB可用磁盘空间
  • 网络连接正常

1.2 PostgreSQL 14特性

  • 性能提升:B-tree索引优化、JIT编译增强
  • 安全性增强:透明数据加密(TDE)支持
  • 开发功能:JSON路径查询增强、存储过程改进
  • 高可用性:逻辑复制增强、流复制优化
  • 管理工具:pg_stat_monitor集成、备份恢复改进

2. 系统环境准备

2.1 系统更新

bash 复制代码
# 更新系统软件包到最新版本
sudo yum update -y

2.2 安装必要依赖

bash 复制代码
# 安装wget、curl等必要工具
sudo yum install -y wget curl vim git

3. Docker安装与配置

3.1 安装Docker

bash 复制代码
# 安装Docker所需的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker官方软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker CE、CLI和containerd.io
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动Docker服务
sudo systemctl start docker

# 设置Docker服务开机自启
sudo systemctl enable docker

# 验证Docker安装是否成功
sudo docker --version

3.2 安装Docker Compose

bash 复制代码
# 下载Docker Compose二进制文件
curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 创建软链接到系统PATH
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证Docker Compose安装是否成功
docker-compose --version

3.3 配置防火墙

bash 复制代码
# 启动并启用firewalld服务
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 允许Docker服务通过防火墙
sudo firewall-cmd --permanent --zone=public --add-service=docker

# 允许PostgreSQL端口(5432)通过防火墙
sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp

# 重新加载防火墙规则
sudo firewall-cmd --reload

4. PostgreSQL部署

4.1 创建项目目录结构

bash 复制代码
# 创建PostgreSQL项目目录
sudo mkdir -p /opt/postgresql/data
sudo mkdir -p /opt/postgresql/conf
sudo mkdir -p /opt/postgresql/backup
sudo mkdir -p /opt/postgresql/logs

# 设置目录权限
sudo chmod -R 700 /opt/postgresql/
sudo chown -R 999:999 /opt/postgresql/data/  # PostgreSQL容器默认用户ID为999

4.2 创建PostgreSQL配置文件

bash 复制代码
# 创建postgresql.conf文件
cat > /opt/postgresql/conf/postgresql.conf << EOF
# PostgreSQL configuration file

# 连接设置
listen_addresses = '*'          # 允许所有IP连接
port = 5432                     # PostgreSQL监听端口
max_connections = 100           # 最大连接数

# 内存设置
shared_buffers = 512MB          # 共享内存缓冲区
work_mem = 4MB                  # 每个工作进程的内存
maintenance_work_mem = 128MB    # 维护操作内存

# 磁盘设置
effective_cache_size = 1GB      # 有效缓存大小
random_page_cost = 4.0          # 随机页面读取成本
seq_page_cost = 1.0             # 顺序页面读取成本

# 日志设置
log_destination = 'stderr'      # 日志输出目标
logging_collector = on          # 开启日志收集器
log_directory = '/var/log/postgresql'  # 日志目录
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  # 日志文件名格式
log_rotation_age = 1d           # 日志轮换时间
log_rotation_size = 0           # 日志轮换大小(0表示仅按时间轮换)
log_statement = 'ddl'           # 记录DDL语句

# 性能设置
effective_io_concurrency = 200  # 有效IO并发数
wal_buffers = 16MB              # WAL缓冲区大小
checkpoint_completion_target = 0.9  # 检查点完成目标

# 字符集设置
lc_messages = 'en_US.UTF-8'     # 消息字符集
lc_monetary = 'en_US.UTF-8'     # 货币字符集
lc_numeric = 'en_US.UTF-8'      # 数字字符集
lc_time = 'en_US.UTF-8'         # 时间字符集
default_text_search_config = 'pg_catalog.english'  # 默认文本搜索配置
EOF

# 创建pg_hba.conf文件
cat > /opt/postgresql/conf/pg_hba.conf << EOF
# PostgreSQL Client Authentication Configuration File

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

# IPv4 remote connections:
host    all             all             0.0.0.0/0               md5

# IPv6 local connections:
host    all             all             ::1/128                 trust

# IPv6 remote connections:
host    all             all             ::/0                    md5

# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
host    replication     all             0.0.0.0/0               md5
host    replication     all             ::/0                    md5
EOF

4.3 创建Docker Compose文件

bash 复制代码
# 创建docker-compose.yml文件
cat > /opt/postgresql/docker-compose.yml << EOF
version: '3.8'

services:
  postgresql:
    image: postgres:14-alpine
    container_name: postgresql-14
    restart: always
    environment:
      - POSTGRES_USER=postgres        # 超级用户
      - POSTGRES_PASSWORD=your_secure_password  # 超级用户密码
      - POSTGRES_DB=mydatabase        # 默认数据库
      - PGDATA=/var/lib/postgresql/data/pgdata  # 数据目录
      - TZ=Asia/Shanghai              # 时区设置
    ports:
      - "5432:5432"
    volumes:
      # 数据持久化
      - ./data:/var/lib/postgresql/data
      # 配置文件
      - ./conf/postgresql.conf:/etc/postgresql/postgresql.conf
      - ./conf/pg_hba.conf:/etc/postgresql/pg_hba.conf
      # 日志目录
      - ./logs:/var/log/postgresql
      # 备份目录
      - ./backup:/backup
    networks:
      - postgres-network
    command: postgres -c config_file=/etc/postgresql/postgresql.conf

# 定义网络
networks:
  postgres-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
EOF

4.4 配置环境变量文件(可选)

bash 复制代码
# 创建.env文件
cat > /opt/postgresql/.env << EOF
# PostgreSQL配置
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=mydatabase
PGDATA=/var/lib/postgresql/data/pgdata
TZ=Asia/Shanghai

# 端口配置
POSTGRES_PORT=5432
EOF

5. 启动PostgreSQL容器

5.1 使用Docker Compose启动

bash 复制代码
# 进入项目目录
cd /opt/postgresql

# 使用Docker Compose启动容器
docker-compose up -d

# 查看容器状态
docker-compose ps

# 查看容器日志
docker-compose logs -f

5.2 使用Docker命令直接启动(可选)

bash 复制代码
# 使用docker命令直接启动容器
docker run -d \
  --name postgresql-14 \
  --restart always \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=your_secure_password \
  -e POSTGRES_DB=mydatabase \
  -e PGDATA=/var/lib/postgresql/data/pgdata \
  -e TZ=Asia/Shanghai \
  -p 5432:5432 \
  -v /opt/postgresql/data:/var/lib/postgresql/data \
  -v /opt/postgresql/conf/postgresql.conf:/etc/postgresql/postgresql.conf \
  -v /opt/postgresql/conf/pg_hba.conf:/etc/postgresql/pg_hba.conf \
  -v /opt/postgresql/logs:/var/log/postgresql \
  -v /opt/postgresql/backup:/backup \
  --network postgres-network \
  postgres:14-alpine \
  postgres -c config_file=/etc/postgresql/postgresql.conf

6. PostgreSQL基本使用

6.1 连接到PostgreSQL

bash 复制代码
# 使用psql命令连接到PostgreSQL容器内部
docker exec -it postgresql-14 psql -U postgres

# 或使用宿主机的psql命令(需安装postgresql-client)
# sudo yum install -y postgresql-client
# psql -h localhost -p 5432 -U postgres

6.2 基本SQL操作

sql 复制代码
-- 查看所有数据库
\l

-- 连接到指定数据库
\c mydatabase

-- 查看当前数据库中的所有表
\dt

-- 创建新表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入数据
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO users (name, email) VALUES ('李四', 'lisi@example.com');

-- 查询数据
SELECT * FROM users;

-- 更新数据
UPDATE users SET name = '张三三' WHERE id = 1;

-- 删除数据
DELETE FROM users WHERE id = 2;

-- 退出psql
\q

6.3 创建新用户和数据库

sql 复制代码
-- 创建新用户
CREATE USER myuser WITH PASSWORD 'mypassword';

-- 创建新数据库
CREATE DATABASE mydb;

-- 授予用户数据库权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

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

-- 授予用户所有表权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO myuser;

7. 远程访问配置

7.1 配置PostgreSQL允许远程连接

PostgreSQL容器已经通过配置文件设置了listen_addresses = '*',允许所有IP连接。

7.2 配置防火墙

确保防火墙已经开放5432端口:

bash 复制代码
# 检查防火墙规则
sudo firewall-cmd --list-all

# 如果5432端口未开放,执行以下命令
sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp
sudo firewall-cmd --reload

7.3 使用远程客户端连接

使用PgAdmin、DBeaver等客户端工具连接PostgreSQL:

  • 主机:服务器IP地址
  • 端口:5432
  • 数据库:mydatabase
  • 用户名:postgres
  • 密码:your_secure_password

8. 数据备份与恢复

8.1 备份数据库

bash 复制代码
# 全量备份数据库
docker exec -t postgresql-14 pg_dumpall -c -U postgres > /opt/postgresql/backup/postgres_backup_$(date +%Y%m%d_%H%M%S).sql

# 备份指定数据库
docker exec -t postgresql-14 pg_dump -U postgres -d mydatabase -f /backup/mydatabase_backup_$(date +%Y%m%d_%H%M%S).sql

# 压缩备份
docker exec -t postgresql-14 pg_dump -U postgres -d mydatabase | gzip > /opt/postgresql/backup/mydatabase_backup_$(date +%Y%m%d_%H%M%S).sql.gz

8.2 恢复数据库

bash 复制代码
# 恢复全量备份
docker exec -i postgresql-14 psql -U postgres < /opt/postgresql/backup/postgres_backup.sql

# 恢复指定数据库
docker exec -i postgresql-14 psql -U postgres -d mydatabase < /opt/postgresql/backup/mydatabase_backup.sql

# 恢复压缩备份
gunzip -c /opt/postgresql/backup/mydatabase_backup.sql.gz | docker exec -i postgresql-14 psql -U postgres -d mydatabase

8.3 自动备份脚本

bash 复制代码
# 创建自动备份脚本
cat > /opt/postgresql/backup/auto_backup.sh << EOF
#!/bin/bash

# 备份目录
BACKUP_DIR="/opt/postgresql/backup"

# PostgreSQL容器名称
CONTAINER_NAME="postgresql-14"

# 数据库用户
DB_USER="postgres"

# 备份文件名
BACKUP_FILE="${BACKUP_DIR}/postgres_backup_$(date +%Y%m%d_%H%M%S).sql.gz"

# 创建备份
docker exec -t ${CONTAINER_NAME} pg_dumpall -c -U ${DB_USER} | gzip > ${BACKUP_FILE}

# 删除7天前的备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +7 -delete

echo "PostgreSQL备份完成:${BACKUP_FILE}"
EOF

# 赋予执行权限
chmod +x /opt/postgresql/backup/auto_backup.sh

# 添加定时任务
crontab -e
# 添加以下内容(每天凌晨2点执行备份)
# 0 2 * * * /opt/postgresql/backup/auto_backup.sh > /dev/null 2>&1

9. 开机自启动配置

9.1 Docker容器自启动

docker-compose.yml中已经配置了restart: always,确保容器在退出或Docker服务重启时自动重启。

9.2 配置Docker服务开机自启

bash 复制代码
# 验证Docker服务开机自启设置
sudo systemctl is-enabled docker

# 如果未启用,执行以下命令
sudo systemctl enable docker

9.3 创建systemd服务(可选)

创建systemd服务单元来管理PostgreSQL的Docker Compose服务:

bash 复制代码
# 创建systemd服务文件
cat > /etc/systemd/system/postgresql-14.service << EOF
[Unit]
Description=PostgreSQL 14 Docker Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/postgresql
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

启用并启动该服务:

bash 复制代码
# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用服务开机自启
sudo systemctl enable postgresql-14

# 启动服务
sudo systemctl start postgresql-14

# 验证服务状态
sudo systemctl status postgresql-14

10. 性能优化

10.1 调整PostgreSQL配置

编辑/opt/postgresql/conf/postgresql.conf文件,根据服务器硬件调整以下参数:

bash 复制代码
# 内存设置(建议值)
shared_buffers = 25% of total RAM  # 共享内存缓冲区
effective_cache_size = 50% of total RAM  # 有效缓存大小
work_mem = (shared_buffers / max_connections) * 2  # 每个工作进程的内存

# 连接设置
max_connections = 200  # 根据需要调整

# 检查点设置
checkpoint_completion_target = 0.9  # 检查点完成目标
checkpoint_timeout = 30min  # 检查点超时时间
max_wal_size = 1GB  # 最大WAL大小
min_wal_size = 80MB  # 最小WAL大小

# 日志设置
log_min_duration_statement = 1000  # 记录执行时间超过1秒的语句

重启PostgreSQL容器使配置生效:

bash 复制代码
docker-compose restart

10.2 优化存储

  • 使用SSD存储以提高性能
  • 调整文件系统参数(如ext4的noatime选项)
  • 考虑使用RAID 10配置

10.3 监控PostgreSQL性能

bash 复制代码
# 进入PostgreSQL容器
docker exec -it postgresql-14 psql -U postgres

# 查看性能统计信息
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_database;
SELECT * FROM pg_stat_user_tables;

# 查看锁信息
SELECT * FROM pg_locks;

# 查看长查询
SELECT pid, now() - pg_stat_activity.query_start AS duration, query 
FROM pg_stat_activity 
WHERE pg_stat_activity.query != ''::text 
ORDER BY duration DESC;

# 退出psql
\q

11. 常见问题与故障排除

11.1 端口被占用

bash 复制代码
# 检查端口占用情况
sudo netstat -tuln | grep 5432

# 或使用lsof命令
sudo lsof -i :5432

# 停止占用端口的进程
sudo kill -9 <PID>

11.2 容器启动失败

bash 复制代码
# 查看详细日志
docker-compose logs -f

# 检查配置文件语法
docker exec -it postgresql-14 postgres -c config_file=/etc/postgresql/postgresql.conf -t

11.3 无法远程连接

bash 复制代码
# 检查容器是否正常运行
docker-compose ps

# 检查PostgreSQL是否监听所有IP
docker exec -it postgresql-14 psql -U postgres -c "SHOW listen_addresses;"

# 检查防火墙规则
sudo firewall-cmd --list-all

# 检查pg_hba.conf配置
docker exec -it postgresql-14 cat /etc/postgresql/pg_hba.conf

11.4 权限问题

bash 复制代码
# 检查目录权限
sudo ls -la /opt/postgresql/

# 设置正确的权限
sudo chown -R 999:999 /opt/postgresql/data/
sudo chmod -R 700 /opt/postgresql/

11.5 内存不足

bash 复制代码
# 检查系统内存使用情况
free -h

# 检查容器内存使用情况
docker stats postgresql-14

# 调整PostgreSQL内存配置
# 减小shared_buffers、work_mem等参数

12. 升级PostgreSQL版本

12.1 备份数据

bash 复制代码
# 全量备份数据库
docker exec -t postgresql-14 pg_dumpall -c -U postgres > /opt/postgresql/backup/postgres_full_backup.sql

12.2 停止并删除旧容器

bash 复制代码
# 停止容器
docker-compose down

# 备份数据目录(可选)
sudo cp -r /opt/postgresql/data /opt/postgresql/data_backup

12.3 更新Docker镜像版本

bash 复制代码
# 编辑docker-compose.yml文件,将image改为新版本
# image: postgres:14-alpine 改为 image: postgres:15-alpine

# 重新构建并启动容器
docker-compose up -d

12.4 恢复数据(如果需要)

bash 复制代码
# 如果升级后需要恢复数据
docker exec -i postgresql-14 psql -U postgres < /opt/postgresql/backup/postgres_full_backup.sql

13. 总结

本教程详细介绍了在银河麒麟v10服务器版上使用Docker部署PostgreSQL 14的完整过程,包括:

  1. 系统环境准备和必要依赖安装
  2. Docker和Docker Compose的安装与配置
  3. PostgreSQL 14的部署配置(目录结构、配置文件、Docker Compose)
  4. 容器启动和基本使用
  5. 远程访问配置
  6. 数据备份与恢复
  7. 开机自启动设置
  8. 性能优化
  9. 常见问题与故障排除
  10. 版本升级

通过本教程,您可以快速搭建一个功能完整的PostgreSQL 14数据库服务器,并使用Docker进行容器化部署,享受容器化带来的环境隔离、快速部署和弹性扩展等优势。

14. 参考资料

相关推荐
【上下求索】8 小时前
学习笔记096——Windows postgreSQL-18.1[压缩包版本]
windows·笔记·学习·postgresql
.hopeful.8 小时前
Docker——初识
服务器·docker·微服务·容器·架构
素雪风华8 小时前
只使用Docker+Maven实现全自动化流程部署服务;Docker创建ffmpeg环境;
java·运维·后端·docker·容器·自动化·maven
jingyucsdn8 小时前
将postgresql结构和数据备份成sql语句
数据库·sql·postgresql
你想考研啊8 小时前
k8s使用kubectl报错
java·docker·kubernetes
回忆是昨天里的海9 小时前
记录线上k8s拉取不了阿里云镜像的一次临时处理
阿里云·容器·kubernetes
❀͜͡傀儡师9 小时前
docker 部署 Apache IoTDB
docker·apache·iotdb
运维行者_9 小时前
APM 性能监控是什么?从应用监控与网站监控了解基础概念
网络·数据库·云原生·容器·kubernetes·智能路由器·运维开发
ChristXlx9 小时前
Linux安装MongoDB(虚拟机适用)
linux·mongodb·postgresql