1. 概述

本文将介绍如何使用 Docker 部署 PostgreSQL 数据库。通常,我们通过拉取官方镜像来运行 Docker 容器,PostgreSQL 也不例外。我们可以从 Docker Hub 获取预配置的 PostgreSQL 镜像,并进行部署、配置和运行。

我们将从以下几方面展开:

  • 使用官方镜像部署 PostgreSQL
  • 自定义 Dockerfile 构建 PostgreSQL 容器
  • 部署 pgAdmin 管理界面
  • 数据的备份与恢复

适合有一定 Docker 使用经验的开发人员阅读,目标是快速搭建一个可持久化、可扩展的 PostgreSQL 开发/测试环境。


2. PostgreSQL 简介

PostgreSQL 是一个开源的关系型数据库(RDMS),与 MySQL 类似,但支持更多高级特性,例如 JSON 数据类型、地理空间数据、全文搜索等。它是一个面向对象的数据库系统,支持结构化和非结构化数据的处理。

PostgreSQL 支持多平台运行(Windows、macOS、Linux),并且具备良好的扩展性和性能优化能力,适合处理复杂的数据库负载。


3. 使用官方镜像部署 PostgreSQL

3.1 拉取镜像

首先从 Docker Hub 拉取 PostgreSQL 官方镜像:

$ docker pull postgres

如需特定版本,例如 16.2:

$ docker pull postgres:16.2

3.2 启动容器

使用如下命令启动 PostgreSQL 容器:

$ docker run -itd \
  -e POSTGRES_USER=baeldung \
  -e POSTGRES_PASSWORD=baeldung \
  -p 5432:5432 \
  -v ./data:/var/lib/postgresql/data \
  --name postgresql \
  postgres

参数说明:

  • -e POSTGRES_USER-e POSTGRES_PASSWORD:设置默认数据库用户名和密码
  • -p 5432:5432:映射主机 5432 端口,PostgreSQL 默认端口
  • -v ./data:/var/lib/postgresql/data:将容器内数据目录挂载到本地,实现数据持久化
  • --name postgresql:容器命名

3.3 连接数据库

使用 psql 命令连接数据库:

$ PGPASSWORD=baeldung psql -h localhost -p 5432 -U baeldung

列出所有数据库:

$ PGPASSWORD=baeldung psql -h localhost -p 5432 -U baeldung -c '\l'

4. 使用自定义 Dockerfile 部署 PostgreSQL

4.1 编写 Dockerfile

使用 Debian 基础镜像安装 PostgreSQL 16:

FROM debian:bullseye

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && apt install -y \
    wget \
    gnupg \
    lsb-release \
    sudo \
    && rm -rf /var/lib/apt/lists/*

RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg

RUN echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list

RUN apt update && apt install -y \
    postgresql-16 \
    postgresql-client-16 \
    && rm -rf /var/lib/apt/lists/*

COPY startUpScript.sh /usr/local/bin/startUpScript.sh
RUN chmod +x /usr/local/bin/startUpScript.sh

CMD ["/usr/local/bin/startUpScript.sh"]

4.2 编写启动脚本 startUpScript.sh

#!/bin/bash

PGDATA="/var/lib/postgresql/16/main"

pg_ctlcluster 16 main start

until pg_isready -h localhost -p 5432
do
  echo "Waiting for PostgreSQL to start..."
  sleep 1
done

echo "PostgreSQL has been initialized."
tail -f /dev/null

⚠️ 注意:最后的 tail -f /dev/null 是必须的,否则容器启动后会立即退出。


5. 安装 pgAdmin 管理界面

5.1 拉取镜像

$ docker pull dpage/pgadmin4:latest

5.2 启动容器

$ docker run --name pgadmin-baeldung \
  -p 5051:80 \
  -e PGADMIN_DEFAULT_EMAIL=admin@example.com \
  -e PGADMIN_DEFAULT_PASSWORD=baeldung \
  -d dpage/pgadmin4

访问 http://localhost:5051 登录 pgAdmin。

5.3 配置连接

登录后添加服务器连接,填写如下信息:

  • Host: host.docker.internal(如果 pgAdmin 与 PostgreSQL 容器在不同容器中)
  • Port: 5432
  • Maintenance database: postgres
  • Username: baeldung
  • Password: baeldung

✅ 提示:如果你使用的是 Docker Desktop,可以直接使用 host.docker.internal 访问宿主机服务。

docker register server


6. 数据备份与恢复

6.1 创建测试数据

创建数据库和表:

$ createdb -h localhost -p 5432 -U baeldung baeldung

创建表:

CREATE TABLE baedlungauthor (
   AUTHOR_ID INT PRIMARY KEY NOT NULL,
   AUTHOR_NAME TEXT NOT NULL,
   AUTHOR_AGE INT NOT NULL,
   AUTHOR_LEVEL INT NOT NULL
);

查看表结构:

psql -U baeldung -d baeldung -c "\d baedlungauthor"

6.2 备份数据库

使用 pg_dumpall 命令进行备份:

$ docker exec -t postgresql pg_dumpall -c -U baeldung > dump.sql

6.3 恢复数据库

使用 psql 恢复备份数据:

$ cat dump.sql | docker exec -i postgresql psql -U baeldung

⚠️ 注意:恢复前确保目标数据库为空,或先执行 DROP DATABASECREATE DATABASE


7. 总结

本文介绍了如何通过 Docker 快速部署 PostgreSQL 数据库,包括:

  • 使用官方镜像快速启动 PostgreSQL 容器
  • 自定义 Dockerfile 安装 PostgreSQL
  • 配置 pgAdmin 图形界面进行管理
  • 使用 pg_dumpallpsql 实现数据备份与恢复

通过这些操作,我们可以快速搭建一个具备持久化、可视化管理和数据保护能力的 PostgreSQL 开发/测试环境。如果你有自动化部署需求,也可以结合 Docker Compose 编排多个服务。


原始标题:PostgreSQL with Docker Setup

« 上一篇: Docker Compose 简介