托管主机拒绝Docker Compose Postgres容器连接

时间:2019-07-01 20:55:26

标签: postgresql docker networking docker-compose docker-desktop

我对具有postgres映像的docker-compose文件有以下定义,我想从我的PC的 hosting 机器运行并连接到该文件,但我得到了Connection Refused localhost:5432时间。我意识到容器必须在主机网络驱动程序上运行,但是网络模式不能解决此问题。我在做什么错了?

我在docker-compose -f [file] up上与Windows 10 with Docker for Desktop一起运行

version: '3.7'
services:
  database:
      image: postgres:10.6
      restart: always
      ports:
        - "5432:5432"
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=p0stgr@s
        - POSTGRES_DB=eagle_eye_local
      network_mode: host

当我使用以下命令运行相同的容器时,它将起作用:

docker container run --name postgres10.6 -e POSTGRES_PASSWORD=p0stgr@s -e POSTGRES_USER=postgres -e  POSTGRES_DB=eagle_eye_local -p 5432:5432 postgres:10.6

1 个答案:

答案 0 :(得分:1)

我假设您不是在Linux上本地运行,而是使用某些Docker for Desktop。那么简短的答案是:删除network_mode: host,compose设置将以与docker run命令相同的方式工作。

version: '3.7'
services:
  database:
      image: postgres:10.6
      restart: always
      ports:
        - "5432:5432"
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=p0stgr@s
        - POSTGRES_DB=eagle_eye_local

您提供的两个示例虽然在真实的Linux主机上运行时可能导致相似的结果,但它们并不是真正相等的(类似于在Linux主机上,您可以通过{{ 1}}在主机上)。

如果在用于桌面的Docker(Mac或Windows)上运行给定的compose文件,则必须记住,在这种情况下,有一个运行容器的VM,所有命令都传递到该VM中。如果您不使用localhost:5432,则Docker将(1)在VM上正确公开端口,并且(2)在主机(mac / windows)上设置一些代理过程以将流量转发到VM。当您使用network_mode: host启动容器时,这基本上不起作用。

network_mode: host列下运行docker ps时,可以验证已建立的映射。如果您使用Ports运行,它将为空。

有关更多详细信息,请参见the docker forum中的讨论。