共计 7458 个字符,预计需要花费 19 分钟才能阅读完成。
概述
PostGIS 是 PostgreSQL 数据库的空间数据库扩展,它为 PostgreSQL 提供了存储、索引和查询地理空间数据的能力。通过容器化部署 PostGIS,可以快速搭建空间数据库环境,简化配置流程,并确保环境一致性。
本文档详细介绍了如何使用 Docker 容器化部署 PostGIS,包括环境准备、镜像拉取、容器部署、功能测试、生产环境建议及故障排查等内容。所有操作步骤均经过验证,适用于各类基于 PostGIS 的空间数据应用场景。
环境准备
Docker 环境安装
在开始部署前,需要先安装 Docker 环境。推荐使用以下一键安装脚本,适用于主流 Linux 发行版:
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
脚本执行完成后,可通过以下命令验证 Docker 是否安装成功:
docker --version
docker-compose --version
镜像准备
拉取 PostGIS 镜像
使用以下命令通过轩辕镜像访问支持地址拉取最新版本的 POSTGIS 镜像:
docker pull xxx.xuanyuan.run/postgis/postgis:latest
如需指定其他版本,可参考 PostGIS 镜像标签列表 选择合适的标签,例如拉取 18-3.6 版本:
docker pull xxx.xuanyuan.run/postgis/postgis:18-3.6
验证镜像
拉取完成后,可通过以下命令查看本地镜像列表,确认 PostGIS 镜像已成功拉取:
docker images | grep postgis/postgis
预期输出应包含类似以下信息:
xxx.xuanyuan.run/postgis/postgis latest abc12345 2 weeks ago 1.2GB
容器部署
基本部署
使用以下命令启动一个基本的 PostGIS 容器实例:
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis_data:/var/lib/postgresql/data \
xxx.xuanyuan.run/postgis/postgis:latest
参数说明:
-d: 后台运行容器--name postgis: 指定容器名称为 postgis-p 5432:5432: 映射容器的 5432 端口到主机的 5432 端口-e POSTGRES_PASSWORD: 设置数据库管理员密码-e POSTGRES_USER: 设置数据库管理员用户名-e POSTGRES_DB: 指定默认创建的数据库名称-v postgis_data:/var/lib/postgresql/data: 使用命名卷持久化存储数据
针对 PostgreSQL 18+ 版本的部署
从 PostgreSQL 18 开始,默认数据目录路径已更改为/var/lib/postgresql,因此对于 18+ 版本的 PostGIS 镜像(如18-3.6),应使用以下命令部署:
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis_data:/var/lib/postgresql \
xxx.xuanyuan.run/postgis/postgis:18-3.6
注意:此命令仅适用于 18+ 版本的 PostGIS 镜像,数据卷挂载路径已更改为
/var/lib/postgresql
使用自定义网络
为提高安全性,建议创建专用网络用于 PostGIS 容器与其他应用容器的通信:
# 创建自定义网络
docker network create postgis-network
# 在自定义网络中启动 POSTGIS 容器
docker run -d \
--name postgis \
--network postgis-network \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis_data:/var/lib/postgresql/data \
xxx.xuanyuan.run/postgis/postgis:latest
验证容器状态
容器启动后,可通过以下命令检查容器运行状态:
docker ps | grep postgis
若容器状态正常,输出应包含类似以下信息:
abc123456789 xxx.xuanyuan.run/postgis/postgis:latest "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:5432->5432/tcp postgis
功能测试
查看容器日志
容器启动后,可通过以下命令查看日志,确认服务是否正常启动:
docker logs postgis
正常启动的日志末尾应包含类似以下信息:
PostgreSQL init process complete; ready for start up.
2023-11-16 00:00:00.000 UTC [1] LOG: starting PostgreSQL 16.1 (Debian 16.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2023-11-16 00:00:00.000 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2023-11-16 00:00:00.000 UTC [1] LOG: listening on IPv6 address "::", port 5432
2023-11-16 00:00:00.000 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2023-11-16 00:00:00.000 UTC [1] LOG: database system is ready to accept connections
连接数据库测试
使用以下命令通过容器内的 psql 客户端连接数据库:
docker exec -it postgis psql -U postgres -d gisdb
连接成功后,将进入 psql 命令行界面,可执行以下命令验证 PostGIS 扩展是否已安装:
SELECT postgis_version();
若 PostGIS 安装正常,将返回类似以下结果:
postgis_version
---------------------------------------
3.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
空间数据操作测试
在 psql 命令行中执行以下命令,测试空间数据功能:
-- 创建测试表
CREATE TABLE spatial_test (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
geom GEOMETRY(Point, 4326)
);
-- 插入空间数据
INSERT INTO spatial_test (name, geom)
VALUES ('Test Point', ST_SetSRID(ST_MakePoint(116.4042, 39.9153), 4326));
-- 查询空间数据
SELECT name, ST_AsText(geom) AS wkt FROM spatial_test;
预期输出:
name | wkt
-----------+--------------------------
Test Point | POINT(116.4042 39.9153)
(1 row)
完成测试后,可使用 \q 命令退出 psql 客户端。
生产环境建议
数据持久化
生产环境中,强烈建议使用命名卷或绑定挂载方式持久化存储数据,避免容器删除导致数据丢失:
# 使用命名卷(推荐)docker volume create postgis_data
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-v postgis_data:/var/lib/postgresql/data \
xxx.xuanyuan.run/postgis/postgis:latest
# 或使用绑定挂载
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-v /path/on/host:/var/lib/postgresql/data \
xxx.xuanyuan.run/postgis/postgis:latest
安全配置
- 使用强密码 :确保
POSTGRES_PASSWORD使用复杂密码,并定期更换 - 限制网络访问:避免将数据库端口直接暴露到公网,使用自定义网络隔离服务
- 配置 SSL:启用 SSL 加密数据库连接,增强数据传输安全性
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis_data:/var/lib/postgresql/data \
-v /path/to/ssl/certs:/etc/ssl/postgresql \
xxx.xuanyuan.run/postgis/postgis:latest \
-c ssl=on \
-c ssl_cert_file=/etc/ssl/postgresql/server.crt \
-c ssl_key_file=/etc/ssl/postgresql/server.key
- 最小权限原则:为不同应用创建不同数据库用户,分配最小必要权限
资源限制
根据服务器配置和业务需求,合理设置容器的资源限制:
docker run -d \
--name postgis \
-p 5432:5432 \
-e POSTGRES_PASSWORD=your_secure_password \
-v postgis_data:/var/lib/postgresql/data \
--memory=4g \
--memory-swap=8g \
--cpus=2 \
xxx.xuanyuan.run/postgis/postgis:latest
定期备份
配置定期备份策略,确保数据安全:
# 创建备份脚本 backup-postgis.sh
#!/bin/bash
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/path/to/backups
CONTAINER_NAME=postgis
DB_NAME=gisdb
DB_USER=postgres
mkdir -p $BACKUP_DIR
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -d $DB_NAME -F c -b -v -f /tmp/backup_$TIMESTAMP.dump
docker cp $CONTAINER_NAME:/tmp/backup_$TIMESTAMP.dump $BACKUP_DIR/
docker exec $CONTAINER_NAME rm /tmp/backup_$TIMESTAMP.dump
# 设置权限
chmod +x backup-postgis.sh
# 添加到 crontab,每天凌晨 3 点执行备份
0 3 * * * /path/to/backup-postgis.sh
监控配置
建议集成监控工具,监控数据库运行状态:
- 使用 Docker Stats:实时查看容器资源使用情况
docker stats postgis - 集成 Prometheus 和 Grafana:通过 postgres_exporter 监控数据库性能指标
高可用配置
对于生产环境,可考虑使用主从复制或集群方案提高可用性:
# 创建主节点
docker run -d \
--name postgis-master \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis-master-data:/var/lib/postgresql/data \
-p 5432:5432 \
xxx.xuanyuan.run/postgis/postgis:latest \
-c wal_level=replica \
-c max_wal_senders=5 \
-c max_replication_slots=5
# 创建从节点(示例配置,实际生产需更复杂设置)docker run -d \
--name postgis-slave \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e POSTGRES_DB=gisdb \
-v postgis-slave-data:/var/lib/postgresql/data \
-p 5433:5432 \
xxx.xuanyuan.run/postgis/postgis:latest \
-c hot_standby=on
故障排查
容器无法启动
- 查看日志:容器无法启动时,首先查看日志获取详细错误信息
docker logs postgis - 检查端口占用:确认 5432 端口是否已被其他服务占用
netstat -tulpn | grep 5432 - 检查数据卷权限:若使用绑定挂载,确保宿主机目录权限正确
sudo chown -R 999:999 /path/to/data/directory
PostGIS 更新错误
当遇到 PostGIS 更新相关错误,如OperationalError: could not access file "$libdir/postgis-X.X",可执行以下命令更新 PostGIS 扩展:
docker exec postgis update-postgis.sh
该命令会更新数据库中的 PostGIS 扩展至最新版本,输出类似以下信息:
Updating PostGIS extensions template_postgis to X.X.X
NOTICE: version "X.X.X" of extension "postgis" is already installed
NOTICE: version "X.X.X" of extension "postgis_topology" is already installed
NOTICE: version "X.X.X" of extension "postgis_tiger_geocoder" is already installed
ALTER EXTENSION
Updating PostGIS extensions docker to X.X.X
NOTICE: version "X.X.X" of extension "postgis" is already installed
NOTICE: version "X.X.X" of extension "postgis_topology" is already installed
NOTICE: version "X.X.X" of extension "postgis_tiger_geocoder" is already installed
ALTER EXTENSION
连接问题排查
- 检查容器网络:确认容器是否在正确的网络中
docker network inspect postgis-network - 测试网络连通性:从应用容器测试到 PostGIS 容器的连接
docker run --rm --network postgis-network postgis/postgis psql -h postgis -U postgres -d gisdb -c "SELECT 1" - 检查防火墙设置:确保服务器防火墙允许相关端口通信
sudo ufw status
性能问题排查
- 查看数据库连接数:
docker exec postgis psql -U postgres -c "SELECT count(*) FROM pg_stat_activity;" - 查看慢查询:
docker exec postgis psql -U postgres -c "SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;" - 检查资源使用情况:
docker stats postgis
参考资源
- PostGIS 镜像文档(轩辕)
- PostGIS 镜像标签列表(轩辕)
- PostgreSQL 官方 Docker 镜像文档
- PostGIS 官方文档
- Docker 官方文档
- Docker Hub – postgis/postgis
总结
本文详细介绍了 PostGIS 的 Docker 容器化部署方案,从环境准备、镜像拉取、容器部署到功能测试,提供了完整的操作指南。同时,针对生产环境的安全配置、数据持久化、资源限制等方面给出了建议,并提供了常见故障的排查方法。
关键要点:
- 使用轩辕镜像访问支持可提高 PostGIS 镜像下载访问表现
- 注意 PostgreSQL 18+ 版本的数据目录路径变更
- 生产环境中务必配置数据持久化和定期备份
- 容器化部署时应遵循最小权限原则,限制网络访问
- 遇到 PostGIS 更新错误可使用
update-postgis.sh脚本修复
后续建议:
- 深入学习 PostGIS 空间数据处理功能,充分利用其地理信息处理能力
- 根据实际业务需求优化数据库配置参数,提升性能
- 建立完善的监控和告警机制,及时发现并处理问题
- 定期更新镜像版本,获取最新功能和安全补丁
- 对于大规模部署,考虑使用 Docker Compose 或 Kubernetes 进行编排管理
通过本文档提供的方法,可以快速、安全地部署 PostGIS 容器环境,为各类空间数据应用提供可靠的数据库支持。如需进一步了解 PostGIS 的高级功能和最佳实践,请参考官方文档或相关技术社区资源。







很久没更新了。
大佬,不知道过了这么久这个脚本还有没有在…
被投诉下线了。
点了那个链接?
被投诉下线了。
https://idea.hacks.t…