确保 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;"
