【问题标题】:How to Connect to Docker Postgres Container from Host Machine如何从主机连接到 Docker Postgres 容器
【发布时间】:2018-01-22 16:10:27
【问题描述】:

我按照以下说明构建了一个 Rails 开发环境 https://docs.docker.com/compose/rails/

它可以工作,但我无法从主机连接到 Postgres 服务器。我正在运行 macOS High Sierra。当我运行 docker container ls 时,我看到 5432/tcp 作为 Postgres 容器的端口。请注意,5432 前面没有列出 IP。当我运行 docker network inspect <postgress_container_ID> 时,我得到 172.18.0.2 作为 IP。

但是当我运行psql -h 172.18.0.2 -p 5432 -U postgres 时,我得到了

xpsql: could not connect to server: Operation timed out
  Is the server running on host "172.18.0.2" and accepting
  TCP/IP connections on port 5432?

我做错了什么?

【问题讨论】:

  • 如果你使用 5433:5432 它不会暴露 5433 端口,你会得到连接被拒绝。只要将其更改为“5433:5432”,它就会起作用。用官方的 postgres:13.2 镜像测试(也有 13 个)。

标签: postgresql docker rails-postgresql remote-connection


【解决方案1】:

通过查看您的详细信息5432/tcp,在我看来您还没有导出端口号5432

如果你已经导出了端口,那么它应该是这样的。

 0.0.0.0:5432->5432/tcp

然后通过使用 HOST IP 地址(您的本地 mac 机器 ip)您应该能够连接,如果仍然无法连接,请分享您的 docker 命令 - 您是如何运行容器的?

Docker 编写文件

version: '3'
services:
  db:
    image: postgres
    ports:
     - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/airbnb
    ports:
      - "3000:3000"
    depends_on:
      - db

在您的 docker-compose 文件中,您没有公开端口号 5432,因此您将无法从外部连接 Postgres DB。

尝试在您的 docker-compose 文件中添加 ports: - "5432:5432"。 然后通过使用您的机器IP地址,您应该可以连接数据库。

【讨论】:

  • 您能否详细说明您所说的主机 IP 是什么意思?我尝试了本地 IP 地址(在我的本地 wifi 网络上识别我的笔记本电脑的 IP)和我的公共 IP。他们都给了我 psql:无法连接到服务器:连接被拒绝服务器是否在主机“”上运行并接受端口 5432 上的 TCP/IP 连接?
  • 您知道将使用 TCP/IP 通过 SSH 进行连接的 GUI Postgres 客户端吗?然后我可以通过 Rails 容器连接。
  • 能否分享一下 docker run 命令,你是如何运行 Postgres 容器的?
  • 我按照docs.docker.com/compose/rails 的指示进行操作。所以,我通过运行docker-compose up 来启动容器。这能回答你的问题吗?
  • 好的,那么请您分享您的 docker compose 文件。我想看看你是否暴露了 5432 端口?
【解决方案2】:

默认情况下,postgres exposes port 5432。这只会将端口暴露给同一 Docker 网络中的其他容器——即 compose 文件中的所有其他容器。这是因为默认情况下,docker compose creates a network 用于撰写文件中的所有容器。

您有几个选项可以从主机连接到容器:

  1. Expose the port 使用 HOST:CONTAINER 格式,这将使容器的端口在 HOST IP 上可用。例如,使用127.0.0.1:5432,这样您就可以访问主机上该地址的端口。
  2. 使用 Docker 网络的网关 IP 作为接口/源地址。例如,如果容器是172.18.0.2,那么网关很可能是172.18.0.1。通常有一种方法可以使用 postgres 和套接字库来做到这一点,但不幸的是我没有看到使用 psql 的方法。
  3. 设置 IP 表,以便您的主机可以访问 Docker 网络。

另一种选择是从 Docker 网络中的容器访问它。您可以使用docker-compose run --rm db psql -h db -U postgres 运行一次性容器,该容器与db 容器具有相同的 Docker 映像,并且在同一网络中。

【讨论】:

    【解决方案3】:

    使用实际运行 Docker 的 VM 的 IP。你可以通过运行找到这个IP:

    docker-machine ip default
    

    【讨论】:

    • 我不认为它在 docker-machine 上运行。运行 docker-machine ls 返回一个空结果集
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2018-01-09
    • 2016-07-20
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多