当通过docker-compose运行时,Mongodb无法在主机上访问,但通过docker运行

我试图从主机连接到docker容器中的mongodb(仅用于开发目的),没有任何运气。 我有以下docker-compose文件。

version: '2.2' services: mongo: image: mongo ports: - "27017:21017" 

而当我尝试连接到它我得到以下错误:

 C:\Program Files\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.9 connecting to: mongodb://127.0.0.1:27017 2017-10-25T03:48:53.331+0300 E QUERY [thread1] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017' : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed 

但是,如果我没有直接构build,例如

 docker run --name my_mongox6 -d -p 27017:27017 mongo 

这应该相当于上面的docker-compose文件。 它工作得很好

 C:\Program Files\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.9 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.9 Server has startup warnings: 2017-10-25T00:49:58.983+0000 I STORAGE [initandlisten] 2017-10-25T00:49:58.983+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2017-10-25T00:49:58.983+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2017-10-25T00:49:59.076+0000 I CONTROL [initandlisten] 2017-10-25T00:49:59.076+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-10-25T00:49:59.076+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-10-25T00:49:59.076+0000 I CONTROL [initandlisten] 

版本

 c:\Program Files\MongoDB\Server\3.4\bin>docker --version Docker version 17.09.0-ce, build afdb6d4 c:\Program Files\MongoDB\Server\3.4\bin>docker-compose --version docker-compose version 1.16.1, build 6d1ac219 

我使用docker for windows通过hyper-v运行。

我的撰写文件有什么问题,以及为什么它通过docker运行,但不能通过docker-compose工作。 我抓了几个小时,没有任何运气地用Googlesearch

通过docker-compose(例如nginx,postgresql)的其他端口共享工作得很好。

UPDATE

在ubuntu上问朋友试试。 同样的行为。 所以它的可重复性和它不是特定的窗口在所有..通过docker工作,不通过docker组成。 即使当我尝试通过telnet连接mongo日志显示连接尝试通过docker运行时,但没有显示通过撰写时运行。

另外我看到在通过合成运行时通过泊坞窗运行docker ps中的差异。

撰写的港口列为

  ( 27017/tcp, 0.0.0.0:27017->21017/tcp ) 

VS

 (0.0.0.0:27017->21017/tcp ) 

在docker上。

它错过了第一个27017 / tcp部分可能是问题,但不知道为什么。

好的,问题是非常愚蠢和简单。

港口: – “27017:21017”

第二个港口21017而不是27017.如何浪费整天由于错字

如果你在Linux上,它工作正常。 当你在Windows中运行容器时,你需要做端口仲裁。

 netsh interface portproxy add v4tov4 listenport=27017 listenaddress=localhost connectport=27017 connectaddress=192.168.99.100(IP of the Docker) 

不pipe打电话回环它将被redirect到docker主机的容器。

以下是有关Windows主机的 Docker Solution for Windows在端口方面的帮助讨论

这行我正在使用docker for windows通过hyper-v运行。 ,说你在Windows上和docker不会是环回(127.0.0.1),你必须转发的端口。