本笔记记录了如何使用 Docker 容器化地安装 PostgreSQL 数据库服务。通过容器化,我们可以轻松地在不同环境中启动一个隔离且配置一致的 PostgreSQL 实例。
为什么选择 Docker 安装 PostgreSQL?
-
环境隔离: 与宿主机环境的隔离,避免依赖冲突。
-
快速启动: 几秒钟内即可拉取镜像并启动。
-
版本管理: 轻松切换不同版本的 PostgreSQL。
-
可移植性: 部署脚本(如 Docker Compose)在任何支持 Docker 的环境中都可运行。
核心部署策略:使用 Docker Compose
对于开发环境或简单的单机部署,Docker Compose 是最便捷的方式。
docker-compose.yml 示例
services:
postgres:
image: postgres
container_name: postgres
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro # 保持容器时间与宿主机一致
- /etc/timezone:/etc/timezone:ro # 保持容器时间与宿主机一致
- /fs/1000/ftp/docker/postgres/db_data:/var/lib/postgresql/data # 默认数据目录
ports:
- "5434:5432"
environment:
POSTGRES_PASSWORD: Postgres12#$
POSTGRES_DB: n8n
TZ: Asia/Shanghai # 设置时区,例如上海时区
# 健康检查:确保数据库服务真正可用
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] # 或者 pg_isready -U postgres
interval: 10s # 每 10 秒检查一次
timeout: 5s # 每次检查的超时时间为 5 秒
retries: 5 # 失败 5 次后认为服务不健康
start_period: 30s # 启动后等待 30 秒再开始健康检查 (给PostgreSQL足够时间启动)
# 共享内存配置,对于PostgreSQL很重要,尤其是在运行大型查询时
shm_size: 256mb # 建议256mb或更高
如何运行: 在包含上述 docker-compose.yml 文件的目录下,执行 docker compose up -d 命令。
关键配置解析:
- 镜像选择 (
image: postgres:16-alpine): 优先选择alpine版本,体积小,启动快。指定具体版本号,避免不兼容性。 - 环境变量 (
environment):POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD是必不可少的,用于初始化数据库。 - 数据持久化 (
volumes):postgres_data:/var/lib/postgresql/data至关重要! 这是确保数据库数据在容器重启或删除后不会丢失的方法。这里使用了Docker 卷。 - 端口映射 (
ports):5432:5432将容器的 5432 端口映射到宿主机的 5432 端口,允许外部应用连接。 - 网络 (
networks): 将 PostgreSQL 容器放在一个自定义的Docker 网络中,便于与其他应用容器(如 Node.js 应用容器 或 Python Flask 应用容器)进行通信。
进一步考量:
- 安全性: 不要将生产环境的密码硬编码在
docker-compose.yml中,应使用环境变量或 Docker Secrets。 - 初始化脚本: 如果需要预先创建表、插入数据,可以通过挂载
initdb.d目录来实现。 - 备份与恢复: 考虑如何定期备份
postgres_data卷。 - 高可用性: 对于生产环境,可能需要考虑使用 PostgreSQL 流复制 或 Kubernetes Operator 等高级方案。
相关笔记:
- Docker Compose
- Docker 卷
- Docker 网络
- 连接 Docker PostgreSQL 数据库
- PostgreSQL 常用命令 (容器内执行)
- Docker 容器日志处理 (如何查看PostgreSQL日志)