详细教程:在 Docker 中部署 PostgreSQL 并使用 pgAdmin 可视化管理

确保 Docker 已安装并处于运行状态,且默认使用 Linux 容器模式(绝大多数场景都适用)。可以在 PowerShell 中用 docker --version 验证。

在 PowerShell 中执行以下命令。这个命令同时设置了端口映射、密码和数据持久化,避免重启后数据丢失。

步骤1. 运行 PostgreSQL 容器

先拉取镜像 docker pull postgres

bash 复制代码
docker run -d --name my-postgres -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=user -e POSTGRES_DB=mydb -v postgres-data:/var/lib/postgresql postgres

这里POSTGRES_USER设置成了user,POSTGRES_PASSWORD设置成了123456,可以更改。

  • -p 5432:5432:把宿主机的 5432 端口映射到容器的 5432 端口,这是 pgAdmin 能连上的前提。
  • -e POSTGRES_PASSWORD:必须设置,否则容器无法正常初始化。请将 your_secure_password 替换成你自己的强密码。
  • -e POSTGRES_USER / POSTGRES_DB:可选,用于自定义默认用户和数据库(不设则用户默认为 postgres)。
  • -v postgres-data :...:使用命名卷持久化数据,即使容器被删除,数据卷中的内容依然保留。

用 docker ps 确认容器状态为 Up

再通过日志验证服务是否就绪:docker logs my-postgres

当看到 database system is ready to accept connections 时,说明 PostgreSQL 已完全启动,可以连接了。

步骤2. 在容器内部用 psql 验证

在动 pgAdmin 之前,先在 Docker 容器内部做一次连接测试,可以排除"是网络问题还是数据库本身有问题"。

bash 复制代码
docker exec -it my-postgres psql -U user-d mydb -c "SELECT version();"

这条命令会直接在容器内用 psql 连接你创建的 mydb 数据库,并输出 PostgreSQL 版本信息。如果能看到版本号,说明数据库本身完全正常,后续 pgAdmin 连不上就纯粹是网络配置问题了。

也可以进入交互式 psql 终端:

bash 复制代码
docker exec -it my-postgres psql -U user -d mydb

进去后可以执行 \l 查看数据库列表,\q 退出

步骤3. 运行pgAdmin

拉取镜像 docker pull dpage/pgadmin4

运行 pgAdmin 容器:

bash 复制代码
docker run -d --name my-pgadmin -p 5050:80 -e PGADMIN_DEFAULT_EMAIL=admin@example.com -e PGADMIN_DEFAULT_PASSWORD=admin123 dpage/pgadmin4

-p 5050:80:将容器内部的 80 端口映射到宿主机的 5050 端口。这是你浏览器要访问的端口。

PGADMIN_DEFAULT_EMAIL / PGADMIN_DEFAULT_PASSWORD:这是 pgAdmin 的登录邮箱和密码,需要自己设定。如果不设置,部分镜像会使用默认值(如 pgadmin4@pgadmin.org / admin),但为了安全,建议显式指定。

打开网址:http://localhost:5050/login

登录刚才运行时的账户和密码,成功进入 pgAdmin 界面后,就可以连接你之前启动的 PostgreSQL 容器了。右键 Servers → Register → Server

先填写名称:

在 Connection 标签页中填写:

验证建表与数据持久化

打开 Query Tool:

把下面这段测试代码复制粘贴到右侧空白的 SQL 编辑器里,并运行:

bash 复制代码
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES
    ('张三', 'zhangsan@example.com'),
    ('李四', 'lisi@example.com'),
    ('王五', 'wangwu@example.com');

SELECT * FROM users;

docker验证建表结果:docker exec -it my-postgres psql -U user -d mydb -c "\dt"

持久化(Persistence)简单来说就是:数据不会因为容器的删除或重启而丢失。

在 Docker 的世界里,容器本身是"用完即弃"的。如果不做特殊处理,你把容器删了,里面的数据也就跟着灰飞烟灭了。

前面启动postgres时,已经用了命名卷 postgres-data,可以做个快速测试:删除容器再重建,数据应该还在。

删除容器:

bash 复制代码
docker rm -f my-postgres 

重新启动一个容器:

bash 复制代码
docker run -d --name my-postgres -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=user -e POSTGRES_DB=mydb -v postgres-data:/var/lib/postgresql postgres

查表:

bash 复制代码
docker exec -it my-postgres psql -U user -d mydb -c "SELECT * FROM users;"
相关推荐
qq_白羊座1 小时前
Hologres / PostgreSQL jsonb 常用函数 & 操作符对照表
数据库·postgresql
aruo3 小时前
Docker Compose 显示 Up,为什么网站还没准备好
docker
kele_z3 小时前
手工修改数据库中的数据时,我会加的四道保险
mysql·postgresql
暖核3 小时前
从零理解 Kubernetes Pod:命名空间、生命周期、Pause 容器详解
云原生·容器·kubernetes
ly76893 小时前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
a5986523 小时前
ARM服务器部署Docker云手机,多开实例性能实测
服务器·arm开发·docker·云手机
ss2734 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
川石课堂软件测试4 小时前
涨薪技术|0到1学会性能测试第8课-Analysis分析图
服务器·数据库·python·sql·jmeter·mysql·容器
7177774 小时前
国内 Docker 镜像仓库推荐:Gitee 与主流方案对比及选型指南
docker·容器·gitee