好的,使用 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 postgres
docker-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.1
5432
postgres
POSTGRES_PASSWORD
(如 mysecretpassword
)postgres
或你设置的 POSTGRES_DB
(如 mydatabase
)你可以使用任何 PostgreSQL 客户端(如 DBeaver、DataGrip、VSCode 插件)或编程语言(如 Python 的 psycopg2
)通过上述参数进行连接。
http://localhost:8080
docker-compose.yml
中设置的邮箱和密码登录(如 admin@example.com
/ adminpassword
)。Docker Postgres
)my-postgres
(**注意:** 因为在同一自定义网络下,可以直接使用容器名作为主机名)5432
postgres
postgres
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 应用的最佳实践。