Docker安装Postgres_16数据库
- 软件开发
- 2025-09-14 22:12:02

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; -- 给用户授权,相关权限: .runoob /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 '); -- 查询数据 SELECT * FROM users; -- 更新数据 UPDATE users SET email = 'newemail@example ' 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 '); INSERT 0 1 mydb=# SELECT * FROM users; id | username | email ----+----------+------------------- 1 | admin | admin@example (1 row) mydb=# UPDATE users SET email = 'newemail@example ' 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操作了;Docker安装Postgres_16数据库由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Docker安装Postgres_16数据库”