PostgreSQL简介
PostgreSQL 是一个功能强大、开源的关系型数据库管理系统(RDBMS),以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能,适用于各种规模的应用程序; 适用传统的IT服务系统关系型数据库开发与应用,也适用于互联网行业高并发、大数据量存储等数据需求;
Portainer拉取镜像
在Portainer平台Images界面Image的文本框中输入postgres:16.6,点击Pull the image即开始远程到(Docker Hub)中央仓库拉取image镜像文件,如果不确定可用的镜像版本有哪些,可以点击Search跳转到docker官方中央仓库平台,检索postgres相关资源与可用tags标签;

进入postgres镜像资源详情页,展示了所有可用版本tags标签以及官方提供的Dockerfile版本;根据我们的需要来选择,本文中选择的是16.6版本;

当在Portainer平台Images界面中成功拉取
postgres:16.6镜像后,我们就可以在Containers中快速创建postgres数据库的docker容器系统;

创建Docker容器
拉取Postgres镜像后,可直接在Portainer平台上创建docker容器运行应用服务;在左侧Containers页面点击Add container,进入创建容器配置页,在Image中输入:
postgres:16.6,设置映射端口Port mapping:
5432》5432

在Volumes中配置docker服务主机与docker容器中映射的卷目录,其中container指docker容器内目录,host指docker服务主机物理目录,用于Postgresql运行产生的数据目录进行容器外维护,防止容器故障数据丢失;
注意:docker容器非常适合无状态服务,但对于具有产生数据的有状态服务,如:数据库、消息队列等,一定要创建dokcer容器映射卷目录,将数据同步到docker服务主机的物理目录中;

配置postgres服务运行参数,可通过添加docker容器内系统服务的环境变量来配置,如:
POSTGRES_USER=root(数据库用户名),
POSTGRES_PASSWORD=123456(数据库密码)

在Portainer平台上默认创建的docker容器没有CPU、内存等资源限制,当多个服务运行时,会存在资源占用过高与竞争,从而影响到所有Docker服务主机上容器与程序,因此我们需要在Runtime & resources中进行资源限制;
- Memory reservation(MB):表示预留内存,应用运行过程中需要从内存中交换到磁盘的缓存空间,少于Memory limit即可;
- Memory limit(MB):表示内存使用最大限制,需大于Memory reservation;
- Maximum CPU usage:表示CPU使用量限制;

当然上述操作,也可以通过docker run命令行的方式,分配固定的资源空间,来创建postgres数据库容器;
docker run -d \
--name postgres-16.6 \
-c 2 -m 1G --memory-swap=1536m \
-p 5432:5432 \
-e POSTGRES_PASSWORD=123456 \
-e POSTGRES_USER=root \
-v /opt/docker/sysdata/postgre_data/16/data:/var/lib/postgresql/data \
postgres:16.6
通过docker run命令创建基于postgres:16.6镜像为基础的数据库容器;
其中通过-c和-m、--memory-swap限制运行可用的cpu数量、内存大小、可交换缓存大小;
通过-e来添加docker容器系统中的环境变量,表示创建数据库默认初始化用户,POSTGRES_USER=root(数据库用户名),POSTGRES_PASSWORD=123456(数据库密码);
因测试环境资源有限,此处只分配了2cpu、1g内存、总计1.5G最大内存交换空间(可缓存到磁盘的缓冲空间);
需注意的是:在PostgreSQL中,并没有传统意义上的“root”用户,这是与MySQL等其他数据库系统的一个显著差异。在 PostgreSQL 中,所有用户都是基于角色的,而这些角色被赋予不同的权限。
因此用户名虽为root,实际为普通账户,非超级管理员账户;

执行后,无报错并成功返回容器ID;
在Portainer中的Containers界面刷新后,即可看到我们创建的postgres-16.6容器正在运行中的,并且可以通过此界面功能管理postgres数据库运行、停止、重启、暂停等,以及查看docker容器详情、容器删除、容器状态监控等;

