首页 文章

docker在另一个端口上运行mongo图像

提问于
浏览
4

简短的问题是我可以从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 url更改为:

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

3 回答

  • 0

    您可以在配置文件中将MongoDB告诉listen on a different port,或者使用命令行参数:

    services:
      mongo:
        image: 'mongo:latest'
        command: mongod --port 27018
        ports:
            - '27018:27018'
    
  • 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执行此操作,该容器允许容器之间的连接以及每个服务的名称解析

    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 将工作 .

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

  • 14

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

    我解决了这个问题,不是通过在不同的端口运行容器,而是通过学习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在不同的端口上运行图像

    所以上面的解决方案解决了这个问题,但至于问题 Headers '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)
    

相关问题