【Docker】PostgreSQL 容器化部署

打印 上一主题 下一主题

主题 1887|帖子 1887|积分 5661

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
PostgreSQL尺度软件基于Bitnami PostgreSQL 构建。当前版本为16.1.0
你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取
设置文件地点: https://gitee.com/qingplus/qingcloud-platform
Qinghub Studio 在线体验
毗连到其他容器

利用Docker 容器网络,应用步调容器可以轻松访问容器内运行的 PostgreSQL 服务器。
毗连到同一网络的容器可以利用容器名称作为主机名来相互通信。
利用命令行

在此示例中,我们将创建一个 PostgreSQL 客户端实例,该实例将毗连到与客户端在同一 docker 网络上运行的服务器实例。
第 1 步:创建网络

  1. docker network create app-tier --driver bridge
复制代码
步骤 2:启动 PostgreSQL 服务器实例

利用命令–network app-tier的参数docker run将 PostgreSQL 容器毗连到网络app-tier。
  1. docker run -d --name postgresql-server \
  2.     --network app-tier \
  3.     registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
复制代码
第 3 步:启动 PostgreSQL 客户端实例

最后,我们创建一个新的容器实例来启动 PostgreSQL 客户端并毗连到上一步中创建的服务器:
  1. docker run -it --rm \
  2.     --network app-tier \
  3.     registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest psql -h postgresql-server -U postgres
复制代码
利用 Docker Compose 文件

如果未指定,Docker Compose 会自动设置一个新网络并将全部已部署的服务附加到该网络。但是,我们将显式定义一个bridge名为 的新网络app-tier。在此示例中,我们假设您希望从您本身的自定义应用步调映像毗连到 PostgreSQL 服务器,该映像在以下代码片断中通过服务名称进行标识myapp。
  1. version: '2'
  2. networks:
  3.   app-tier:
  4.     driver: bridge
  5. services:
  6.   postgresql:
  7.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  8.     networks:
  9.       - app-tier
  10.   myapp:
  11.     image: 'YOUR_APPLICATION_IMAGE'
  12.     networks:
  13.       - app-tier
复制代码
  重要
  更换YOUR_APPLICATION_IMAGE占位符
在您的应用步调容器中,利用主机名postgresql毗连到 PostgreSQL 服务器
启动容器:
  1. docker-compose up -d
复制代码
设置

容器启动时

当容器执行时,初始化或启动postgresql之前,它会执行位于/docker-entrypoint-preinitdb.d的扩展名为.sh的文件。
为了将自定义文件放入 docker 映像中,您可以将它们安装为卷。
将额外的命令行标记传递给 PostgreSQL

可以通过以下环境变量将额外的命令行标记传递给 postgresql 服务命令:


  • POSTGRESQL_EXTRA_FLAGS:要附加到postgres启动命令的标记。无默认值
初始化一个新实例

当容器第一次执行时,它将执行扩展名为.sh, .sql 和 .sql.gz的文件,位于/docker-entrypoint-initdb.d目次下.
为了将自定义文件放入 docker 映像中,您可以将它们安装为卷。
首次运行时设置 root 密码

在上面的命令中您大概已经注意到环境变量的利用POSTGRESQL_PASSWORD。首次运行映像时传递环境变量POSTGRESQL_PASSWORD会将postgres用户的密码设置为POSTGRESQL_PASSWORD的值(或POSTGRESQL_PASSWORD_FILE变量中指定的文件的内容)。
  1. docker run --name postgresql -e POSTGRESQL_PASSWORD=password123 registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
复制代码
大概通过修改docker-compose.yml文件:
  1. services:
  2.   postgresql:
  3.   ...
  4.     environment:
  5.       - POSTGRESQL_PASSWORD=password123
  6.   ...
复制代码
注意! 该postgres用户是超等用户,拥有 PostgreSQL 数据库的完全管理访问权限。
首次运行时创建数据库

