PostgreSQL 数据库安装基于Dockers 以及APT 安装方法

PostgreSQL 安装与配置指南

本文详细介绍两种 PostgreSQL 主流部署方式(Docker Compose 快速部署Ubuntu apt 系统集成部署),涵盖远程连接配置、密码安全设置及 psql 命令行基础语法,步骤附带关键说明与操作截图,兼顾新手友好性与生产环境实用性。

目录

  1. Docker Compose 部署(PostgreSQL 9.6)
  2. Ubuntu apt 部署(PostgreSQL 14)
  3. PostgreSQL 基础语法(psql 命令行)

1. Docker Compose 部署(PostgreSQL 9.6)

通过 Docker 部署可跳过系统依赖安装,快速启动服务,且通过数据卷实现数据持久化(避免容器删除/重启导致数据丢失),适合测试环境或快速搭建场景。

1.1 编写 docker-compose.yml 配置文件

创建 docker-compose.yml 文件,定义镜像、容器参数、数据卷映射等核心配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
postgres:
image: postgres:9.6 # 指定 PostgreSQL 版本(此处为 9.6,可替换为 14/15 等)
container_name: postgres_9.6 # 自定义容器名,便于后续管理(如停止/重启)
volumes:
# 数据卷映射:主机目录 -> 容器内数据存储目录(核心!实现数据持久化)
- /docker/data/postgresql/data:/var/lib/postgresql/data
environment:
POSTGRES_USER: root # 初始化超级用户名(建议自定义,如 pg_admin,避免用 root)
POSTGRES_DB: postgres # 初始化默认数据库名(可自定义,如 test_db)
POSTGRES_PASSWORD: 202019.Lv # 超级用户密码(生产环境需设强密码:大小写+数字+特殊字符)
ports:
- "5432:5432" # 端口映射:主机 5432 端口 -> 容器 5432 端口(PostgreSQL 默认端口)
restart: always # 可选:容器异常退出时自动重启

1.2 启动服务与状态验证

前提条件

已安装 Docker 与 Docker Compose(安装命令参考:sudo apt install docker.io docker-compose)。

执行启动命令

1
2
# 在 docker-compose.yml 所在目录执行,-d 表示后台运行容器
docker-compose up -d

验证服务是否正常运行

1
2
3
4
5
# 查看容器状态,若输出包含 "Up X minutes" 表示启动成功
docker ps | grep postgres_9.6

# 若需查看容器日志(排查启动失败问题)
docker logs postgres_9.6

1.3 远程连接注意事项

远程连接需满足「端口开放+参数正确」,否则会出现“连接超时”或“认证失败”:

远程连接核心步骤

  1. 开放主机端口:确保部署 PostgreSQL 的主机防火墙开放 5432 端口:

    • UFW 防火墙(Ubuntu 默认):sudo ufw allow 5432/tcp && sudo ufw reload
    • firewalld 防火墙(CentOS):sudo firewall-cmd --add-port=5432/tcp --permanent && sudo firewall-cmd --reload
  2. 填写连接参数:远程工具(如 Navicat、DBeaver、DataGrip)需输入以下信息:

    • 主机 IP:部署 PostgreSQL 的服务器公网/内网 IP
    • 端口:5432(与配置文件中映射端口一致)
    • 用户名:root(配置文件中 POSTGRES_USER 定义)
    • 密码:202019.Lv(配置文件中 POSTGRES_PASSWORD 定义)
    • 数据库名:postgres(配置文件中 POSTGRES_DB 定义的初始数据库)

远程连接界面参考

PostgreSQL 远程连接基本设置界面
图1:PostgreSQL 远程连接基本设置(以 Navicat 为例)

PostgreSQL 远程连接参数配置详情
图2:PostgreSQL 远程连接高级参数配置(如超时时间、SSL 选项)

2. Ubuntu apt 部署(PostgreSQL 14)

通过 Ubuntu 官方 apt 源安装,可将 PostgreSQL 集成到系统服务,适合生产环境或需长期稳定运行的场景(默认自动开机启动)。

2.1 安装 PostgreSQL 服务

执行安装命令

1
2
sudo apt-get update  # 更新本地 apt 包索引,确保获取最新版本
sudo apt-get install postgresql postgresql-client # 安装服务端与客户端工具

