PostgreSQL标准软件基于Bitnami PostgreSQL 构建。当前版本为16.1.0
你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取
配置文件地址: https://gitee.com/qingplus/qingcloud-platform
qinghub自动安装部署配置库
使用Docker 容器网络,应用程序容器可以轻松访问容器内运行的 PostgreSQL 服务器。
连接到同一网络的容器可以使用容器名称作为主机名来相互通信。
在此示例中,我们将创建一个 PostgreSQL 客户端实例,该实例将连接到与客户端在同一 docker 网络上运行的服务器实例。
docker network create app-tier --driver bridge
使用命令–network app-tier的参数docker run将 PostgreSQL 容器连接到网络app-tier。
docker run -d --name postgresql-server \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
最后,我们创建一个新的容器实例来启动 PostgreSQL 客户端并连接到上一步中创建的服务器:
docker run -it --rm \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest psql -h postgresql-server -U postgres
如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。但是,我们将显式定义一个bridge名为 的新网络app-tier。在此示例中,我们假设您希望从您自己的自定义应用程序映像连接到 PostgreSQL 服务器,该映像在以下代码片段中通过服务名称进行标识myapp。
version: '2'
networks:
app-tier:
driver: bridge
services:
postgresql:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
networks:
- app-tier
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- app-tier
重要:
替换YOUR_APPLICATION_IMAGE占位符
在您的应用程序容器中,使用主机名postgresql连接到 PostgreSQL 服务器
启动容器:
docker-compose up -d
当容器执行时,初始化或启动postgresql之前,它会执行位于/docker-entrypoint-preinitdb.d的扩展名为.sh的文件。
为了将自定义文件放入 docker 映像中,您可以将它们安装为卷。
可以通过以下环境变量将额外的命令行标志传递给 postgresql 服务命令:
当容器第一次执行时,它将执行扩展名为.sh
, .sql
和 .sql.gz
的文件,位于/docker-entrypoint-initdb.d目录下.
为了将自定义文件放入 docker 映像中,您可以将它们安装为卷。
在上面的命令中您可能已经注意到环境变量的使用POSTGRESQL_PASSWORD。首次运行映像时传递环境变量POSTGRESQL_PASSWORD会将postgres用户的密码设置为POSTGRESQL_PASSWORD的值(或POSTGRESQL_PASSWORD_FILE变量中指定的文件的内容)。
docker run --name postgresql -e POSTGRESQL_PASSWORD=password123 registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
或者通过修改docker-compose.yml文件:
services:
postgresql:
...
environment:
- POSTGRESQL_PASSWORD=password123
...
注意! 该postgres用户是超级用户,拥有 PostgreSQL 数据库的完全管理访问权限。
POSTGRESQL_DATABASE通过在第一次运行镜像时传递环境变量,将创建一个数据库。如果您的应用程序要求数据库已存在,这非常有用,使您不必使用 PostgreSQL 客户端手动创建数据库。
docker run --name postgresql -e POSTGRESQL_DATABASE=my_database registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
或者通过修改docker-compose.yml文件:
services:
postgresql:
...
environment:
- POSTGRESQL_DATABASE=my_database
...
您还可以创建一个受限数据库用户,该用户仅具有使用环境变量创建的数据库的权限POSTGRESQL_DATABASE。为此,请提供POSTGRESQL_USERNAME环境变量。
docker run --name postgresql -e POSTGRESQL_USERNAME=my_user -e POSTGRESQL_PASSWORD=password123 -e POSTGRESQL_DATABASE=my_database registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
或者通过修改docker-compose.yml文件:
services:
postgresql:
...
environment:
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=password123
- POSTGRESQL_DATABASE=my_database
...
注意!POSTGRESQL_USERNAME指定后,postgres user不会分配密码,因此您无法以该postgres用户身份远程登录 PostgreSQL 服务器。如果您仍想使用用户postgres进行访问,请设置POSTGRESQL_POSTGRES_PASSWORD环境变量(或POSTGRESQL_POSTGRES_PASSWORD_FILE指定文件中内容)。
PostgreSQL image默认启用 pgAudit 模块。因此,可以使用以下环境变量在容器中启用审核信息:
PostgreSQL 映像允许配置多个连接和会话管理参数:
PostgreSQL 映像允许使用以下环境变量配置 PostgreSQL 的时区:
默认情况下,PostgreSQL image会生成local、md5 在pg_hba.conf文件。为了适应任何其他要求或标准,可以通过以下方式更改 pg_hba.conf 文件:
可以通过设置 .postgresql 文件来修改 PostgreSQL 在启动时预加载的库列表POSTGRESQL_SHARED_PRELOAD_LIBRARIES。默认值为POSTGRESQL_SHARED_PRELOAD_LIBRARIES=pgaudit。例如,如果您想将pg_stat_statements库添加到预加载中,请设置POSTGRESQL_SHARED_PRELOAD_LIBRARIES=pgaudit, pg_stat_statements。
可以使用以下环境变量设置流复制集群:
第一步是启动master。
docker run --name postgresql-master \
-e POSTGRESQL_REPLICATION_MODE=master \
-e POSTGRESQL_USERNAME=my_user \
-e POSTGRESQL_PASSWORD=password123 \
-e POSTGRESQL_DATABASE=my_database \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
在此命令中,我们使用参数将容器配置为主容器POSTGRESQL_REPLICATION_MODE=master。POSTGRESQL_REPLICATION_USER使用和参数指定复制用户POSTGRESQL_REPLICATION_PASSWORD。
接下来我们启动一个复制从属容器。
docker run --name postgresql-slave \
--link postgresql-master:master \
-e POSTGRESQL_REPLICATION_MODE=slave \
-e POSTGRESQL_MASTER_HOST=master \
-e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
在上面的命令中,容器被配置为slave使用POSTGRESQL_REPLICATION_MODE参数。在复制从属启动之前,从属容器使用POSTGRESQL_MASTER_HOST和POSTGRESQL_MASTER_PORT_NUMBER参数连接到主服务器并从主服务器复制初始数据库。POSTGRESQL_REPLICATION_PASSWORD和POSTGRESQL_REPLICATION_USER用于向主服务器进行身份验证。为了更改pg_hba.conf默认设置,从站需要知道是否POSTGRESQL_PASSWORD已设置。
通过这两个命令,您现在已经启动并运行了一个两节点 PostgreSQL 主从流复制集群。您可以通过添加/删除从属服务器来扩展集群,而不会导致任何停机。
注意:集群会完整复制主节点,其中包括所有用户和数据库。
如果主服务器出现故障,您可以重新配置从服务器以充当主服务器,并通过创建触发器文件开始接受写入/tmp/postgresql.trigger.5432。例如,以下命令重新配置postgresql-slave为充当主服务器:
docker exec postgresql-slave touch /tmp/postgresql.trigger.5432
注意:集群中其他从站的配置需要更新,以便它们知道新的主站。–link postgresql-slave:master这将要求您按照我们的示例重新启动其他从站。
通过 Docker Compose,可以使用以下命令设置主从复制:
version: '2'
services:
postgresql-master:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
postgresql-slave:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_MASTER_PORT_NUMBER=5432
volumes:
postgresql_master_data:
使用以下方法扩展从站数量:
docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
上面的命令将 Slave 的数量增加到3。您可以用同样的方法缩小规模。
注意:您不应增加/减少主节点的数量。始终只有一个主节点运行。
默认情况下,从属实例配置为异步复制。为了保证更多的数据稳定性(以一些性能为代价),可以使用以下环境设置同步提交(即事务提交在被写入一组副本之前不会向客户端返回成功)变量。
on
, remote_apply
, remote_write
, local
and off
。默认值为on。version: '2'
services:
postgresql-master:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
- POSTGRESQL_SYNCHRONOUS_COMMIT_MODE=on
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
volumes:
- '/path/to/postgresql-persistence:/bitnami/postgresql'
postgresql-slave:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
postgresql-slave2:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
在上面的示例中,提交需要写入主服务器和从服务器之一才能被接受。另一个从站将继续使用异步复制。使用以下 SQL 查询检查它:
postgres=# select application_name as server, state,
postgres-# sync_priority as priority, sync_state
postgres-# from pg_stat_replication;
| server | state | priority | sync_state |
|-------------|-----------|----------|------------|
| walreceiver | streaming | 0 | sync |
| walreceiver | streaming | 0 | async |
注意:对于更高级的设置,您可以application_name通过设置POSTGRESQL_CLUSTER_APP_NAME环境变量来使用参数定义不同的复制组。
为了使用 LDAP 身份验证,您需要将环境变量设置POSTGRESQL_ENABLE_LDAP为yes来启用它。
有两种设置 LDAP 配置的方法:
通过配置POSTGRESQL_LDAP_URL,您可以在其中配置URL中的所有关联参数。
独立设置参数POSTGRESQL_LDAP_xxxx。
LDAP相关参数有:
POSTGRESQL_LDAP_SERVER:要连接的 LDAP 服务器的 IP 地址或名称。用空格分隔。
POSTGRESQL_LDAP_PORT:LDAP 服务器上要连接的端口号
POSTGRESQL_LDAP_SCHEME:设置为ldaps使用 LDAPS。默认为无。
POSTGRESQL_LDAP_TLS:设置为1使用 TLS 加密。默认为无。
POSTGRESQL_LDAP_PREFIX:形成要绑定的 DN 时要添加到用户名前面的字符串。默认为无。
POSTGRESQL_LDAP_SUFFIX:形成要绑定的 DN 时附加到用户名的字符串。默认为无。
POSTGRESQL_LDAP_BASE_DN:开始搜索用户的根 DN。默认为无。
POSTGRESQL_LDAP_BIND_DN:要绑定到 LDAP 的用户的 DN。默认为无。
POSTGRESQL_LDAP_BIND_PASSWORD:绑定LDAP的用户密码。默认为无。
POSTGRESQL_LDAP_SEARCH_ATTR:与搜索中的用户名匹配的属性。默认为无。
POSTGRESQL_LDAP_SEARCH_FILTER:进行搜索+绑定身份验证时使用的搜索过滤器。默认为无。
POSTGRESQL_LDAP_URL:要连接的 URL,格式为:ldap[s]/host[:port]/basedn[?[attribute][?[scope][?[filter]]]]。
PostgreSQL 支持使用 SSL/TLS 协议对连接进行加密。如果您希望启用此可选功能,您可以使用以下环境变量来配置应用程序:
使用docker run
```console
$ docker run \
-v /path/to/certs:/opt/bitnami/postgresql/certs \
-e ALLOW_EMPTY_PASSWORD=yes \
-e POSTGRESQL_ENABLE_TLS=yes \
-e POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt \
-e POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
```
修改docker-compose.yml文件:
```yaml
services:
postgresql:
...
environment:
...
- POSTGRESQL_ENABLE_TLS=yes
- POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt
- POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key
...
volumes:
...
- /path/to/certs:/opt/bitnami/postgresql/certs
...
```
或者,您也可以在自定义配置文件中提供此配置。
该图像在 中查找postgresql.conf文件/opt/bitnami/postgresql/conf/。您可以在以下位置安装卷/bitnami/postgresql/conf/并复制/编辑. 如果该目录为空,则默认配置将被填充到该目录中。postgresql.conf/path/to/postgresql-persistence/conf/conf/
/path/to/postgresql-persistence/conf/
└── postgresql.conf
0 directories, 1 file
由于 PostgreSQL 映像是非 root 的,因此您需要为主机中的挂载目录设置适当的权限:
sudo chown 1001:1001 /path/to/postgresql-persistence/conf/
运行 PostgreSQL 映像,从主机安装目录。
docker run --name postgresql \
-v /path/to/postgresql-persistence/conf/:/bitnami/postgresql/conf/ \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
或使用 Docker Compose:
version: '2'
services:
postgresql:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
ports:
- '5432:5432'
volumes:
- /path/to/postgresql-persistence/conf/:/bitnami/postgresql/conf/
使用您喜欢的编辑器编辑主机上的配置。
vi /path/to/postgresql-persistence/conf/postgresql.conf
更改配置后,重新启动 PostgreSQL 容器以使更改生效。
docker restart postgresql
或使用 Docker Compose:
docker-compose restart postgresql
有关配置选项的完整列表,请参阅服务器配置手册。
除了使用自定义之外postgresql.conf,您还可以包含.conf以conf.d目录结尾的文件/bitnami/postgresql/conf/。为此,默认postgresql.conf包含以下部分:
##------------------------------------------------------------------------------
## CONFIG FILE INCLUDES
##------------------------------------------------------------------------------
## These options allow settings to be loaded from files other than the
## default postgresql.conf.
include_dir = 'conf.d' # Include files ending in '.conf' from directory 'conf.d'
在您的主机中,您应该在目录下创建扩展配置文件conf.d:
mkdir -p /path/to/postgresql-persistence/conf/conf.d/
vi /path/to/postgresql-persistence/conf/conf.d/extended.conf
如果您使用自定义的postgresql.conf,您应该在配置文件中创建(或取消注释)上述部分,在这种情况下,/path/to/postgresql-persistence/conf/结构应该类似于
/path/to/postgresql-persistence/conf/
├── conf.d
│ └── extended.conf
└── postgresql.conf
1 directory, 2 files
使用以下环境变量可以轻松指定额外的 initdb 参数:
docker run --name postgresql \
-e POSTGRESQL_INITDB_ARGS="--data-checksums" \
-e POSTGRESQL_INITDB_WAL_DIR="/bitnami/waldir" \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
或者通过修改docker-compose.yml文件:
services:
postgresql:
...
environment:
- POSTGRESQL_INITDB_ARGS=--data-checksums
- POSTGRESQL_INITDB_WAL_DIR=/bitnami/waldir
...
您可以使用以下命令控制初始化过程中用于停止 postgresql 的参数:
Dockerfile 提供了两个参数来在构建时配置额外的区域设置:
docker build --build-arg EXTRA_LOCALES="es_ES.UTF-8 UTF-8" ...
容器允许两组不同的环境变量。请参阅下表中的环境变量别名列表:
环境变量 | 别名 |
---|---|
POSTGRESQL_USERNAME | POSTGRES_USER |
POSTGRESQL_DATABASE | POSTGRES_DB |
POSTGRESQL_PASSWORD | POSTGRES_PASSWORD |
POSTGRESQL_PASSWORD_FILE | POSTGRES_PASSWORD_FILE |
POSTGRESQL_POSTGRES_PASSWORD | POSTGRES_POSTGRES_PASSWORD |
POSTGRESQL_POSTGRES_PASSWORD_FILE | POSTGRES_POSTGRES_PASSWORD_FILE |
POSTGRESQL_PORT_NUMBER | POSTGRES_PORT_NUMBER |
POSTGRESQL_INITDB_ARGS | POSTGRES_INITDB_ARGS |
POSTGRESQL_INITDB_WAL_DIR | POSTGRES_INITDB_WAL_DIR |
POSTGRESQL_DATA_DIR | PGDATA |
POSTGRESQL_REPLICATION_USER | POSTGRES_REPLICATION_USER |
POSTGRESQL_REPLICATION_MODE | POSTGRES_REPLICATION_MODE |
POSTGRESQL_REPLICATION_PASSWORD | POSTGRES_REPLICATION_PASSWORD |
POSTGRESQL_REPLICATION_PASSWORD_FILE | POSTGRES_REPLICATION_PASSWORD_FILE |
POSTGRESQL_CLUSTER_APP_NAME | POSTGRES_CLUSTER_APP_NAME |
POSTGRESQL_MASTER_HOST | POSTGRES_MASTER_HOST |
POSTGRESQL_MASTER_PORT_NUMBER | POSTGRES_MASTER_PORT_NUMBER |
POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS | POSTGRES_NUM_SYNCHRONOUS_REPLICAS |
POSTGRESQL_SYNCHRONOUS_COMMIT_MODE | POSTGRES_SYNCHRONOUS_COMMIT_MODE |
POSTGRESQL_SHUTDOWN_MODE | POSTGRES_SHUTDOWN_MODE |
重要信息:更改POSTGRES_USER不会更改数据库的所有者,数据库的所有者将继续作为用户postgres。要更改数据库所有者,请使用postgres用户 ( $ psql -U postgres …) 访问并执行以下命令:
alter database POSTGRES_DATABASE owner to POSTGRES_USER;
可以更改 PostgreSQL 用于执行 init 脚本的用户。为此,请使用以下环境变量:
环境变量 | 描述 |
---|---|
POSTGRESQL_INITSCRIPTS_USERNAME | 将用于执行初始化脚本的用户 |
POSTGRESQL_INITSCRIPTS_PASSWORD | POSTGRESQL_INITSCRIPT_USERNAME 中指定的用户的密码 |
默认的 toast 压缩是pglz,但您可以通过将环境变量设置POSTGRES_DEFAULT_COMPRESSION为所需的值来修改它。例如:POSTGRES_DEFAULT_COMPRESSION=‘lz4’。
docker logs postgresql
或使用 Docker Compose:
docker-compose logs postgresql
你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取
开源地址: https://gitee.com/qingplus/qingcloud-platform
QingHub PostgreSQL部署手册