使用Docker Compose部署PostgreSQL:从入门到实践

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 相关指南。

相关推荐
Tummer83632 小时前
从 Docker 到 Kubernetes:容器编排的工程化实践指南
docker·容器·kubernetes
曹天骄3 小时前
在 Docker 容器中控制宿主机 Docker:DoD 与 DinD 的技术原理解析
docker·容器·eureka
萝卜特福3 小时前
Spring Boot 项目 Docker 部署全流程实操笔记
docker
国思RDIF框架3 小时前
Docker Compose多后端+多前端部署:日志集中管理实操指南(基础版+进阶版,亲测可用)
docker·容器·自动化运维
what丶k3 小时前
Docker 进阶指南:从入门能用,到生产环境稳、快、安全的核心实践与底层原理
后端·docker·容器
Bruce_Liuxiaowei3 小时前
在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程
macos·docker·容器·openclaw
果壳~4 小时前
Docker镜像离线迁移:从下载到本地部署完整实战指南
运维·docker·容器
mi20064 小时前
Linux下安装postgresql记录
数据库·postgresql
sunshinebo5 小时前
一次 GitLab 无法启动的排查:Docker 日志把 500G 磁盘打满
docker·eureka·gitlab