安装后默认状态(关键信息)

  • 自动创建系统用户 postgres(与 PostgreSQL 超级用户同名,无密码);
  • PostgreSQL 超级用户 postgres 初始密码为空(需手动设置);
  • 服务默认启动,监听本地 5432 端口(仅允许本机访问,远程需配置)。

2.2 进入 PostgreSQL 命令行(psql)

psql 是 PostgreSQL 自带的命令行工具,需通过系统用户 postgres 进入(权限隔离机制):

1
2
3
4
5
# 步骤1:切换到系统用户 postgres(无需密码,Ubuntu 权限机制)
sudo -i -u postgres

# 步骤2:进入 psql 命令行(成功后提示符变为「postgres=#」)
psql

命令行界面参考

PostgreSQL psql 命令行进入界面
图3:通过 sudo -i -u postgres + psql 进入命令行界面

2.3 配置远程连接(允许外部访问)

默认仅允许本地访问,需修改两个核心配置文件(路径与版本相关),步骤如下:

步骤1:确定配置文件路径(关键!与版本绑定)

先查看 PostgreSQL 版本,确保后续路径正确:

1
psql -V  # 示例输出:psql (PostgreSQL) 14.9 → 版本号为 14

配置文件默认路径格式:/etc/postgresql/<版本号>/main/(本文版本为 14,路径为 /etc/postgresql/14/main/)。

版本查看参考:
PostgreSQL 版本查看界面
图4:通过 psql -V 命令查看 PostgreSQL 版本

步骤2:修改 postgresql.conf(允许监听所有地址)

该文件控制服务网络监听配置,需开启“允许外部地址访问”:

1
2
# 编辑配置文件(替换 14 为实际版本号)
sudo vim /etc/postgresql/14/main/postgresql.conf

在 vim 中按 Esc + 输入 /listen_addresses 快速搜索配置项,修改为:

1
2
# 原配置:listen_addresses = 'localhost'  # 仅监听本地回环地址(127.0.0.1)
listen_addresses = '*' # 改为监听所有网络地址(允许外部主机访问)

保存退出:按 Esc → 输入 :wq → 按回车。

配置修改参考:
PostgreSQL postgresql.conf 修改界面
图5:修改 postgresql.conf 中的 listen_addresses 参数

步骤3:修改 pg_hba.conf(配置访问控制规则)

该文件控制“哪些主机、用户可以访问哪些数据库”,需将“本地认证”改为“密码认证”:

1
2
# 编辑访问控制文件(替换 14 为实际版本号)
sudo vim /etc/postgresql/14/main/pg_hba.conf

找到 IPv4 和 IPv6 本地连接规则,替换为以下内容(关键是将 peer 改为 md5):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 本地 Unix 套接字连接(默认配置,无需修改,适用于本机命令行)
local all postgres peer
local all all peer

# 2. IPv4 连接规则:允许所有 IPv4 地址通过密码认证访问(生产环境需限制 IP 段)
# 示例:192.168.1.0/24 → 仅允许内网 192.168.1.x 网段访问
host all all 0.0.0.0/0 md5

# 3. IPv6 连接规则:允许所有 IPv6 地址通过密码认证访问
host all all ::1/128 md5

# 4. 复制连接配置(用于主从复制,按需保留,默认微调为密码认证)
local replication all peer
host replication all 0.0.0.0/0 md5
host replication all ::1/128 scram-sha-256

参数含义解释(避免误改):

列1 列2(数据库) 列3(用户) 列4(主机IP段) 列5(认证方式)
local 表示 Unix 套接字连接(仅本机) - - -
host 表示 TCP/IP 连接(远程访问需此类型) - - -
all 允许访问所有数据库 允许所有用户 - -
0.0.0.0/0 所有 IPv4 地址(生产环境建议限制为具体网段,如 192.168.1.0/24) - -
md5 密码通过 MD5 加密传输(安全,替代 peer 本地用户认证) - -

步骤4:重启服务使配置生效

修改配置后需重启服务,否则不生效:

1
2
sudo systemctl restart postgresql  # 重启 PostgreSQL 服务
sudo systemctl status postgresql # 验证服务状态(需显示「active (running)」)

服务状态验证参考:
PostgreSQL 服务重启状态验证
图6:重启后通过 systemctl status 确认服务正常运行

