一、前置:安装 WSL2(如已安装可跳)
- 以管理员身份打开 PowerShell
wsl--install执行完成后重启电脑,WSL2 环境生效。
作用:Docker Desktop Windows 版底层依赖 WSL2 轻量 Linux 内核。
- 重启后验证 WSL 是否正常
打开 cmd 或者 PowerShell,输入:
wsl--status如果显示默认版本为 2,说明 WSL2 已就绪。也可以运行:
wsl--list--verbose查看已安装的发行版及其版本号。
二、安装 Docker Desktop
(1)普通 PowerShell 执行 winget 安装命令
winget install--id Docker.DockerDesktop--exact- 出现协议询问输入
y回车,自动下载并启动安装程序。
winget 调用微软商店(msstore)源下载软件,需要你同意微软商店的服务协议。提示说会上传你电脑的两位字母地区码(例如 CN 代表中国),只是地区标识,不会上传个人隐私文件。
直接键盘输入大写或者小写y,然后回车 ✅
- 输入 y:同意,开始下载 Docker Desktop
- 输入 n:拒绝,终止安装
UAC 弹窗【是否允许应用更改设备】→ 点是
安装向导:保持Use WSL 2 instead of Hyper-V勾选,一路下一步。
✅安装完成,必须重启电脑
(2) 验证 Docker 是否正常
重启电脑后,从开始菜单打开 Docker Desktop,等待右下角 Docker 图标稳定(引擎启动成功)。
打开 PowerShell 执行:
docker--version输出版本号即 Docker 安装成功。
三、Docker 拉取并启动【PostGIS+PostgreSQL】容器(GIS专用)
普通 Postgres 没有空间能力,postgis/postgis镜像内置 PostGIS 扩展,不用手动创建扩展。
PowerShell 换行符号:反引号`
docker run-d `--name gis-pg `-p 5432:5432 `-e POSTGRES_PASSWORD=123456 `-e POSTGRES_USER=postgres `-e POSTGRES_DB=gis_db `-e TZ=Asia/Shanghai `-v pgdata:/var/lib/postgresql/data`--restart=always ` postgis/postgis:16-3.4参数说明:
-d:后台守护运行--name gis-pg:容器名字,后续操作要用-p 5432:5432:端口映射,本机 5432 映射容器内 5432POSTGRES_PASSWORD=123456:数据库密码,可自行修改POSTGRES_USER=postgres:用户名POSTGRES_DB=gis_db:初始化自动创建数据库名TZ=Asia/Shanghai:时区东八区-v pgdata:/var/lib/postgresql/data:数据持久化,删除容器数据不会丢--restart=always:Docker 开机自动启动数据库postgis/postgis:16-3.4:镜像,PG16 + PostGIS 3.4
执行:
docker run-d--name gis-pg-p 5432:5432-e POSTGRES_PASSWORD=123456-e POSTGRES_USER=postgres-e POSTGRES_DB=gis_db-e TZ=Asia/Shanghai-v pgdata:/var/lib/postgresql/data--restart=always postgis/postgis:16-3.4报错原因
国内直连docker.io(Docker Hub)超时,网络访问不到国外镜像仓库,解决办法:配置国内镜像加速器。
步骤 1:打开 Docker Desktop 设置
- 打开 Docker Desktop,点击右上角 ⚙️Settings
- 找到Docker Engine(引擎配置)
- 把里面的 JSON 全部替换成下面这段(国内镜像源)
{"builder":{"gc":{"defaultKeepStorage":"20GB","enabled":true}},"experimental":false,"registry-mirrors":["https://ccr.ccs.tencentyun.com","https://docker.1panel.live","https://dockerproxy.com","https://docker.m.daocloud.io"]}- 点右下角Apply & restart保存并重启 Docker
⚠️ JSON 格式不能写错,逗号、引号不能少,否则 Docker 启动失败。
步骤 2:重启完成后,重新执行拉取命令
docker run-d--name gis-pg-p 5432:5432-e POSTGRES_PASSWORD=123456-e POSTGRES_USER=postgres-e POSTGRES_DB=gis_db-e TZ=Asia/Shanghai-v pgdata:/var/lib/postgresql/data--restart=always postgis/postgis:16-3.4查看容器运行状态
dockerps看到gis-pg列表代表数据库正常启动。
- STATUS:
Up 38 seconds→ 容器正在运行 - PORTS:
0.0.0.0:5432->5432/tcp→ 宿主机 5432 端口映射成功,可以外部连接
四、数据库连接信息(DBeaver / DataGrip / SpringBoot)
| 配置项 | 值 |
|---|---|
| host | localhost |
| port | 5432 |
| database | gis_db |
| username | postgres |
| password | 123456 |
验证 PostGIS 扩展是否可用
进入数据库内部验证 PostGIS,执行这条命令:
dockerexec-itgis-pg psql-Upostgres-dgis_db进入 psql 命令行后,执行 SQL 检查 PostGIS:
SELECTPostGIS_Version();能输出版本号就代表 PostGIS 扩展(可存储坐标、做空间查询)已经装好。输入\q退出 psql。
五、容器版本切换
docker stop gis-pg只会停止容器,不会删除镜像,也不会删除镜像文件
- 镜像:
postgis/postgis:16-3.4还在你的电脑里,随时可以再起 - 容器:
gis-pg只是停机,只要不执行docker rm gis-pg,数据还保存在这个容器里,可以随时启动回来
👉 想两个容器同时保留(PG16 和 PG14),核心就是:容器名字不能一样、端口不能冲突
场景:保留 PG16,新建 PG14(两个共存)
- 停止当前 PG16 容器(gis-pg)
docker stop gis-pg现在 gis-pg(PG16)处于停止状态,数据保留,随时可以
docker start gis-pg恢复
- 新建 PG14 容器,换名字 + 换宿主机端口(避免 5432 冲突)
宿主机用5433映射容器 5432,这样两个数据库可以按需启动,甚至同时跑
docker run-d--name gis-pg14-p 5433:5432-e POSTGRES_PASSWORD=123456-e POSTGRES_USER=postgres postgis/postgis:14-3.4- 容器名:
gis-pg14(和原来gis-pg区分) - 端口:本地访问 PG14 →
localhost:5433 - PG16(gis-pg)启动后是
localhost:5432
切换使用
- 想用 PG16:
dockerstartgis-pg连接:localhost:5432
- 想用 PG14(Navicat低版本时也可用):
dockerstartgis-pg14连接:localhost:5433
⚠️ 如果两个同时 start,端口不会冲突,因为一个映射 5432,一个 5433,可以同时跑两个 PG。
查看全部容器(包括停止的)
dockerps-a你会看到两个容器:gis-pg(PG16)、gis-pg14(PG14)
区分两个连接信息
- PG16(gis-pg):localhost:5432 → DBeaver 用
- PG14(gis-pg14):localhost:5433 → Navicat 老版本直接连,无 datlastsysoid 报错
原来的 PG16 容器完全不会丢,随时启停,互不影响。
六、常用运维命令
# 停止数据库dockerstop gis-pg# 启动数据库dockerstart gis-pg# 重启数据库dockerrestart gis-pg# 删除容器(数据卷pgdata保留,数据不会丢)dockerrmgis-pg# 进入容器内部psql命令行dockerexec-itgis-pg psql-Upostgres-dgis_db七、总结
通过 WSL2 + Docker Desktop,你可以在 Windows 上快速获得一个带 PostGIS 空间扩展的 PostgreSQL 环境,非常适合 GIS 项目开发与测试。数据通过数据卷持久化,容器可随时重建而不丢失数据。