POSTGRESQL_DATABASE通过在第一次运行镜像时传递环境变量,将创建一个数据库。如果您的应用步调要求数据库已存在,这非常有效,使您不必利用 PostgreSQL 客户端手动创建数据库。
  1. docker run --name postgresql -e POSTGRESQL_DATABASE=my_database registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
复制代码
大概通过修改docker-compose.yml文件:
  1. services:
  2.   postgresql:
  3.   ...
  4.     environment:
  5.       - POSTGRESQL_DATABASE=my_database
  6.   ...
复制代码
首次运行时创建数据库用户

您还可以创建一个受限数据库用户,该用户仅具有利用环境变量创建的数据库的权限POSTGRESQL_DATABASE。为此,请提供POSTGRESQL_USERNAME环境变量。
  1. 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文件:
  1. services:
  2.   postgresql:
  3.   ...
  4.     environment:
  5.       - POSTGRESQL_USERNAME=my_user
  6.       - POSTGRESQL_PASSWORD=password123
  7.       - POSTGRESQL_DATABASE=my_database
  8.   ...
复制代码
注意!POSTGRESQL_USERNAME指定后,postgres user不会分配密码,因此您无法以该postgres用户身份远程登录 PostgreSQL 服务器。如果您仍想利用用户postgres进行访问,请设置POSTGRESQL_POSTGRES_PASSWORD环境变量(或POSTGRESQL_POSTGRES_PASSWORD_FILE指定文件中内容)。
审计

PostgreSQL image默认启用 pgAudit 模块。因此,可以利用以下环境变量在容器中启用考核信息:


  • POSTGRESQL_PGAUDIT_LOG:以逗号分隔的列表,此中包罗要考核的差别操作。没有默认值。
  • POSTGRESQL_PGAUDIT_LOG_CATALOG:在语句中的全部关系都在 pg_catalog 中的情况下启用会话日志记载。没有默认值。
  • POSTGRESQL_LOG_CONNECTIONS:添加登录日志条目。没有默认值。
  • POSTGRESQL_LOG_DISCONNECTIONS:添加注销日志条目。没有默认值。
  • POSTGRESQL_LOG_HOSTNAME:记载客户端主机名。没有默认值。
  • POSTGRESQL_LOG_LINE_PREFIX:定义日志条目行的格式。在PostgreSQL 官方文档中查找字符串参数。没有默认值。
  • POSTGRESQL_LOG_TIMEZONE:设置日志条目时间戳的时区。没有默认值。
会话设置

PostgreSQL 映像允许设置多个毗连和会话管理参数:


  • POSTGRESQL_USERNAME_CONNECTION_LIMIT:如果创建了差别的用户postgres,请设置毗连限定。没有默认值。
  • POSTGRESQL_POSTGRES_CONNECTION_LIMIT:设置用户的毗连限定postgres。没有默认值。
  • POSTGRESQL_STATEMENT_TIMEOUT:设置语句超时时间。没有默认值。
  • POSTGRESQL_TCP_KEEPALIVES_INTERVAL:TCP 保活间隔。没有默认值。
  • POSTGRESQL_TCP_KEEPALIVES_IDLE:TCP keepalive 空闲时间。没有默认值。
  • POSTGRESQL_TCP_KEEPALIVES_COUNT:TCP 保活计数。没有默认值。
设置时区

PostgreSQL 映像允许利用以下环境变量设置 PostgreSQL 的时区:


  • POSTGRESQL_TIMEZONE:设置显示和解释时间戳的时区。
  • POSTGRESQL_LOG_TIMEZONE:设置写入服务器日志的时间戳所利用的时区。
修改pg_hba.conf

默认情况下,PostgreSQL image会生成local、md5 在pg_hba.conf文件。为了适应任何其他要求或尺度,可以通过以下方式更改 pg_hba.conf 文件:


  • 挂载你本身的pg_hba.conf 到文件/bitnami/postgresql/conf
  • POSTGRESQL_PGHBA_REMOVE_FILTERS将与以逗号分隔的模式列表一起利用。全部与任何模式匹配的行都将被删除。例如,如果我们想要删除全部local和md5验证(例如,仅支持hostssl毗连),请设置POSTGRESQL_PGHBA_REMOVE_FILTERS=local, md5.
