简短的问题是我可以从mongo运行mongo:在27017以外的其他端口上运行最新图像(例如在27018上?)
如果是,我如何在docker-compose.yml文件中执行此操作,以便能够键入以下命令:
docker-compose run
更长的故事:
我在AWS EC2实例中运行了一个应用。该应用程序包含一个mongodb和一个Web应用程序。现在我决定将这个应用程序的一部分分离到自己的微服务器中,这个微服务在Docker容器中的同一个AWS中运行(两个容器一个用于另一个mongo,一个用于web应用程序)。我认为问题是我不能在端口27017上运行mongodb,同时在端口27017上的docker容器内运行另一个mongodb。对吗?我有这个假设,因为当我停止第一个mongo(我的app 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
在我的新应用中,我将mongo网址更改为:
monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url, 27018)
嗯,如果我说的话也一样:
monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url)
但是当我运行docker-compose run时,它仍然无效,我收到以下错误:
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
答案 0 :(得分:18)
您可以在配置文件中将MongoDB告诉listen on a different port,或使用命令行参数:
services:
mongo:
image: 'mongo:latest'
command: mongod --port 27018
ports:
- '27018:27018'
答案 1 :(得分:3)
您可以在同一端口上运行容器内部和外部的进程。您甚至可以在内部使用相同的端口运行多个容器。您不能做的是将一个端口从主机映射到容器。或者在您的映射中,将已经使用的端口映射到容器。
例如,这适用于您的主机:
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上侦听。
每个容器都有自己的网络名称空间,并且没有关于在另一个容器或主机上运行的内容的概念。
webapp需要能够连接到mongo容器内部端口。您可以在container network上执行此操作,该here允许容器之间的连接以及每个服务的名称解析
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
从您的应用中,网址mongo://mongo:27017
将会正常运行。
从您的主机需要使用映射端口和主机上的地址,通常是localhost
:mongo://localhost:27018
答案 2 :(得分:0)
我解决了这个问题,不是通过在不同的端口运行容器,而是通过学习docker-compose版本2中的一个新功能,我们不需要指定链接或网络。默认情况下,新创建的容器将成为docker0网络的一部分,因此它们可以相互通信。
如上所述Matt,我们可以在同一端口上的容器内运行进程。它们应该是孤立的。所以问题不在于docker容器和主机使用相同的端口。问题可能是尝试将主机中的已使用端口转发到容器中的另一个端口。
下面是一个有效的docker-compose文件:
version: '2'
services:
webapp:
image: myimage
ports:
- 3000:3000
mongo:
image: mongo:latest
我在github中查看了mongo:最新的docker文件,并意识到它们暴露了27017.所以我们不需要将端口或转发主机端口更改为正在运行的mongo容器。 mongo url可以保持在同一个端口:
monog_url = 'mongodb://mongo:27017'
client = MongoClient(monog_url, 27017)
所以上面的解决方案解决了这个问题,但至于问题标题'docker在另一个端口上运行mongo图像',最简单的方法就是将docker-compose更改为:
version: '2'
services:
web:
image: myimage
mongo:
image: mongo:latest
command: mongod --port 27018
Mongo现在在27018上运行,以下网址仍可在网络中访问:
monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url, 27018)
答案 3 :(得分:0)
我遇到了同样的问题
我在docker-compose.yml文件中更改了端口,这对我来说是有效的
这样,我不会更改连接字符串中的端口
mongo:
image: mongo
ports:
- "27018:27018"