银河麒麟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的完整过程,包括:
- 系统环境准备和必要依赖安装
- Docker和Docker Compose的安装与配置
- PostgreSQL 14的部署配置(目录结构、配置文件、Docker Compose)
- 容器启动和基本使用
- 远程访问配置
- 数据备份与恢复
- 开机自启动设置
- 性能优化
- 常见问题与故障排除
- 版本升级
通过本教程,您可以快速搭建一个功能完整的PostgreSQL 14数据库服务器,并使用Docker进行容器化部署,享受容器化带来的环境隔离、快速部署和弹性扩展等优势。