下面把流程按步骤讲清楚:
- 在 Linux 上用 Docker 安装并用
docker-compose.yml启动(详细解释每一项) - 如何在 Linux 下管理/连接/备份 PostgreSQL 容器
- UI 界面以及使用方法
1) 前提:先安装 Docker & docker-compose(Linux)
(若你已经有 Docker,可跳过)
Ubuntu / Debian(示例命令):
bash
# 更新并安装依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 key + repo,然后安装 docker engine
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动并允许开机自启
sudo systemctl enable --now docker
# 可选:允许当前用户使用 docker(注销/登录后生效)
sudo usermod -aG docker $USER
docker-compose:现在常见做法是使用 Compose V2(集成到 docker CLI):
bash
docker compose version # 注意是没有短横线的 compose
如果没有 docker compose,可以安装 docker-compose 二进制或使用 pip 安装,但推荐使用 Docker 官方方法。
2) docker-compose.yml(Postgres + 可选 pgAdmin) --- 推荐配置(详细注释)
在项目目录创建 docker-compose.yml:
yaml
version: "3.9"
services:
postgres:
image: postgres:16 # 使用稳定/你需要的版本
container_name: my_postgres
restart: unless-stopped
env_file: # 把敏感配置放到 .env(可选)
- ./postgres.env
ports:
- "5432:5432" # 将容器的 5432 暴露到主机(用于本地开发)
volumes:
- pgdata:/var/lib/postgresql/data # 永久化数据(Named volume)
- ./initdb:/docker-entrypoint-initdb.d:ro # 初始化 SQL / 脚本 (可选)
networks:
- dbnet
pgadmin:
image: dpage/pgadmin4
container_name: my_pgadmin
restart: unless-stopped
environment:
PGADMIN_DEFAULT_EMAIL: admin@local
PGADMIN_DEFAULT_PASSWORD: admin123
ports:
- "5050:80"
depends_on:
- postgres
networks:
- dbnet
volumes:
pgdata:
networks:
dbnet:
driver: bridge
说明与要点:
env_file: ./postgres.env:将敏感信息放.env管理,示例内容见下。volumes.pgdata:保证容器重建/更新时数据不丢失。./docker-entrypoint-initdb.d(这里用initdb):将初始化 SQL/脚本挂载到容器内,Postgres 容器首次启动时会自动运行这些脚本(只在初始化时跑一次)。ports "5432:5432":把容器端口映射到宿主机,方便本机工具或其他容器连接。如果你不想暴露端口(生产),可以只使用内部网络和服务发现。pgAdmin只是方便管理,可以省去。
创建 .env(示例):
POSTGRES_USER=admin
POSTGRES_PASSWORD=StrongPass123
POSTGRES_DB=devdb
initdb 目录可以放 01_create_extensions.sql / 02_init_data.sql 等:
initdb/01_init.sql
sql
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
email TEXT
);
3) 启动/停止/日志/查看(Linux)
在 docker-compose.yml 同级目录运行:
bash
# 启动(后台)
docker compose up -d
# 查看容器状态
docker compose ps
# 查看日志
docker compose logs -f postgres
# 停止
docker compose down
# 若要移除 volumes(谨慎)
docker compose down -v
第一次启动时,如果 pgdata 是空的,Postgres 会执行 initdb、创建用户/数据库并运行 docker-entrypoint-initdb.d 中的脚本。
4) 在 Linux 主机上连接 PostgreSQL
- 使用
psql(在宿主机安装postgresql-client)
bash
# 安装客户端(Ubuntu)
sudo apt install -y postgresql-client
# 使用 psql 连接
psql "host=localhost port=5432 user=admin dbname=devdb password=StrongPass123"
# 或
PGPASSWORD=StrongPass123 psql -h localhost -U admin -d devdb
- 使用容器内部
psql:
bash
docker exec -it my_postgres psql -U admin -d devdb
- 使用 pgAdmin:浏览器访问
http://localhost:5050,用 pgAdmin 创建一个 Server,host=postgres 或 127.0.0.1 取决于你是从宿主机还是从容器内访问。
5) 备份与恢复(Linux)
- 备份(导出一个数据库):
bash
# 在宿主机上用 pg_dump(需要安装客户端)
PGPASSWORD=StrongPass123 pg_dump -h localhost -U admin -F c -b -v -f devdb.backup devdb
- 恢复:
bash
PGPASSWORD=StrongPass123 pg_restore -h localhost -U admin -d devdb -v devdb.backup
- 或用 SQL 文本导出/导入:
bash
PGPASSWORD=StrongPass123 pg_dump -h localhost -U admin -F p -f devdb.sql devdb
psql -h localhost -U admin -d devdb -f devdb.sql
- 也可以在容器内运行
pg_dump:
bash
docker exec -t my_postgres pg_dump -U admin devdb > devdb.sql
一句话结论
有 UI: 常用的有 pgAdmin(网页 UI) 、Adminer(轻量网页) 、以及桌面客户端如 DBeaver / TablePlus / HeidiSQL 。下面给出可直接运行的 docker-compose.yml(含 pgAdmin & Adminer)、如何允许其他 Linux/Windows 机器访问、以及在 pgAdmin(网页 UI)中做增删改查的示例操作。
1) 推荐的 docker-compose(含 PostgreSQL + pgAdmin + Adminer)
把下面 docker-compose.yml 放入目录(例如 /opt/postgres-docker),并创建 .env 与 initdb/(后面说明)。
yaml
version: "3.9"
services:
postgres:
image: postgres:16
container_name: my_postgres
restart: unless-stopped
env_file:
- ./.env
ports:
- "5432:5432" # 映射到宿主机,允许外部访问
volumes:
- pgdata:/var/lib/postgresql/data # 数据持久化
- ./initdb:/docker-entrypoint-initdb.d:ro # 初始化脚本(首次启动执行)
- ./pg_conf/postgresql.conf:/etc/postgresql/postgresql.conf:ro # 自定义 postgresql.conf(可选)
command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
pgadmin:
image: dpage/pgadmin4
container_name: my_pgadmin
restart: unless-stopped
environment:
PGADMIN_DEFAULT_EMAIL: admin@local
PGADMIN_DEFAULT_PASSWORD: admin123
ports:
- "5050:80"
depends_on:
- postgres
adminer:
image: adminer
container_name: my_adminer
restart: unless-stopped
ports:
- "8080:8080"
depends_on:
- postgres
volumes:
pgdata:
.env 示例(与 docker-compose.yml 同目录):
POSTGRES_USER=admin
POSTGRES_PASSWORD=StrongPass123
POSTGRES_DB=devdb
initdb/01_init.sql(首次初始化时会运行)可选示例:
sql
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
email TEXT
);
pg_conf/postgresql.conf(必须创建,否则去掉相关挂载/command)示例(关键点:监听所有地址):
# 只示必要项示例
listen_addresses = '*' # 接受来自外部的连接
port = 5432
logging_collector = on
说明:我们通过把自定义
postgresql.conf挂载到容器并用command指定config_file来覆盖默认 listen_addresses。另一项重要配置是pg_hba.conf(下面说明如何允许远程 IP 登录)。
2) 允许远程访问(其它 Linux / Windows 可连)
要让网络内其他机器访问 Postgres,需要两步:
A. PostgreSQL 端允许远程连接
-
postgresql.conf:listen_addresses = '*'(或指定具体 IP)。 -
pg_hba.conf:添加允许远程登录的规则,例如允许所有内网:在 pg_hba.conf 中添加一行(如果你在容器外修改或挂载自定义文件)
host all all 0.0.0.0/0 md5
或更严格一点:仅允许特定网段 192.168.1.0/24
host all all 192.168.1.0/24 md5
如何把自定义 pg_hba.conf 挂载到容器(示例思路):
- 在宿主机目录
pg_conf/pg_hba.conf创建上述内容,然后在docker-compose.yml中再增加一个挂载:
yaml
- ./pg_conf/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf:ro
注意:Postgres 在初始化后(已有数据卷)不会自动使用新挂载的
pg_hba.conf,有时需要重启或在首次 init 时放置配置,或者进入容器手动替换并重启 Postgres 进程。
B. 宿主机防火墙 / 云安全组
- Linux(ufw)示例:
bash
# 允许内网访问 5432
sudo ufw allow from 192.168.1.0/24 to any port 5432
# 或允许所有(不推荐生产)
sudo ufw allow 5432/tcp
- 云主机(AWS/GCP/Azure)需要在安全组/防火墙规则中允许 5432 入站(仅允许你的 IP 或内网网段)。
C. 测试连通性(从另一台机器)
bash
# 简单 ping 检查宿主机可达(若 ICMP 被屏蔽,则跳过)
ping <POSTGRES_HOST_IP>
# 用 psql(需要安装 client)
PGPASSWORD=StrongPass123 psql -h <POSTGRES_HOST_IP> -U admin -d devdb -p 5432
# 或用 nc 检查端口
nc -vz <POSTGRES_HOST_IP> 5432
3) 启动 / 管理
在 docker-compose.yml 所在目录执行:
bash
docker compose up -d
docker compose ps
docker compose logs -f postgres
docker compose down
# 若要清空数据卷(谨慎)
docker compose down -v
首次启动会执行 initdb 中的 SQL(若存在)并创建用户/数据库。
4) Web UI(pgAdmin / Adminer)如何访问与在 pgAdmin 中添加 Server
-
打开浏览器访问:
http://<HOST_IP>:5050(pgAdmin)-
登录:
admin@local/admin123(上面 compose 配置) -
添加 Server(右键 Servers -> Create -> Server):
-
General -> Name:
my_postgres -
Connection:
- Host name/address:
host IP(例如192.168.1.100或postgres如果从容器内访问) - Port:
5432 - Maintenance DB:
devdb或postgres - Username:
admin - Password:
StrongPass123(可勾选保存密码)
- Host name/address:
-
-
-
Adminer(轻量)访问:
http://<HOST_IP>:8080,在页面上填 Host, Port, 用户名, 密码, 数据库。
5) 在 UI(pgAdmin)里做增删改查(Query Tool 示例)
- 在 pgAdmin 左侧选择对应 Server -> 选中数据库 -> 右键
Query Tool。 - 示例 SQL 操作:
- 创建表:
sql
CREATE TABLE IF NOT EXISTS customers (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT
);
- 插入数据:
sql
INSERT INTO customers (name, email) VALUES ('Alice', 'alice@example.com');
- 查询:
sql
SELECT * FROM customers;
- 更新:
sql
UPDATE customers SET email = 'alice2@example.com' WHERE name = 'Alice';
- 删除:
sql
DELETE FROM customers WHERE name = 'Alice';
在 pgAdmin 的 UI 下,执行后会在下方显示结果或影响的行数。
6) 用桌面客户端(Windows)连接(例如 DBeaver)
-
新建连接选择 PostgreSQL;
-
填写:
- Host:
<POSTGRES_HOST_IP>(Linux 服务器 IP) - Port:
5432 - Database:
devdb - Username:
admin - Password:
StrongPass123
- Host:
-
点击 Test Connection(测试通过即可保存并连接)。DBeaver 提供表浏览、SQL 编辑、导入导出等功能。
7) 使用命令行做 CRUD(psql)
在任一能连到数据库的机器上安装 postgresql-client,然后:
bash
# 进入交互
PGPASSWORD=StrongPass123 psql -h <HOST_IP> -U admin -d devdb
# 或单条执行
PGPASSWORD=StrongPass123 psql -h <HOST_IP> -U admin -d devdb -c "SELECT * FROM customers;"
常用 SQL 同上(CREATE / INSERT / SELECT / UPDATE / DELETE)。
8) 在应用(如 FastAPI)里的连接字符串示例
-
同步 psycopg2:
postgresql://admin:StrongPass123@<HOST_IP>:5432/devdb
-
异步 asyncpg:
postgresql+asyncpg://admin:StrongPass123@<HOST_IP>:5432/devdb
确保防火墙与 pg_hba.conf 允许来自应用所在机器的 IP。
9) 备份与恢复(重要)
- 备份(宿主机或远端机器都行):
bash
PGPASSWORD=StrongPass123 pg_dump -h <HOST_IP> -U admin -F c -b -v -f devdb.backup devdb
- 恢复:
bash
PGPASSWORD=StrongPass123 pg_restore -h <HOST_IP> -U admin -d devdb -v devdb.backup
也可以使用 SQL 导出:
bash
pg_dump -h <HOST_IP> -U admin -F p -f devdb.sql devdb
psql -h <HOST_IP> -U admin -d devdb -f devdb.sql
10) 安全建议(必须注意)
-
开发环境可以方便地把
0.0.0.0/0或*用于测试,但生产严禁这样做。生产请:- 仅允许特定 IP 或内网段访问(pg_hba + 防火墙)
- 使用强密码并定期 rotation
- 使用 TLS(SSL)连接(启用
ssl = on并配置证书) - 不要把管理界面暴露到公网上,或用 VPN / SSH 隧道访问
- 做定期备份并验证恢复流程
快速操作清单(复制即用)
- 准备目录和文件:
docker-compose.yml、.env、initdb/01_init.sql(可选)、pg_conf/*(若用自定义) - 启动:
docker compose up -d - 访问 pgAdmin:
http://<HOST_IP>:5050-> 添加 Server(填 IP、端口、user、pwd) - 其他机器用 psql/DBeaver/pgAdmin 连接
host=<HOST_IP> port=5432 user=admin dbname=devdb password=... - 在 pgAdmin 的 Query Tool 里执行 SQL 做增删改查