别再用笨方法装数据库了!Docker跑PostgreSQL真香
Docker安装PGSQL
PostgreSQL是什么?
PostgreSQL是一款开源企业级对象关系型数据库,自带 psql 命令行终端、pgAdmin 图形化管理、pgbench 性能压测等配套工具,支持标准 SQL、ACID 事务与 MVCC 多版本并发,兼容 JSON、地理空间等丰富数据类型,可拓展插件生态,适配开发运维、数据仓储、高并发业务及 GIS 等复杂场景,跨平台且稳定可扩展,是后端与大数据领域常用的高性能数据库工具。
PGSQL数据库特点:
开源免费,遵循 BSD 协议,无商业使用授权风险
支持标准 SQL并深度扩展,兼容主流 SQL 语法
具备事务 ACID 特性,支持 MVCC(多版本并发控制),读写不阻塞
支持丰富数据类型:JSON/JSONB、数组、几何类型、枚举、范围类型等
拥有强大扩展性:支持自定义函数、存储过程、索引类型、插件
支持多种高级索引:B-tree、哈希、GIN、GiST、SP-GiST、BRIN
具备高可用与容灾能力:流复制、主从架构、集群部署
支持存储过程与触发器,兼容 PL/pgSQL、Python、Perl 等多种语言
支持分区表(范围 / 列表 / 哈希分区),适配海量数据存储
支持全文检索,无需依赖第三方组件即可实现文本搜索
跨平台运行:Linux、Windows、macOS 等主流系统均支持
企业级特性:支持视图、物化视图、外键、约束、事务保存点
稳定性高,适合高并发、大数据量的生产环境
生态完善,拥有大量第三方插件(PostGIS、pg_stat_statements 等)
安装部署
以PGSQL16为例,安装数据库
1、创建本地目录
mkdir -p /opt/pgsql
cd pgsql
2、Docker Compose配置
services:
postgres16:
image: postgres:16.13-alpine
container_name: postgres-v16
restart: always
ports:
- "15432:5432"
environment:
POSTGRES_PASSWORD: "123456"
POSTGRES_USER: "root"
POSTGRES_DB: "mydb"
TZ: "Asia/Shanghai"
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
volumes:
# 使用命名磁盘卷挂载数据目录(推荐方式)
- postgres_data:/var/lib/postgresql/data
networks:
- pgsql-network
networks:
pgsql-network:
driver: bridge
# 声明命名卷(Docker 自动管理,数据持久化不丢失)
volumes:
postgres_data:
参数说明:
1、数据库管理员账户/密码
POSTGRES_PASSWORD: "123456" # postgres超级用户密码(替换为你的密码)
POSTGRES_USER: "root" # 默认超级用户名,可自定义(如myuser)
2、时区设置
# 可选:设置时区(避免数据库时间与宿主机不一致)
TZ: "Asia/Shanghai"
启停命令:
# 启动
docker compose up -d
# 停止
docker compose down
# 查看数据卷(确认创建成功)
docker volume ls
3、Docker 启动容器命令
下载docker镜像:
docker pull postgres:16.13-alpine
创建启动数据库容器:
# 1. 创建自定义网络(只需要第一次执行)
docker network create pgsql-network
# 2. 创建数据卷(只需要第一次执行)
docker volume create postgres_data
# 3. 启动 PostgreSQL 容器(核心命令)
docker run -d
--name postgres-v16
--restart always
--net pgsql-network
-p 15432:5432
-e POSTGRES_PASSWORD="123456"
-e POSTGRES_USER="root"
-e POSTGRES_DB="mydb"
-e TZ="Asia/Shanghai"
-e POSTGRES_INITDB_ARGS="--encoding=UTF8 --lc-collate=C --lc-ctype=C"
-v postgres_data:/var/lib/postgresql/data
postgres:16.13-alpine
PGSQL16教程及使用技巧
1、连接PGSQL数据库
数据库基础信息
宿主机IP:192.168.50.20
宿主机端口:15432
数据库账号:root
数据库密码:123456
默认库:mydb
数据库类型:PostgreSQL
以Navicat客户端为例:
打开 Navicat,左上角 文件 → 新建连接 → 选择 PostgreSQL 点击下一步

数据库设置面板填写:
连接名:自定义(如本地PG16)
主机 / IP 地址:服务器IP:192.168.50.20/服务区域名
端口:15432
初始数据库:mydb
用户名:root
密码:123456

点击 测试连接,提示连接成功后,点击确定保存。
双击左侧新建的连接,即可展开 mydb 数据库,正常建表、写 SQL、管理数据。
注意:防火墙不用额外设置,是本地端口映射,局域网其他设备连接填宿主机 IP+15432即可。
2、PGSQL使用技巧
1)创建数据库 / 用户
-- 新建数据库
CREATE DATABASE testdb;
-- 新建普通用户
CREATE USER testuser WITH PASSWORD '123456';
-- 授权数据库给用户
GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
2)数据类型
比 MySQL 更强的类型:
JSON/JSONB:适合存 JSON 数据,支持索引、快速检索
数组类型:直接存数组,无需拆表
地理空间类型:自带 GIS 坐标、距离计算
PGSQL支持的数据库类型:
分类数据类型使用场景整数类型smallint小整型,范围 -32768 ~ 32765,节省存储空间integer / int标准整型bigint大整型,主键、雪花 ID、大数值必用serial自增整型,等价 int 自增bigserial自增大整型,推荐做主键自增高精度数值numeric / decimal高精度定点数,金额、财务必备,无精度丢失浮点类型real单精度浮点数double precision双精度浮点数,非精密小数可用字符类型char(n)固定长度字符串,不足补空格varchar(n)可变长度字符串,限定长度,日常字段常用text无限长文本,文章、备注、大文本存储布尔类型boolean布尔值:true /false/null,状态标记日期时间date仅日期:年 - 月 - 日time仅时间:时:分: 秒timestamp日期 + 时间,不带时区timestamptz带时区时间,跨时区业务首选interval时间间隔,用于时间差值计算JSON 类型json仅存储,不适合索引查询jsonb二进制 JSON,支持索引、检索,生产推荐网络地址inetIPv4/IPv6 地址存储cidr网段地址macaddr物理 MAC 地址数组类型任意类型 []如 int []、text [],可直接存数组,无需拆中间表二进制类型bytea存储二进制文件、图片字节流唯一标识uuid全局唯一 ID,分布式系统做主键几何类型point / line / box / polygon点位、线条、多边形等地理几何基础类型地理空间geometry平面地理坐标,GIS、地图业务geography球面地理坐标,经纬度距离计算范围类型int4range / daterange / tsrange整数、日期、时间区间范围,适用于时段预约、区间匹配枚举类型enum自定义枚举,固定业务状态(订单状态、性别等)
3)分页查询
SELECT * FROM 表名 ORDER BY id LIMIT 10 OFFSET 0;
4)主键自增
-- 建表自增主键
CREATE TABLE t_user (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INT
);
5)JSONB 字段查询
SELECT * FROM t_user WHERE info->>'phone' = '13800138000';
6)查看数据库日志
docker logs -f postgres-v16
附:
PGSQL还是MYSQL?
MySQL:
做网站、后台、小程序、电商、普通业务系统
团队技术栈偏轻量
追求简单、稳定、运维成本低
PostgreSQL :
需要 JSON、数组、GIS、复杂查询
金融、财务、数据严谨性要求高
希望一张表搞定复杂结构,少拆表
未来业务可能变复杂
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
