5

我按照https://docs.docker.com/compose/rails/中的说明构建了一个 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?

我究竟做错了什么?

4

3 回答 3

11

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

如果您已导出端口,那么它应该看起来像。

 0.0.0.0:5432->5432/tcp

然后通过使用主机 IP 地址(您的本地 mac 机器 ip)您应该能够连接,如果仍然无法正常工作,请分享您的 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 文件中添加端口:-“5432:5432” 。然后通过使用您的机器IP地址,您应该能够连接数据库。

于 2018-01-22T16:42:40.290 回答
2

默认情况下,postgres 公开端口 5432。这只会将端口暴露给同一 Docker 网络中的其他容器——即 compose 文件中的所有其他容器。这是因为默认情况下,docker compose 会为 compose 文件中的所有容器创建一个网络。

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

  1. 使用格式公开端口HOST:CONTAINER,这将使容器的端口在HOSTIP 上可用。例如,使用127.0.0.1:5432so 您可以访问主机上该地址的端口。
  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将运行一个一次性容器,该容器具有与容器相同的 Docker 映像db并在同一网络中。

于 2018-01-24T19:56:55.283 回答
0

使用实际运行 Docker 的 VM 的 IP。您可以通过运行找到此 IP:

docker-machine ip default
于 2018-01-22T16:19:09.433 回答