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 做增删改查

相关推荐
qq_2153978972 小时前
shell 脚本部署docker 服务MySQL 5.7
mysql·adb·docker
计算衎2 小时前
基于pgAdmin4 Web UI界面实现连接docker 版PostgreSQL实现增删改查操作
docker·postgresql·docker-compose
❀͜͡傀儡师3 小时前
Docker一键部署Flatnas,比Sun-Panel更优雅
运维·docker·容器
永不停歇的蜗牛3 小时前
K8S之Ctr 和 Docker的区别
docker·kubernetes·dubbo
❀͜͡傀儡师3 小时前
docker一键部署kafka
docker·容器·kafka
IT运维爱好者3 小时前
【国产】华为欧拉操作系统openEuler-LTS-22.03安装Docker-Compose保姆级教程
docker·容器·openeuler·欧拉
我叫安查查3 小时前
在Ubuntu系统上使用docker部署GPUStack教程【亲测成功】
linux·ubuntu·docker·gpustack
脑壳疼___4 小时前
ubuntu安装postgresql、postgis、pgrouting
linux·ubuntu·postgresql
晨欣4 小时前
Dify Custom Tool 调用超时问题排查与解决方案(claude-4.5-opus-high)
docker·容器·dify