在过去十多年里,MySQL 一直是 Web 开发的首选数据库,尤其是在 LAMP(Linux + Apache + MySQL + PHP)架构盛行的年代。但近年来MySQL 被 Oracle 公司主导,许可证改为 GPL v2 协议,越来越多的企业和开发团队选择 PostgreSQL 作为核心数据库。
在这篇文章中,我们将介绍如何利用 Docker Compose 快速部署 PostgreSQL 数据库,并结合其他常见数据库系统进行对比,帮助你更好地理解 PostgreSQL 的优势和适用场景。
1. PostgreSQL 简介
PostgreSQL(简称 Postgres)是一个功能强大的开源对象关系型数据库(ORDBMS)。它具备以下特点:
- 符合标准:几乎完整实现了 SQL:2011 标准,支持事务(ACID)。
- 功能丰富:支持 JSON、数组、地理空间数据(PostGIS 扩展)等复杂数据类型。
- 高扩展性:允许用户定义函数、数据类型和索引方式。
- 社区活跃:Postgres 社区提供了大量第三方扩展,例如全文检索、逻辑复制、时序数据优化等。
因此,PostgreSQL 不仅适合传统业务应用,还广泛应用于金融、电信、GIS、大数据分析等复杂领域。
2. 常见数据库系统对比
在选择数据库时,开发者往往会在 PostgreSQL、MySQL、MariaDB等数据库之间权衡。下面从 开源协议、特性、适用场景 三方面做对比:
数据库 | 开源协议 | 优势 | 劣势 | 典型场景 |
---|---|---|---|---|
PostgreSQL | PostgreSQL License(类似 MIT,非常宽松) | – 完整 ACID 支持,事务一致性极强 – SQL 标准兼容度最高 – 支持复杂查询(窗口函数、CTE、物化视图) – 丰富数据类型:JSONB、数组、地理空间、UUID、自定义类型 – 可扩展性强,支持插件(PostGIS、TimescaleDB、Citus) – 强大的索引机制(GIN、BRIN、Partial Index) | – 相比 MySQL,简单读写性能略逊 – 对运维/调优要求高 – 社区生态不如 MySQL 丰富 | 金融、电信、GIS、大数据分析、企业级核心系统 |
MySQL | GPLv2(由 Oracle 掌控,部分特性需商业授权) | – 学习曲线低,生态庞大 – LAMP 架构下事实标准 – InnoDB 引擎具备事务支持 – 轻量级 Web 系统中读写性能优良 – 部署简单,第三方工具丰富 | – SQL 标准兼容性不足(事务性 DDL、CHECK 约束等实现不完整) – 分布式、复杂查询支持较差 – 被 Oracle 控制,商业化风险高 | 中小型 Web 应用、CMS、电商网站 |
MariaDB | GPLv2(MySQL 社区分支,100%开源) | – 保持 MySQL 兼容 – 更开放透明,功能迭代快 – 引擎多样化(Aria、ColumnStore、Spider) – 适合作为 MySQL 替代品 | – 社区活跃度略低于 MySQL – 市场份额远不及 PostgreSQL/MySQL – 部分第三方工具对 MariaDB 支持不足 | MySQL 替代方案,希望保持完全开源的企业 |
Oracle | 商业授权(闭源) | – 功能最全面:分区、并行查询、分布式事务 – 强大的优化器和安全机制 – 大规模企业应用事实标准 – 提供完善的商业支持 | – 高昂授权费用 – 学习曲线陡峭 – 厂商锁定严重,迁移成本极高 | 核心金融系统、电信运营商、跨国企业核心数据库 |
SQL Server | 商业授权(部分版本提供免费 Express) | – 与微软生态集成度高 – 强大的 BI/分析工具支持 – 事务和并发控制良好 – 商业文档与支持丰富 | – 授权费用高 – 主要运行在 Windows 生态,跨平台弱 – 社区生态不如 PostgreSQL/MySQL | 中小企业、与微软技术栈结合的业务系统 |
从协议角度看,PostgreSQL 使用 PostgreSQL License,这是一种非常宽松的开源协议,允许自由使用、修改和分发,避免了商业授权纠纷。这也是 PostgreSQL 在商业应用中被广泛采用的原因之一。
3. 使用 Docker 快速部署 PostgreSQL
3.1 创建项目目录
Bash
mkdir postgresql
cd postgresql
3.2 编写 docker-compose.yml
在 postgresql
目录下新建 docker-compose.yml
文件:
Bash
version: "3.9"
services:
postgres_db:
image: postgres:18.0
container_name: postgres
restart: always
shm_size: 128mb # 推荐设置共享内存大小
environment:
POSTGRES_USER: postgres # 可选,默认就是 postgres
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: myappdb # 可选,默认和 POSTGRES_USER 相同
# PGDATA: /var/lib/postgresql/18/docker # 18.x 开始默认 PGDATA 路径变化,可自行指定
ports:
- "5432:5432"
volumes:
- /data/postgres/data:/var/lib/postgresql
# 如果你启用了 logging_collector,可以挂载日志目录
#- /data/postgres/log:/var/log/postgresql
logging:
options:
max-size: "10m"
max-file: "3"
adminer:
image: adminer
restart: always
ports:
- "8080:8080"
Bash
docker compose up -d
docker compose ps
这里我额外加了一个 adminer
服务(轻量版 Web UI)。
启动后访问 http://localhost:8080
,可以在浏览器里管理 PostgreSQL 数据库。
🛠️ 使用方法
- 启动服务:
docker compose up -d
- 查看容器状态:
docker compose ps
- 使用 psql 进入容器:
docker exec -it postgres psql -U postgres -d myappdb
- 浏览器访问:
http://localhost:8080
- System: PostgreSQL
- Server: postgres_db (或 localhost)
- Username: postgres
- Password: mysecretpassword
- Database: myappdb
📌 总结:优势与劣势对比
- PostgreSQL → 最强的 SQL 标准兼容性、扩展性和复杂查询能力,适合企业级、金融、大数据、GIS 场景。缺点是学习曲线和运维复杂度较高。
- MySQL → 上手简单、生态广、Web 应用事实标准,但功能相对有限、被 Oracle 控制,未来存在不确定性。
- MariaDB → MySQL 的纯开源替代品,功能不断增强,但市场份额与生态较弱。
- Oracle/SQL Server → 功能最强、商业支持好,但昂贵且有厂商锁定,更多用于大型传统企业。
View Comments