好的,使用 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) 将容器内的数据目录挂载到主机上。
docker network create postgres-network
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.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 postgresdocker-compose restart# 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
localhost 或 127.0.0.15432postgresPOSTGRES_PASSWORD(如 mysecretpassword)postgres 或你设置的 POSTGRES_DB(如 mydatabase)你可以使用任何 PostgreSQL 客户端(如 DBeaver、DataGrip、VSCode 插件)或编程语言(如 Python 的 psycopg2)通过上述参数进行连接。
http://localhost:8080docker-compose.yml 中设置的邮箱和密码登录(如 admin@example.com / adminpassword)。Docker Postgres)my-postgres(**注意:** 因为在同一自定义网络下,可以直接使用容器名作为主机名)5432postgrespostgresmysecretpassworddocker logs my-postgresdocker stop my-postgresdocker start my-postgresdocker rm my-postgresdocker volume rm postgres_data| 方法 | 优点 | 适用场景 |
|---|---|---|
| 方法一:简单 run | 最简单快捷 | 快速测试,数据不重要 |
| 方法二:使用 Volume | 数据持久化,安全 | 开发、测试环境,需要保留数据 |
| 方法三:Docker Compose | 功能最强,管理方便,可多容器协作 | 生产、开发、测试环境首选 |
对于大多数情况,**强烈推荐使用 Docker Compose (方法三)**,它通过一个文件清晰地定义了所有配置和依赖,是管理和维护 Docker 应用的最佳实践。