容器内sql测试
在docker服务主机上,通过
docker exec -it <容器ID> /bin/base,进入已安装Postgres数据库的docker容器系统中,查看容器文件信息;
[root@centos72 data]# docker exec -it 0e9ec34ba941 /bin/bash
root@0e9ec34ba941:/# ls
bin boot dev docker-entrypoint-initdb.d etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
在当前容器系统中测试数据库SQL语句,执行psql,由于默认就是超级管理账户访问,因此无需用户名和密码就可以直接进入到postgres数据库中;
以下为数据库测试使用语句
--查看所有库实例
\l
-- 创建新数据库,注意:psql中没有mysql中传统意义的"root"账户,此root只是单纯在数据库上已建用户而已
CREATE DATABASE mydb OWNER root;
-- 给用户授权,相关权限:https://www.runoob.com/postgresql/postgresql-privileges.html
GRANT ALL PRIVILEGES ON DATABASE mydb TO root;
-- 连接到数据库
\c mydb
-- 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(255)
);
-- 查询已建的表
\dt
-- 或
SELECT * FROM pg_catalog.pg_tables WHERE schemaname='public';
-- 插入数据
INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
-- 查询数据
SELECT * FROM users;
-- 更新数据
UPDATE users SET email = 'newemail@example.com' WHERE username = 'admin';
-- 删除数据
DELETE FROM users WHERE username = 'admin';
-- 退出命令行
\q
以下是数据库SQL语句执行日志
root@0e7ec34ert42:/# psql
psql (16.6 (Debian 16.6-1.pgdg120+1))
Type "help" for help.
root=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+-------+----------+-----------------+------------+------------+------------+-----------+-------------------
postgres | root | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
root | root | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | root | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/root +
| | | | | | | | root=CTc/root
template1 | root | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/root +
| | | | | | | | root=CTc/root
(4 rows)
root=# \dt
Did not find any relations.
root=# select version();
version
---------------------------------------------------------------------------------------------------------------------
PostgreSQL 16.6 (Debian 16.6-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
(1 row)
root=# CREATE DATABASE mydb OWNER root;
CREATE DATABASE
root=# GRANT ALL PRIVILEGES ON DATABASE mydb TO root;
GRANT
root=# \c mydb
You are now connected to database "mydb" as user "root".
mydb=# CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(255)
);
CREATE TABLE
mydb=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------+-------+-------
public | users | table | root
(1 row)
mydb=# SELECT * FROM pg_catalog.pg_tables WHERE schemaname='public';
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+-----------+------------+------------+------------+----------+-------------+-------------
public | users | root | | t | f | f | f
(1 row)
mydb=# INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
INSERT 0 1
mydb=# SELECT * FROM users;
id | username | email
----+----------+-------------------
1 | admin | admin@example.com
(1 row)
mydb=# UPDATE users SET email = 'newemail@example.com' WHERE username = 'admin';
UPDATE 1
mydb=# select * from information_schema.table_privileges where table_name = 'users';
grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy
---------+---------+---------------+--------------+------------+----------------+--------------+----------------
root | root | mydb | public | users | INSERT | YES | NO
root | root | mydb | public | users | SELECT | YES | YES
root | root | mydb | public | users | UPDATE | YES | NO
root | root | mydb | public | users | DELETE | YES | NO
root | root | mydb | public | users | TRUNCATE | YES | NO
root | root | mydb | public | users | REFERENCES | YES | NO
root | root | mydb | public | users | TRIGGER | YES | NO
(7 rows)
mydb=# \q
进入到docker容器系统的postgres数据库安装目录/var/lib/postgresql/data中,此时已生成数据库相关配置与文件;

输出exit退出docker容器系统,回到docker服务器主机系统中;
进入我们在创建postgres容器时指定的卷映射目录:/opt/docker/sysdata/postgre_data/16/data中,数据库配置与文件同步映射;

客户端连接Postgres
通过DBeaver数据库客户端工具,远程成功访问到Postgres数据库后,即可执行SQL操作了;
