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
访问宿主机服务。
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 DATABASE
和 CREATE DATABASE
。
7. 总结
本文介绍了如何通过 Docker 快速部署 PostgreSQL 数据库,包括:
- 使用官方镜像快速启动 PostgreSQL 容器
- 自定义 Dockerfile 安装 PostgreSQL
- 配置 pgAdmin 图形界面进行管理
- 使用
pg_dumpall
和psql
实现数据备份与恢复
通过这些操作,我们可以快速搭建一个具备持久化、可视化管理和数据保护能力的 PostgreSQL 开发/测试环境。如果你有自动化部署需求,也可以结合 Docker Compose 编排多个服务。