预加载共享库

可以通过设置 .postgresql 文件来修改 PostgreSQL 在启动时预加载的库列表POSTGRESQL_SHARED_PRELOAD_LIBRARIES。默认值为POSTGRESQL_SHARED_PRELOAD_LIBRARIES=pgaudit。例如,如果您想将pg_stat_statements库添加到预加载中,请设置POSTGRESQL_SHARED_PRELOAD_LIBRARIES=pgaudit, pg_stat_statements。
设置流式复制

可以利用以下环境变量设置流复制集群:


  • POSTGRESQL_REPLICATION_MODE:复制模式。大概的值master/ slave。没有默认值。
  • POSTGRESQL_REPLICATION_USER:首次运行时在主服务器上创建的复制用户。没有默认值。
  • POSTGRESQL_REPLICATION_PASSWORD:复制用户密码。没有默认值。
  • POSTGRESQL_REPLICATION_PASSWORD_FILE:包罗复制用户密码的文件的路径。这将覆盖 中指定的值POSTGRESQL_REPLICATION_PASSWORD。没有默认值。
  • POSTGRESQL_MASTER_HOST:复制主机的主机名/IP(从机参数)。没有默认值。
  • POSTGRESQL_MASTER_PORT_NUMBER:复制主机的服务器端口(从机参数)。默以为5432.
    在复制集群中,您可以拥有一个主服务器和零个或多个从服务器。启用复制后,主节点处于读写模式,而从节点处于只读模式。为了获得最佳性能,发起限定对附属设备的读取。
第 1 步:创建复制主服务器

第一步是启动master。
  1. docker run --name postgresql-master \
  2.   -e POSTGRESQL_REPLICATION_MODE=master \
  3.   -e POSTGRESQL_USERNAME=my_user \
  4.   -e POSTGRESQL_PASSWORD=password123 \
  5.   -e POSTGRESQL_DATABASE=my_database \
  6.   -e POSTGRESQL_REPLICATION_USER=my_repl_user \
  7.   -e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
  8.   registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest
复制代码
在此命令中,我们利用参数将容器设置为主容器POSTGRESQL_REPLICATION_MODE=master。POSTGRESQL_REPLICATION_USER利用和参数指定复制用户POSTGRESQL_REPLICATION_PASSWORD。
第2步:创建复制从站

接下来我们启动一个复制附属容器。
  1. docker run --name postgresql-slave \
  2.   --link postgresql-master:master \
  3.   -e POSTGRESQL_REPLICATION_MODE=slave \
  4.   -e POSTGRESQL_MASTER_HOST=master \
  5.   -e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
  6.   -e POSTGRESQL_REPLICATION_USER=my_repl_user \
  7.   -e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
  8.   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为充当主服务器:
  1. docker exec postgresql-slave touch /tmp/postgresql.trigger.5432
复制代码
注意:集群中其他从站的设置必要更新,以便它们知道新的主站。–link postgresql-slave:master这将要求您按照我们的示例重新启动其他从站。
通过 Docker Compose,可以利用以下命令设置主从复制:
  1. version: '2'
  2. services:
  3.   postgresql-master:
  4.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  5.     ports:
  6.       - '5432'
  7.     volumes:
  8.       - 'postgresql_master_data:/bitnami/postgresql'
  9.     environment:
  10.       - POSTGRESQL_REPLICATION_MODE=master
  11.       - POSTGRESQL_REPLICATION_USER=repl_user
  12.       - POSTGRESQL_REPLICATION_PASSWORD=repl_password
  13.       - POSTGRESQL_USERNAME=my_user
  14.       - POSTGRESQL_PASSWORD=my_password
  15.       - POSTGRESQL_DATABASE=my_database
  16.   postgresql-slave:
  17.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  18.     ports:
  19.       - '5432'
  20.     depends_on:
  21.       - postgresql-master
  22.     environment:
  23.       - POSTGRESQL_REPLICATION_MODE=slave
  24.       - POSTGRESQL_REPLICATION_USER=repl_user
  25.       - POSTGRESQL_REPLICATION_PASSWORD=repl_password
  26.       - POSTGRESQL_MASTER_HOST=postgresql-master
  27.       - POSTGRESQL_PASSWORD=my_password
  28.       - POSTGRESQL_MASTER_PORT_NUMBER=5432
  29. volumes:
  30.   postgresql_master_data:
