如何使用其 IP 连接到容器化数据库?

How to connect to containerized database with its IP?

我是 Docker 的新手。我成功地创建了一个 PostgreSQL 容器 my-database 并且我可以使用服务器地址 localhost 和端口从本地计算机上的 SQLTools 访问它。

我通过以下命令获得了容器化数据库的 IP 地址

docker container inspect my-database

但是当我返回到 SQLTools 或 PHP 网络应用程序(未容器化)并尝试使用上面获得的 IP 地址连接到我的数据库时,它无法成功连接。

我在这里错过了什么?

仅供参考,我还创建了另一个容器并能够通过以下方式连接到我的数据库:为我的数据库和第二个容器使用相同的网络。

这完全取决于您如何启用对数据库的访问。

如果您的 php 服务在同一台机器上运行,那么 localhost 可以工作 如果它在同一网络中的不同机器上,则使用分配给该机器的网络 IP。如果您的 php 服务器位于完全不同的位置,那么您可能希望对 docker 容器使用类似 nginx 反向代理的东西。

因此,在您的情况下,您应该获取运行数据库容器的 ip:port 并使用它。 Docker inspect 显示内部网络 ip,它只帮助同一虚拟网络中的其他容器连接到容器。

您永远不需要 docker inspect IP 地址。您只能在两种特定情况下连接到它:如果您在同一 Docker 网络上的不同容器中,或者如果您 (a) 根本不在容器中,(b) 在同一网络中主机,并且 (c) 该主机是 运行 本机 Linux 而不是不同的 OS.

您已经找到了正确的答案。假设您以

启动容器
docker network create any-network-name
docker run \
  --name database \
  --net any-network-name \
  -p 5432:5432 \
  postgres

any-network-name 网络上的另一个 Docker 容器,您可以使用 database 容器名称作为 DNS 名称,避免手动 IP 查找;忽略任何 -p 选项并使用服务的“正常”端口。从容器外部,您可以使用主机的 DNS 名称或 IP 地址(或者,如果是同一主机,localhost)和第一个 -p 端口号。

如果您在 Docker Compose 中 运行 这个,它会自动为您创建一个网络并在其 Compose 服务名称下注册容器;您不需要 networks:container_name: 或其他类似设置。

version: '3.8'
services:
  database:
    image: postgres
    ports: ['5432:5432']
  application:
    build: .
    environment:
      - PGHOST=postgres