在本文中,将演示如何使用 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 在单个发行版中提供来自开源社区的最佳和最关键的企业组件,经过设计和测试可以协同工作。