好的,使用 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)的最佳方式。
- 创建一个项目目录:
mkdir docker-postgres && cd docker-postgres
- 创建
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: # 声明网络
- 启动服务:
在包含docker-compose.yml文件的目录下运行:
docker-compose up -d
`-d` 表示在后台运行。
- 管理服务:
- 停止服务:
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. 通过主机上的客户端连接
- 主机:
localhost或127.0.0.1 - 端口:
5432 - 用户名:
postgres - 密码:你设置的
POSTGRES_PASSWORD(如mysecretpassword) - 数据库:
postgres或你设置的POSTGRES_DB(如mydatabase)
你可以使用任何 PostgreSQL 客户端(如 DBeaver、DataGrip、VSCode 插件)或编程语言(如 Python 的 psycopg2)通过上述参数进行连接。
3. 通过 pgAdmin(如果使用了 Docker Compose)
- 在浏览器中打开
http://localhost:8080 - 用
docker-compose.yml中设置的邮箱和密码登录(如admin@example.com/adminpassword)。 - 添加新服务器:
- General -> Name: 任意名称(如
Docker Postgres) - Connection -> Host name/address:
my-postgres(**注意:** 因为在同一自定义网络下,可以直接使用容器名作为主机名) - Connection -> Port:
5432 - Connection -> Maintenance database:
postgres - Connection -> Username:
postgres - Connection -> Password:
mysecretpassword
- General -> Name: 任意名称(如
常用管理命令
- 查看运行日志:
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 应用的最佳实践。