在本文,尝试使用 Docker 运行 PostgreSQL ,为了适配 goalert 项目,因为从来没有尝试过使用 PostgreSQL

了解PostgreSQL数据库

在我们继续运行 PostgreSQL 数据库的 Docker 容器之前,我们先来了解一下 PostgreSQL 数据库。 PostgreSQL 是一个开源 RDMS,类似于 MySQL。它是一个面向对象的数据库,但我们可以处理结构化和非结构化数据。

PostgreSQL 数据库可以运行在各种平台上,包括 Windows、Mac OS X 和 Linux。它还提供高级数据类型和性能优化功能来存储和扩展复杂的数据库工作负载。

一些常见的 postgres 镜像

镜像说明
postgres:latest最新的一个稳定版本
postgres:17PostgreSQL version 14.x (x为最近的一次 patch)
postgres:17.417.4 一个具体的版本
postgres:bookworm使用 Debian Bookworm (12) 构建的 PostgreSQL
postgres:15-bookworm使用 Debian Bookworm (12) 构建的 PostgreSQL 15

使用公共镜像运行PostgreSQL

要使用 Docker 运行 PostgreSQL,我们首先需要拉取 Docker Hub 上可用的 postgres 公共镜像:

bash
1
docker pull postgres

在上面的命令中,我们拉取了 postgres 最新的稳定版镜像。 如果要指定版本的 postgres 镜像,可以使用以下命令

bash
1
docker pull postgres:14.2

这里将使用 postgres:14.2 版本来运行 Postgres 的容器,这里命令主要为 Linux

text
1
docker run --name <container_name> -e POSTGRES_PASSWORD=<password> -e POSTGRES_USER=<root> -p 5432:5432 -d postgres 

实际执行命令

bash
1
2
3
4
5
6
docker run --name postgresql \
	-e POSTGRES_USER=admin \
	-e POSTGRES_PASSWORD=111111 \
	-p 5432:5432 \
	-v /data:/var/lib/postgresql/data \
	-d postgres:16-bookworm

如果在 window 或 wsl 上运行,可以执行下面命令

bash
1
docker run -d -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=111111 -p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql postgres

POSTGRES_PASSWORD, 这个变量设置超级 PostgreSQL 用户的密码,必须设置并且不能为空

POSTGRES_USER, 这个变量是和上面的关联使用的,用于设置一个指定的超级用户,默认为 “postgres”

更多变量参考 [1]

配置

Setting up persistent storage

text
1
2
3
4
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Exposing ports to connect to PostgreSQL

text
1
2
3
4
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  -d postgres

Connecting using the psql command line tool

psql 是 PostgreSQL 的官方客户端工具,可以让用户使用这个命令行工具与数据库进行交互,要连接数据库可以使用下面命令

bash
1
docker exec -it postgres-db psql -U myuser -d mydatabase

命令 psql -l 可以列出所有正在运行的数据库

命令 createdb 可以创建一个数据库

text
1
createdb mydb

创建数据库

创建数据库可以通过其他数据库创建命令进行

bash
1
CREATE DATABASE name;

官方也提供了快速创建的命令,不需要使用 psql 链接上 postgres 后再创建

bash
1
createdb dbname

createdb 就是连接到 postgres 数据库并且发出 CREATE DATABASE 命令注意不带任何参数的 createdb 将创建一个使用当前用户名的数据库 [3]

Reference

[1] How to extend this image

[2] PostgreSQL in Docker: A Step-by-Step Guide for Beginners

[3] 23.2. 创建一个数据库

[4] Chapter 10. Migrating authentication from nslcd to SSSD

[5] OpenLDAP Client 2.4.23: TLS negotiation failure

[6] Chapter 10. Migrating authentication from nslcd to SSSD

[7] Configure SSSD

[8] Configure OpenLDAP SSSD client on CentOS 6/7