> 技术文档 > 连接Docker容器中的PostgreSQL_使外部能连接docker中的postgresql数据库

连接Docker容器中的PostgreSQL_使外部能连接docker中的postgresql数据库

要通过 DataGrip 连接 Docker 中运行的 PostgreSQL 数据库,你需要按照以下步骤操作:

确认 PostgreSQL 容器网络配置

首先确保 PostgreSQL 容器已经正确暴露了端口。通常 PostgreSQL 默认使用 5432 端口。

检查你的 PostgreSQL 容器启动命令是否有 -p 参数映射端口:

docker run --name db -e POSTGRES_PASSWORD=yourpassword -p 5432:5432 -d postgres

如果没有,你需要停止并重新启动容器以暴露端口。

获取 Docker 容器的 IP 地址

如果你不想映射主机端口,可以获取容器的 IP 地址:

docker inspect -f \'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}\' db

:::warning
192.168.215.2 # 我的容器返回的结果是这个 IP 地址,我用这个 IP 地址可以直接连接了。

:::

DataGrip 连接配置

在 DataGrip 中创建新连接:

  1. 点击 “+” → “Data Source” → “PostgreSQL”
  2. 填写连接信息:
    • Host:
      • 如果你用了 -p 5432:5432,就填 localhost127.0.0.1
      • 如果用的是容器 IP,就填上面获取的 IP 地址
    • Port: 5432 (默认)
    • Database: 你的数据库名 (默认可能是 postgres)
    • User: postgres (默认超级用户)
    • Password: 你设置的密码 (通过 POSTGRES_PASSWORD 环境变量)
  3. 点击 “Test Connection” 测试连接
  4. 成功后点击 “OK” 保存

如果使用 Docker 网络

如果你的 应用 和 PostgreSQL 是在自定义 Docker 网络中通过 --link 连接的,你可以:

  1. 找出你的网络名称:
docker network ls
  1. 将 DataGrip 所在的主机加入到同一网络,或者使用端口映射更简单。

防火墙/安全组检查

确保你的主机防火墙或云服务商安全组允许 5432 端口的入站连接。

常见问题解决

  • 连接拒绝:检查 PostgreSQL 是否配置了 pg_hba.conf 允许外部连接
  • 密码错误:确认你在启动容器时设置了 POSTGRES_PASSWORD 环境变量
  • 端口占用:确保主机 5432 端口没有被其他服务占用

如果仍有问题,可以提供具体的错误信息,我可以给出更针对性的建议。

从你列出的网络信息来看,你的 Docker 环境中存在以下几种网络:

Docker 网络 NAME 解释:

  1. **bridge ** - 这是 Docker 默认的 bridge 网络,当你运行容器时如果不指定 --network,容器就会加入这个网络。
  2. **docker_gwbridge ** - 这是 Docker 用于 Swarm 服务通信的内部网络,通常不需要手动管理。
  3. **host ** - 这个网络会让容器直接使用宿主机的网络栈(共享 IP 和端口)。
  4. **ingress ** - 这是 Docker Swarm 的负载均衡网络,用于 Swarm 服务。
  5. **none ** - 这个网络表示容器没有网络连接。

你的 PostgreSQL 容器运行在哪个网络?

默认情况下,如果你运行容器时没有指定 --network,它会加入 bridge 网络。你可以通过以下命令查看 db 容器的网络:

docker inspect db | grep NetworkMode

或者查看详细的网络信息:

docker inspect db -f \'{{json .NetworkSettings.Networks}}\'

如何让 DataGrip 连接到 Docker 网络中的 PostgreSQL?

DataGrip 运行在你的主机上,无法直接加入 Docker 的 bridge 网络(因为它是 Docker 内部的虚拟网络)。你有以下几种选择:

方法 1:端口映射(推荐)

最简单的方式是在运行 PostgreSQL 容器时映射端口到宿主机:

docker run --name db -e POSTGRES_PASSWORD=yourpassword -p 5432:5432 -d postgres

然后在 DataGrip 中连接:

  • Host: localhost127.0.0.1
  • Port: 5432
方法 2:使用主机的 Docker 网关 IP

Docker 的 bridge 网络通常会有一个网关 IP(通常是 172.17.0.1)。你可以:

  1. 找到 Docker 网关 IP:
docker network inspect bridge | grep Gateway
  1. 在 DataGrip 中使用这个 IP 作为主机地址。
方法 3:将 DataGrip 运行在 Docker 容器中(复杂)

你可以运行一个包含 DataGrip 的容器,并加入同一个网络:

docker run --network container:db -it some-datagrip-image

但这种方式比较复杂,不建议新手尝试。

方法 4:使用 host 网络

如果你在运行 PostgreSQL 容器时使用了 --network host,那么它可以直接通过 localhost 访问:

docker run --name db --network host -e POSTGRES_PASSWORD=yourpassword -d postgres

然后在 DataGrip 中连接 localhost:5432

最佳实践建议

推荐使用方法 1(端口映射),这是最直接和通用的方式:

  1. 确保 PostgreSQL 容器已经映射了端口(-p 5432:5432)。
  2. 如果容器已经在运行但没有映射端口,可以:
    • 停止并删除旧容器:
docker stop db && docker rm db
- 重新运行并映射端口:
docker run --name db -e POSTGRES_PASSWORD=yourpassword -p 5432:5432 -d postgres
  1. 在 DataGrip 中连接 localhost:5432