mkdir -p ~/postgres-server
cd ~/postgres-server
# 使用 .env 文件存储敏感凭据
touch .env
# Docker Compose v2+ 推荐使用 compose.yml
touch compose.yml
将所有敏感信息(如密码、用户名)存储在 .env 文件中,可以避免将它们硬编码到配置文件中。
your_very_strong_passwordDB_USER=postgres
DB_PASSWORD=your_very_strong_password
DB_NAME=postgres
COMPOSE_PROJECT_NAME=pg_server
services:
database:
image: postgres:17
container_name: ${COMPOSE_PROJECT_NAME}-db
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
ports:
- '127.0.0.1:5432:5432'
volumes:
- db-data:/var/lib/postgresql/data
networks:
- default
volumes:
db-data:
name: ${COMPOSE_PROJECT_NAME}-data-volume
networks:
default:
name: ${COMPOSE_PROJECT_NAME}-network
在 ~/postgres-server 目录下启动数据库。
docker compose up -d
检查容器是否正在运行,并尝试连接到数据库。
docker compose ps
docker compose exec database psql -U postgres -d postgres
成功连接后,将看到 postgres=> 提示符。输入 \q 退出。
如果项目需要处理地理数据(例如,存储经纬度、计算距离、处理地图瓦片),需要使用带有 PostGIS 扩展的 PostgreSQL 镜像。
services:
database:
image: postgis/postgis:17-3.4
# ... 其余配置保持不变 ...
重启服务使配置生效
docker compose down
docker compose up -d
即使使用了 PostGIS 镜像,仍需要在目标数据库中手动激活扩展。
docker compose exec database psql -U postgres -d postgres
psql 提示符后,运行以下 SQL 命令:-- 激活 PostGIS 核心功能
CREATE EXTENSION postgis;
-- (可选) 激活拓扑支持
CREATE EXTENSION postgis_topology;
-- (可选) 激活栅格数据支持
CREATE EXTENSION postgis_raster;
\dx 命令,应该能看到 postgis 及其他已安装的扩展。postgres=> \dx
List of installed extensions
Name | Version | Schema | Description
------------------------+---------+------------+------------------------------------------------------------
fuzzystrmatch | 1.2 | public | determine similarities and distance between strings
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.5.2 | public | PostGIS geometry and geography spatial types and functions
postgis_raster | 3.5.2 | public | PostGIS raster types and functions
postgis_tiger_geocoder | 3.5.2 | tiger | PostGIS tiger geocoder and reverse geocoder
postgis_topology | 3.5.2 | topology | PostGIS topology spatial types and functions
(6 rows)
现在,PostgreSQL 数据库已完全具备处理地理空间数据的能力。
当需要使用 Navicat、DBeaver 或其他桌面客户端连接服务器上的数据库时,强烈推荐通过 SSH 隧道进行连接,以确保安全。
在 Navicat 中配置 SSH 隧道:
localhost 或 127.0.0.1 (连接到本地隧道)5432postgres (或在 .env 中设置的 DB_NAME)postgres (或 DB_USER).env 文件中设置的 DB_PASSWORDyour_ipv4_address)22root (或用于 SSH 登录的用户名)~/.ssh/id_ed25519)。