在本文中,将演示如何使用 Docker 安装 PostgreSQL 。

在继续之前,重点提醒下:

  • “以下说明旨在让测试实例快速轻松地运行;不能直接用于生产部署。”
  • 打算展示如何将 PostgreSQL 实例引入 Docker 容器。其中包含很多基本的 Docker 管理操作和一些示例的代码,始终基于Docker Hub PostgreSQL 官方镜像。

安装

第一步从安装开始,先展示如何从 Docker Hub 启动最新 PostgreSQL 版本的 Docker 容器。 启动容器时需要提供Postgres用户的密码; 否则将无法创建容器:

$ docker run --name dockerPostgreSQL \
-e POSTGRES_PASSWORD=secret \
-d postgres:latest

启动容器后,使用docker inspect 检查容器是否成功启动

$  docker inspect  -f  '{{.State.Running}}'  dockerPostgreSQL
true

如果没有自动启动,请自行运行容器

连接到容器

连接到 PostgreSQL 容器

  • 直接从 Docker 连接:
$  docker exec  -it dockerPostgreSQL psql  --user postgres
postgres=# \conninfo
通过端口“5432”处“/var/run/postgresql”中的套接字以用户“postgres”的身份连接到数据库“postgres”。
  • 从连接到其 IP 地址的 PostgreSQL 客户端,使用命令docker inspect获取:
$  docker inspect  -f  '{{.NetworkSettings.IPAddress}}'  dockerPostgreSQL
172.16.0.12
$  psql  --user postgres  --port  5432  --host  172.16.0.12
postgres=# \conninfo
您已以用户“postgres”的身份在主机“172.16.0.12”的端口“50432”连接到数据库“postgres”。

管理 PostgreSQL 容器

如何列出所有活动的容器及其各自的状态?

$  docker ps

CONTAINER ID            IMAGE                       COMMAND                           CREATED                    STATUS                     PORTS                                NAMES

7f88656c4864            postgres:11              "docker-entrypoint..."     4  minutes ago           Up  4  minutes            0.0.0.0:50432->5432/tcp     dockerPostgreSQL11

8aba8609dabc            postgres:11.5           "docker-entrypoint..."     21  minutes ago         Up  21  minutes           5432/tcp                           dockerPostgreSQL115

15b9e0b789dd            postgres:latest        "docker-entrypoint..."     32  minutes ago         Up  32  minutes           5432/tcp                           dockerPostgreSQL

要停止其中一个容器,请执行以下操作:

docker stop dockerPostgreSQL

启动容器

docker start dockerPostgreSQL

删除一个容器,首先停止它,然后:

docker rm dockerPostgreSQL

在容器中自定义 PostgreSQL 设置

假设想为在 Docker 上运行的 PostgreSQL 服务器定义不同的参数。可以创建一个自定义的 postgresql.conf 配置文件来替换与 Docker 一起使用的默认配置文件:

$  docker run  --name dockerPostgreSQL11  -p  50433:5432  -v  "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf  -e  POSTGRES_PASSWORD=scret  -d  postgres:11

传递启动参数的另一个示例是更改存储 wal 文件的目录

$  docker run  --name dockerPostgreSQL11  -p  50433:5432  -v  "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf  -e  POSTGRES_PASSWORD=scret  -e  POSTGRES_INITDB_WALDIR=/backup/wal  -d  postgres:11

在不同的容器中运行不同的 PostgreSQL 版本

Docker 可以启动多个 PostgreSQL 容器,每个容器运行不同的 PostgreSQL 版本。在下面的示例启动 10.5 PostgreSQL 版本:

$  docker run  --name dockerPostgreSQL105  -p  50433:5432  -e  POSTGRES_PASSWORD=scret   -d  postgres:10.5

7f51187d32f339688c2f450ecfda6b7552e21a93c52f365e75d36238f5905017

以下是启动 PostgreSQL 11 容器的方法

$   docker run  --name dockerPostgreSQL11  -p  50432:5432  -e  POSTGRES_PASSWORD=scret  -d  postgres:11

7f88656c4864864953a5491705ac7ca882882df618623b1e5664eabefb662733

之后,通过重新发出 status 命令,将看到所有已创建的:

$  docker ps

CONTAINER ID            IMAGE                       COMMAND                           CREATED                    STATUS                     PORTS                                NAMES

e06e637ae090            postgres:10.5           "docker-entrypoint..."     4  seconds ago           Up  4  seconds            0.0.0.0:50433->5432/tcp     dockerPostgreSQL105

7f88656c4864            postgres:11              "docker-entrypoint..."     About an hour ago     Up About an hour      0.0.0.0:50432->5432/tcp     dockerPostgreSQL11

15b9e0b789dd            postgres:latest        "docker-entrypoint..."     2  hours ago              Up  2  hours               5432/tcp                           dockerPostgreSQL

会注意到 10.5 和 11 是使用不同的端口映射创建的。在本地进入容器,两者都在侦听 5432,但从外部映射到不同的端口。

可以在 PostgreSQL Hub Docker site上找到更多详细信息。

Percona Distribution for PostgreSQL 在单个发行版中提供来自开源社区的最佳和最关键的企业组件,经过设计和测试可以协同工作。