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
将工作。
从你的主机需要使用映射端口和主机上的地址,通常是localhost
: mongo://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)