容器数据库连接
情景: 当前博客项目的数据库在容器内。整个服务器只暴露443端口。我没有开启5432端口,又想安全的查看
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f204a2a739f nginx:alpine "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp blog-nginx
ef3219d15dec blog-blog-web "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 3000/tcp blog-web
3e4ad3e3fcce blog-backend "uv run uvicorn main…" 4 minutes ago Up 4 minutes (healthy) 8000/tcp blog-backend
39f45cb091a2 postgres:18-alpine "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 5432/tcp blog-postgres
1205837baa0e blog-frontend "/docker-entrypoint.…" 4 minutes ago Up 4 minutes (healthy) 80/tcp blog-admin
如果我想查看数据库,直接在终端操作太麻烦。只想本地电脑远程连接。
我的做法是使用SSH 隧道映射端口到宿主主机
你的电脑:5432 → SSH加密隧道 → 远程服务器:localhost:5432
↑ ↓
Navicat/DBeaver PostgreSQL容器
(以为连的是本地数据库) (实际处理请求的服务)
教程
1. (可选)你可以先获取你的<容器名>
如果不是容器部署数据库不用看
docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
<容器名>
| 部分 | 含义 |
|---|---|
-f |
格式化(format) |
.NetworkSettings.Networks |
进入 JSON 中的网络配置节点,它是一个 map(键为网络名,值为网络详情) |
range ... |
遍历这个 map(因为一个容器可能连接多个网络) |
.IPAddress |
取出当前网络的 IP 地址字段 |
end |
结束循环 |
我的是 blog-postgres 容器
docker inspect -f '{{index .NetworkSettings.Networks "blog_default" "IPAddress"}}' blog-postgres
2. SSH隧道在本地电脑输入
其中的localhost就可以替换为你刚才输入的。结果就是输入密码正确后连通了不用管了
ssh -L 15432:localhost:5432 root@服务器IP
| 部分 | 含义 |
|---|---|
-L |
声明这是一个本地端口转发规则 |
15432 (第一个) |
你本地电脑上监听的端口号 |
localhost:5432 (冒号后面) |
远程服务器视角下的目标地址和端口(即从服务器出发,访问它自己的 localhost:5432) |
root@服务器IP |
SSH 登录的远程服务器 |
-L 15432:localhost:5432 中的 localhost 指的是 SSH 登录的那台远程服务器自身。只要 PG 服务在那台服务器的 localhost:5432 上能通,无论它是原生安装还是容器映射过来的,这条命令都能正常工作
3. 数据库软件连接
- 15432端口是你映射出来的,所以要填15432
- 账号密码为你的容器里的

