使用 Docker 快速搭建 PostgreSQL 数据库

在过去十多年里,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等数据库之间权衡。下面从 开源协议、特性、适用场景 三方面做对比:

数据库开源协议优势劣势典型场景
PostgreSQLPostgreSQL License(类似 MIT,非常宽松)– 完整 ACID 支持,事务一致性极强
– SQL 标准兼容度最高
– 支持复杂查询(窗口函数、CTE、物化视图)
– 丰富数据类型:JSONB、数组、地理空间、UUID、自定义类型
– 可扩展性强,支持插件(PostGIS、TimescaleDB、Citus)
– 强大的索引机制(GIN、BRIN、Partial Index)
– 相比 MySQL,简单读写性能略逊
– 对运维/调优要求高
– 社区生态不如 MySQL 丰富
金融、电信、GIS、大数据分析、企业级核心系统
MySQLGPLv2(由 Oracle 掌控,部分特性需商业授权)– 学习曲线低,生态庞大
– LAMP 架构下事实标准
– InnoDB 引擎具备事务支持
– 轻量级 Web 系统中读写性能优良
– 部署简单,第三方工具丰富
– SQL 标准兼容性不足(事务性 DDL、CHECK 约束等实现不完整)
– 分布式、复杂查询支持较差
– 被 Oracle 控制,商业化风险高
中小型 Web 应用、CMS、电商网站
MariaDBGPLv2(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 数据库。

🛠️ 使用方法

  1. 启动服务: docker compose up -d
  2. 查看容器状态: docker compose ps
  3. 使用 psql 进入容器: docker exec -it postgres psql -U postgres -d myappdb
  4. 浏览器访问: 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 → 功能最强、商业支持好,但昂贵且有厂商锁定,更多用于大型传统企业。
ESXi 6.7/7.0/8.0配置GPU/硬盘直通 Git 代码备忘录 使用 pyrasite-ng 劫持 Python 实现任意代码注入
View Comments
There are currently no comments.