2.4 修改超级用户(postgres)密码

初始密码为空,存在安全风险,需立即设置强密码:

1
2
3
4
5
6
7
8
9
10
# 步骤1:进入 psql 命令行(参考 2.2 步骤)
sudo -i -u postgres
psql

# 步骤2:执行 SQL 命令修改密码(分号「;」不可省略!)
ALTER USER postgres WITH PASSWORD '202019'; # 替换为自定义强密码(如 Pg@2024!)

# 步骤3:退出 psql 并重启服务(确保密码生效)
\q # 退出 psql 命令行
sudo systemctl restart postgresql # 重启服务

密码修改参考:
PostgreSQL 密码修改 SQL 执行界面
图7:在 psql 中执行 ALTER USER 命令修改超级用户密码

2.5 开放防火墙端口(远程连接必备)

Ubuntu 若启用 UFW 防火墙,需手动开放 5432 端口(否则远程工具无法连接):

1
2
3
sudo ufw allow 5432/tcp  # 允许 TCP 协议通过 5432 端口
sudo ufw reload # 重新加载防火墙规则
sudo ufw status # 验证端口是否开放(需显示「5432/tcp ALLOW Anywhere」)

兼容提示:若主机使用 firewalld(如 CentOS/RHEL),执行以下命令开放端口:

1
2
sudo firewall-cmd --add-port=5432/tcp --permanent  # 永久开放端口
sudo firewall-cmd --reload # 重载规则使配置生效

3. PostgreSQL 基础语法(psql 命令行)

psql 支持两种命令:SQL 命令(需以分号结尾)和 psql 系统命令(以反斜杠 \ 开头,无需分号)。

3.1 进入与退出 psql

1
2
3
4
5
6
7
8
9
# 方式1:分步操作(权限明确,推荐)
sudo -i -u postgres # 切换到系统用户 postgres
psql # 进入 psql 命令行(提示符:postgres=#)

# 方式2:一步操作(快捷)
sudo -u postgres psql

# 退出 psql 命令行(返回系统终端)
\q

3.2 常用基础命令(psql 系统命令)

命令 功能描述 示例
\l 列出所有数据库 postgres=# \l
\c 数据库名 切换到指定数据库 postgres=# \c test_db
\d 列出当前数据库的所有表/视图 test_db=# \d
\d 表名 查看指定表的结构(字段、类型、约束等) test_db=# \d user_info
\du 列出所有用户(角色) postgres=# \du
\q 退出 psql 命令行 postgres=# \q
\h 查看 SQL 命令帮助(如 \h ALTER TABLE postgres=# \h ALTER TABLE

3.3 常用 SQL 命令(基础操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- 1. 创建数据库(示例:创建 test_db 数据库)
CREATE DATABASE test_db;

-- 2. 创建用户并授权(示例:创建用户 test_user,密码 Test@123,授权访问 test_db)
CREATE USER test_user WITH PASSWORD 'Test@123';
GRANT ALL PRIVILEGES ON DATABASE test_db TO test_user;

-- 3. 创建表(示例:在 test_db 中创建 user_info 表)
\c test_db; -- 先切换到 test_db 数据库
CREATE TABLE user_info (
id SERIAL PRIMARY KEY, -- 自增主键
name VARCHAR(50) NOT NULL, -- 姓名(非空)
age INT, -- 年龄
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间(默认当前时间)
);

-- 4. 插入数据
INSERT INTO user_info (name, age) VALUES ('张三', 25), ('李四', 30);

-- 5. 查询数据
SELECT * FROM user_info;

-- 6. 更新数据
UPDATE user_info SET age = 26 WHERE name = '张三';

-- 7. 删除数据
DELETE FROM user_info WHERE name = '李四';

常见问题排查提示

  1. 远程连接超时:检查主机防火墙是否开放 5432 端口、listen_addresses 是否设为 *
  2. 认证失败:检查用户名/密码是否正确、pg_hba.conf 中认证方式是否为 md5
  3. 服务启动失败:查看日志排查(日志路径:/var/log/postgresql/postgresql-14-main.log,替换 14 为实际版本)。

以上为 PostgreSQL 两种部署方式的完整流程,可根据实际场景(测试/生产、快速搭建/系统集成)选择对应方案,配置时需注意密码安全与端口访问控制,避免暴露风险。