PostgreSQL 是一款功能强大的开源关系型数据库,因其稳定性、扩展性和对SQL标准的严格遵循而广受开发者青睐。本文将指导你通过Docker Compose快速部署一个生产可用的PostgreSQL实例,并提供必要的配置建议和注意事项。
1. PostgreSQL 核心特性
开源与跨平台:遵循PostgreSQL许可证,可免费使用、修改和分发。
高度兼容SQL标准:支持复杂的查询、外键、触发器、视图和事务(ACID)。
丰富的数据类型:除基础类型外,支持JSON/JSONB、数组、范围类型等,适合现代应用开发。
扩展性:可通过插件(如PostGIS)扩展地理空间功能,支持自定义函数和数据类型。
并发控制:采用多版本并发控制(MVCC),读写互不阻塞,保证高并发下的性能。
可靠性:拥有完善的崩溃恢复、时间点恢复(PITR)和复制功能,适合生产环境。
2. 推荐稳定版本
PostgreSQL 每年发布一个主要版本,每个版本会持续获得5年的修复支持。目前推荐的稳定版本为:
PostgreSQL 16(最新稳定版,2023年发布,性能优化明显)
PostgreSQL 15(成熟稳定,已广泛用于生产)
PostgreSQL 14(仍在支持期内,适合对兼容性要求较高的旧系统)
对于新项目,建议直接使用 PostgreSQL 16;若追求长期稳定性,可选用 PostgreSQL 15。本文示例将以 postgres:15 为例。
3. 安装 Docker(如未安装)
如果你尚未安装 Docker,可以使用以下一键安装脚本(适用于 Linux 系统):
bash
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
sudo systemctl start docker
sudo systemctl enable docker
安装完成后,验证 Docker 是否成功:
bash
docker --version
docker-compose --version # 如果提示未安装,可单独安装 docker-compose 插件
注意:Windows 和 macOS 用户请直接从 Docker 官网 下载 Docker Desktop 安装。
4. 安装docker-compose (如未安装)
bash
sudo curl -L "https://1ms.run/install/docker-compose/latest/$(uname -s)/$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
5. 配置镜像源
Linux
- 发行版:Ubuntu, Debian, CentOS, RHEL, Fedora, Arch Linux 等 架构:x86_64
(amd64), ARM64 (aarch64) 容器运行时:Docker, Podman, Containerd (K8s/K3s)
安装方式:
bash
curl-sSL https://static.1ms.run/1ms-helper/install.sh |bash
macOS
- 版本支持:macOS 10.15+ (Catalina 及更高版本) 架构:Intel (x86_64) 和 Apple Silicon
(ARM64) 容器运行时:Docker Desktop, Podman Machine
安装方式:
bash
curl-sSL https://static.1ms.run/1ms-helper/install.sh |bash
Windows
- 版本支持:Windows 10/11, Windows Server 2019/2022 架构:x86_64 (amd64), ARM64
容器运行时:Docker Desktop, Podman 安装方式:
以管理员身份运行 PowerShell
bash
irm https://static.1ms.run/1ms-helper/install.ps1 |iex
6. 使用 Docker Compose 部署 PostgreSQL
6.1 基础版 docker-compose.yml
创建一个项目目录,
其中新建 pg_data 目录
并在其中新建 docker-compose.yml 文件,内容如下:
yaml
version: "3.9"
services:
postgres:
image: docker.1ms.run/postgres:15 # 官方镜像,稳定轻量
container_name: postgres_sql
restart: unless-stopped
environment:
POSTGRES_DB: db_name # 初始化数据库名
POSTGRES_USER: db_super_name # 超级用户名
POSTGRES_PASSWORD: db_password # 密码
TZ: Asia/Shanghai # 容器时区
ports:
- "5432:5432"
volumes:
- ./pg_data:/var/lib/postgresql/data # 数据持久化
# - ./init:/docker-entrypoint-initdb.d # 如需自动执行初始化脚本,可放开
networks:
- pg_net
volumes:
pg_data:
networks:
pg_net:
driver: bridge
6.2 启动服务
在 docker-compose.yml 所在目录执行:
bash
docker-compose up -d
查看运行状态:
bash
docker-compose ps
连接测试(使用容器内 psql):
bash
docker exec -it postgres_db psql -U admin -d myapp
停止并移除容器(数据卷保留):
bash
docker-compose down
若需同时删除数据卷(谨慎操作):
bash
docker-compose down -v
7. 注意事项
7.1 安全加固
修改默认密码:生产环境务必使用强密码,可通过环境变量或 .env 文件传入。
限制端口暴露:如果数据库只供本机应用访问,可将 ports 部分改为 127.0.0.1:5432:5432,避免公网访问。
使用自定义网络:避免将数据库端口映射到宿主机,而是让应用容器与数据库容器在同一网络内通信。
7.2 数据持久化
必须通过 volumes 将容器内的 /var/lib/postgresql/data 挂载到宿主机或命名卷,否则容器删除后数据将丢失。
定期备份数据,可使用 pg_dump 或文件系统快照。
7.3 性能调优
根据宿主机内存调整 PostgreSQL 参数(如 shared_buffers、work_mem),可在 docker-compose.yml 中通过 command 或挂载自定义配置文件实现。
若需大量连接,可增加 max_connections 值,但需注意内存消耗。
7.4 版本固定
镜像标签使用明确版本(如 postgres:15),避免使用 latest 导致意外升级。
7.5 日志管理
默认日志会输出到容器标准输出,可通过 docker-compose logs 查看。建议配置日志轮转或限制日志大小,避免磁盘占满。
8. 总结
通过 Docker Compose 部署 PostgreSQL 可以极大简化环境搭建和维护工作,同时保证环境一致性。本文提供的模板覆盖了基础部署需求,你可根据实际项目添加 pgAdmin、备份服务等额外组件。如果在使用过程中遇到问题,欢迎查阅 PostgreSQL 官方文档 或 Docker 相关指南。