我对具有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
答案 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中的讨论。