第一节 使用Docker安装 PostgreSQL

亮子 2025-09-26 15:11:13 136 0 0 0

好的,使用 Docker 安装 PostgreSQL 非常简单、快速,并且能保持环境干净。下面我将为你提供从基础到进阶的详细指南。

方法一:最快速的安装(适合测试开发)

这条命令可以直接运行一个 PostgreSQL 容器,无需任何额外文件。

docker run -d \
  --name my-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  postgres:16

命令解释:
* docker run -d: 在后台(守护进程模式)运行一个新容器。
* --name my-postgres: 为容器指定一个名字,方便后续管理(启动、停止)。
* -e POSTGRES_PASSWORD=mysecretpassword: 设置环境变量。这是**必须的**环境变量,它设置了 postgres 超级用户的密码。**请务必将其更改为一个强密码!**
* -p 5432:5432: 端口映射。将容器内部的 PostgreSQL 默认端口(5432)映射到主机的 5432 端口。格式为 主机端口:容器端口
* postgres:16: 使用的镜像名称和标签。推荐指定主要版本号(如 16)而不是 latest,以保证稳定性。

验证是否运行成功:

docker ps

你应该能看到名为 my-postgres 的容器状态为 “Up”。


方法二:推荐的使用方式(数据持久化 + 配置)

方法一的问题在于,如果容器被删除,所有数据也会丢失。为了**持久化存储**数据,我们需要使用 Docker 卷(Volume) 将容器内的数据目录挂载到主机上。

1. 创建网络(用于连接其他容器,如PgAdmin)

docker network create postgres-network

2. 运行 PostgreSQL 容器并挂载卷

docker run -d \
  --name my-postgres \
  --network postgres-network \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=mydatabase \        # 可选:初始化时创建一个名为 'mydatabase' 的数据库
  -e PGDATA=/var/lib/postgresql/data/pgdata \ # 可选:明确数据目录路径
  -v postgres_data:/var/lib/postgresql/data \ # 关键:将数据目录挂载到名为 'postgres_data' 的卷
  -p 5432:5432 \
  postgres:16

命令解释:
* -v postgres_data:/var/lib/postgresql/data: 这是关键!
* postgres_data 是 Docker 管理的卷的名称。Docker 会自动在主机上创建一个名为 postgres_data 的卷来存储数据。
* /var/lib/postgresql/data 是容器内 PostgreSQL 默认存储数据的路径。
* 即使容器被删除,卷 postgres_data 也会保留。下次启动新容器时,只需重新挂载这个卷,数据就会恢复。
* -e POSTGRES_DB=mydatabase: 容器启动时会自动创建一个名为 mydatabase 的数据库(可选)。
* --network postgres-network: 将容器加入一个自定义网络,以便其他容器(如 pgAdmin)可以通过容器名 my-postgres 直接访问它。

查看创建的卷:

docker volume ls

方法三:使用 Docker Compose(最佳实践)

对于复杂的应用,使用 docker-compose.yml 文件是管理多个容器(如 PostgreSQL + PgAdmin)的最佳方式。

  1. 创建一个项目目录
    mkdir docker-postgres && cd docker-postgres
  1. 创建 docker-compose.yml 文件
    version: '3.8'

    services:
      postgres:
        image: postgres:16
        container_name: my-postgres
        environment:
          POSTGRES_PASSWORD: mysecretpassword  # 设置超级用户密码
          POSTGRES_DB: mydatabase              # 可选:初始化数据库
          PGDATA: /var/lib/postgresql/data/pgdata
        volumes:
          - postgres_data:/var/lib/postgresql/data  # 持久化数据
        ports:
          - "5432:5432"
        networks:
          - postgres-net
        restart: unless-stopped                 # 容器意外退出时自动重启

      pgadmin:                                # 可选:同时安装 pgAdmin 管理工具
        image: dpage/pgadmin4
        container_name: my-pgadmin
        environment:
          PGADMIN_DEFAULT_EMAIL: admin@example.com  # 设置登录邮箱
          PGADMIN_DEFAULT_PASSWORD: adminpassword    # 设置登录密码
        ports:
          - "8080:80"                               # 将 pgAdmin 映射到主机 8080 端口
        networks:
          - postgres-net
        restart: unless-stopped
        depends_on:
          - postgres

    volumes:
      postgres_data:                            # 声明卷,Docker 会自动管理

    networks:
      postgres-net:                             # 声明网络
  1. 启动服务
    在包含 docker-compose.yml 文件的目录下运行:
    docker-compose up -d
`-d` 表示在后台运行。
  1. 管理服务
    • 停止服务docker-compose down(**注意:** 这会停止并删除容器,但数据卷 postgres_data 会被保留)
    • 查看日志docker-compose logs postgres
    • 重启服务docker-compose restart

如何连接和使用

1. 通过命令行(psql) inside the container

# 1. 进入容器内部的 bash shell
docker exec -it my-postgres bash

# 2. 在容器内部,使用 psql 连接
psql -U postgres -d mydatabase

# 或者直接一行命令执行
docker exec -it my-postgres psql -U postgres -d mydatabase

2. 通过主机上的客户端连接

  • 主机localhost127.0.0.1
  • 端口5432
  • 用户名postgres
  • 密码:你设置的 POSTGRES_PASSWORD(如 mysecretpassword
  • 数据库postgres 或你设置的 POSTGRES_DB(如 mydatabase

你可以使用任何 PostgreSQL 客户端(如 DBeaver、DataGrip、VSCode 插件)或编程语言(如 Python 的 psycopg2)通过上述参数进行连接。

3. 通过 pgAdmin(如果使用了 Docker Compose)

  1. 在浏览器中打开 http://localhost:8080
  2. docker-compose.yml 中设置的邮箱和密码登录(如 admin@example.com / adminpassword)。
  3. 添加新服务器:
    • General -> Name: 任意名称(如 Docker Postgres
    • Connection -> Host name/address: my-postgres(**注意:** 因为在同一自定义网络下,可以直接使用容器名作为主机名)
    • Connection -> Port: 5432
    • Connection -> Maintenance database: postgres
    • Connection -> Username: postgres
    • Connection -> Password: mysecretpassword

常用管理命令

  • 查看运行日志docker logs my-postgres
  • 停止容器docker stop my-postgres
  • 启动已停止的容器docker start my-postgres
  • 删除容器(**会丢失未挂载卷的数据!**):docker rm my-postgres
  • 删除数据卷(**数据将永久丢失!**):docker volume rm postgres_data

总结

方法 优点 适用场景
方法一:简单 run 最简单快捷 快速测试,数据不重要
方法二:使用 Volume 数据持久化,安全 开发、测试环境,需要保留数据
方法三:Docker Compose 功能最强,管理方便,可多容器协作 生产、开发、测试环境首选

对于大多数情况,**强烈推荐使用 Docker Compose (方法三)**,它通过一个文件清晰地定义了所有配置和依赖,是管理和维护 Docker 应用的最佳实践。