容器数据库连接

情景: 当前博客项目的数据库在容器内。整个服务器只暴露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
  • 账号密码为你的容器里的