PostgreSQL数据库docker版本安装以及简单使用和docker-compose.yml启动服务详细介绍

下面把流程按步骤讲清楚:

  1. Linux 上用 Docker 安装并用 docker-compose.yml 启动(详细解释每一项)
  2. 如何在 Linux 下管理/连接/备份 PostgreSQL 容器
  3. 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),并创建 .envinitdb/(后面说明)。

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 端允许远程连接

  1. postgresql.conflisten_addresses = '*'(或指定具体 IP)。

  2. 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.100postgres 如果从容器内访问)
        • Port: 5432
        • Maintenance DB: devdbpostgres
        • Username: admin
        • Password: StrongPass123(可勾选保存密码)
  • Adminer(轻量)访问:http://<HOST_IP>:8080,在页面上填 Host, Port, 用户名, 密码, 数据库。


5) 在 UI(pgAdmin)里做增删改查(Query Tool 示例)

  1. 在 pgAdmin 左侧选择对应 Server -> 选中数据库 -> 右键 Query Tool
  2. 示例 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
  • 点击 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 隧道访问
    • 做定期备份并验证恢复流程

快速操作清单(复制即用)

  1. 准备目录和文件:docker-compose.yml.envinitdb/01_init.sql(可选)、pg_conf/*(若用自定义)
  2. 启动:docker compose up -d
  3. 访问 pgAdmin:http://<HOST_IP>:5050 -> 添加 Server(填 IP、端口、user、pwd)
  4. 其他机器用 psql/DBeaver/pgAdmin 连接 host=<HOST_IP> port=5432 user=admin dbname=devdb password=...
  5. 在 pgAdmin 的 Query Tool 里执行 SQL 做增删改查

相关推荐
IvorySQL21 小时前
PostgreSQL 性能:云端与本地的延迟分析
数据库·postgresql
杨浦老苏1 天前
离线优先的自托管笔记应用Anchor
笔记·docker·群晖
a程序小傲1 天前
听说前端又死了?
开发语言·前端·mysql·算法·postgresql·深度优先
zhongerzixunshi1 天前
能评报告,企业办理有什么作用?
postgresql
逍遥德1 天前
Postgresql 系统表作用解释
数据库·后端·sql·postgresql
哪里不会点哪里.1 天前
Docker
运维·docker·容器
七七powerful1 天前
docker 搭建wtsap代理
运维·docker·容器
Shanxun Liao1 天前
Docker vlmcsd 完整管理指南
运维·docker·容器
Dxy12393102161 天前
PostgreSQL与MySQL有哪些区别:从架构到应用场景的深度解析
mysql·postgresql·架构
l1t1 天前
psql 中的流水线操作(PostgreSQL 18)
数据库·人工智能·postgresql