复制代码
利用以下方法扩展从站数量:
  1. docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
复制代码
上面的命令将 Slave 的数量增长到3。您可以用同样的方法缩小规模。
注意:您不应增长/淘汰主节点的数量。始终只有一个主节点运行。
同步提交

默认情况下,附属实例设置为异步复制。为了包管更多的数据稳定性(以一些性能为代价),可以利用以下环境设置同步提交(即事件提交在被写入一组副本之前不会向客户端返回成功)变量。


  • POSTGRESQL_SYNCHRONOUS_COMMIT_MODE:创建同步提交的范例。可用选项有:on, remote_apply, remote_write, local and off。默认值为on。
  • POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS:创建将启用同步复制的副本数量。该数量不得超过您在集群中设置的从站数量。
    利用 Docker Compose,可以按如下方式设置具有同步提交的主从复制:
  1. version: '2'
  2. services:
  3.   postgresql-master:
  4.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  5.     ports:
  6.       - '5432'
  7.     volumes:
  8.       - 'postgresql_master_data:/bitnami/postgresql'
  9.     environment:
  10.       - POSTGRESQL_REPLICATION_MODE=master
  11.       - POSTGRESQL_REPLICATION_USER=repl_user
  12.       - POSTGRESQL_REPLICATION_PASSWORD=repl_password
  13.       - POSTGRESQL_USERNAME=my_user
  14.       - POSTGRESQL_PASSWORD=my_password
  15.       - POSTGRESQL_DATABASE=my_database
  16.       - POSTGRESQL_SYNCHRONOUS_COMMIT_MODE=on
  17.       - POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
  18.     volumes:
  19.       - '/path/to/postgresql-persistence:/bitnami/postgresql'
  20.   postgresql-slave:
  21.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  22.     ports:
  23.       - '5432'
  24.     depends_on:
  25.       - postgresql-master
  26.     environment:
  27.       - POSTGRESQL_REPLICATION_MODE=slave
  28.       - POSTGRESQL_REPLICATION_USER=repl_user
  29.       - POSTGRESQL_REPLICATION_PASSWORD=repl_password
  30.       - POSTGRESQL_MASTER_HOST=postgresql-master
  31.       - POSTGRESQL_MASTER_PORT_NUMBER=5432
  32.   postgresql-slave2:
  33.     image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/postgresql:latest'
  34.     ports:
  35.       - '5432'
  36.     depends_on:
  37.       - postgresql-master
  38.     environment:
  39.       - POSTGRESQL_REPLICATION_MODE=slave
  40.       - POSTGRESQL_REPLICATION_USER=repl_user
  41.       - POSTGRESQL_REPLICATION_PASSWORD=repl_password
  42.       - POSTGRESQL_MASTER_HOST=postgresql-master
  43.       - POSTGRESQL_MASTER_PORT_NUMBER=5432
复制代码
在上面的示例中,提交必要写入主服务器和从服务器之一才气被接受。另一个从站将继续利用异步复制。利用以下 SQL 查询查抄它:
  1. postgres=# select application_name as server, state,
  2. postgres-#       sync_priority as priority, sync_state
  3. postgres-#       from pg_stat_replication;
  4. | server      | state     | priority | sync_state |
  5. |-------------|-----------|----------|------------|
  6. | walreceiver | streaming | 0        | sync       |
  7. | walreceiver | streaming | 0        | async      |
复制代码
注意:对于更高级的设置,您可以application_name通过设置POSTGRESQL_CLUSTER_APP_NAME环境变量来利用参数定义差别的复制组。
LDAP认证

为了利用 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
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表