docker运行在不同的端口上的蒙戈图像

简单的问题是我可以从mongo上运行mongo:在不同于27017的端口上的最新映像(例如27018?)

如果是的话,我怎么能在docker-compose.yml文件中这样做,以便能够键入以下命令:

docker-compose run 

更长的故事:

我有一个在AWS EC2实例中运行的应用程序。 该应用程序包含一个MongoDB和一个Web应用程序。 现在我决定把这个应用程序的一部分分成它自己的微服务,它运行在Docker容器中的相同AWS(两个容器一个用于另一个mongo,一个用于一个web应用程序)。 我认为问题是我不能让mongodb在27017端口上运行,同时另一个mongodb在端口27017上的docker容器内运行。对吧? 我有这个假设,因为当我停止第一个mongo(我的应用程序mongo)时,我的docker mongo工作。

因此,我正在尝试使第二个mongo(位于docker容器中的那个)运行在另一个端口中,并运行我的第二个web应用程序(另一个docker conianter中的另一个),以在另一个端口上侦听mongo。 这里是我尝试更改docker-compose文件:

 version: '2' services: webapp: image: myimage ports: - 3000:3000 mongo: image: mongo:latest ports: - 27018:27018 

在我的新应用程序中,我将mongourl更改为:

 monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url, 27018) 

那么,如果我说:

 monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url) 

但是,当我运行docker-compose运行,它仍然无法正常工作,我得到以下错误:

 ERROR: for mongo driver failed programming external connectivity on endpoint: Error starting userland proxy: listen tcp 0.0.0.0:27017: bind: address already in use 

要么

 pymongo.errors.ServerSelectionTimeoutError: mongo:27018: [Errno -2] Name or service not known 

您可以让MongoDB 侦听configuration文件中的其他端口 ,或使用命令行参数:

 services: mongo: image: 'mongo:latest' command: mongod --port 27018 ports: - '27018:27018' 

您可以在同一个端口上运行容器内外的进程。 您甚至可以在内部使用相同的端口运行多个容器。 你不能做的是将主机的一个端口映射到一个容器。 或者在你的地图中,将一个已经在使用的端口映射到一个容器。

例如,这可以在你的主机上工作:

 services: webapp: image: myimage ports: - '3000:3000' mongo: image: 'mongo:latest' ports: - '27018:27017' mongo2: image: mongo:latest ports: - '27019:27017' 

主机mongo在27017上侦听。主机还将端口27018和27019映射到容器mongo实例,都在容器内的27017上进行侦听。

每个容器都有自己的networking名称空间,并且没有关于在另一个容器或主机上运行的内容的概念。

networking

webapp需要能够连接到mongo容器的内部端口。 你可以通过一个容器networking来做到这一点,它允许容器之间的连接以及每个服务的名称parsing

 services: webapp: image: myimage ports: - '3000:3000' networks: - myapp depends_on: - mongo mongo: image: 'mongo:latest' ports: - '27018:27017' networks: - myapp networks: myapp: driver: bridge 

从你的应用程序的urlmongo://mongo:27017将工作。

从你的主机需要使用映射端口和主机上的地址,通常是localhostmongo://localhost:27018

在同一主机上运行的不同容器之间的默认通信

我解决了这个问题,不是通过在不同的端口运行容器,而是通过学习docker-compose版本2中的一个新特性,那就是我们不需要指定链接或networking。 默认情况下,新创build的容器将成为docker0networking的一部分,因此它们可以相互通信。

正如Matt所说的,我们可以在同一个端口的容器中运行进程。 他们应该被隔离。 所以问题不能是docker容器和主机使用相同的端口。 问题可能是尝试将主机中使用的端口转发到容器中的另一个端口。

以下是一个正在运行的docker-compose文件:

 version: '2' services: webapp: image: myimage ports: - 3000:3000 mongo: image: mongo:latest 

我查看了github中的mongo:latest docker文件,并意识到他们暴露了27017.所以我们不需要更改端口或转发主机端口到正在运行的mongo容器。 而且mongourl可以保持在同一个端口上:

 monog_url = 'mongodb://mongo:27017' client = MongoClient(monog_url, 27017) 

Docker在另一个端口上运行一个映像

所以上面的解决scheme解决了这个问题,但是对于问题标题“docker在不同端口上运行mongo镜像”,最简单的方法就是将docker-compose改为:

 version: '2' services: web: image: myimage mongo: image: mongo:latest command: mongod --port 27018 

Mongo现在在27018上运行,下面的URL仍然可以在networking中访问:

 monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url, 27018)