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

Mah*_*aly 8 amazon-ec2 mongodb amazon-web-services docker docker-compose

简短的问题是我可以从mongo运行mongo:在27017以外的其他端口上运行最新图像(例如在27018上?)

如果是,我如何在docker-compose.yml文件中执行此操作,以便能够键入以下命令:

docker-compose run
Run Code Online (Sandbox Code Playgroud)

更长的故事:

我有一个在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
Run Code Online (Sandbox Code Playgroud)

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

monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url, 27018)
Run Code Online (Sandbox Code Playgroud)

好吧,如果我说同样的话:

monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url)
Run Code Online (Sandbox Code Playgroud)

但是当我运行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
Run Code Online (Sandbox Code Playgroud)

要么

pymongo.errors.ServerSelectionTimeoutError:
mongo:27018: [Errno -2] Name or service not known
Run Code Online (Sandbox Code Playgroud)

Vin*_*ren 25

您可以告诉MongoDB 监听配置文件中的其他端口,或者使用命令行参数:

services:
  mongo:
    image: 'mongo:latest'
    command: mongod --port 27018
    ports:
        - '27018:27018'
Run Code Online (Sandbox Code Playgroud)

  • 这还没有解决问题。我查看了 mongo:latest 的 github 代码,它们公开了端口 27017 并运行命令 mongod。我猜他们的 mongod 命令 27017 在我的命令 mongod --port 27018 之前运行。你怎么看? (2认同)

Mat*_*att 12

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

例如,这适用于您的主机:

services:
    webapp:
        image: myimage
        ports:
            - '3000:3000'

    mongo:
        image: 'mongo:latest'
        ports:
            - '27018:27017'

    mongo2:
        image: mongo:latest
        ports:
            - '27019:27017'
Run Code Online (Sandbox Code Playgroud)

主机 mongo 侦听 27017。主机也将端口 27018 和 27019 映射到容器 mongo 实例,两者都侦听容器内的 27017。

每个容器都有自己的网络命名空间,并且不知道在另一个容器或主机上运行的是什么。

网络

webapp 需要能够连接到 mongo 容器的内部端口。您可以通过容器网络执行此操作,该网络允许容器之间的连接以及每个服务的名称解析

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
Run Code Online (Sandbox Code Playgroud)

从您的应用程序中,该 urlmongo://mongo:27017将起作用。

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


Mah*_*aly 5

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

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

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

下面是一个工作的 docker-compose 文件:

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

    mongo:
        image: mongo:latest
Run Code Online (Sandbox Code Playgroud)

我查看了 github 中的 mongo:latest docker 文件,发现它们暴露了 27017。因此我们不需要更改端口或将主机端口转发到正在运行的 mongo 容器。并且 mongo url 可以保留在同一端口上:

monog_url = 'mongodb://mongo:27017'
client = MongoClient(monog_url, 27017)
Run Code Online (Sandbox Code Playgroud)

Docker 在不同的端口上运行镜像

所以上面的解决方案解决了问题,但是对于问题标题“docker run mongo image on a different port”,最简单的方法是将 docker-compose 更改为:

version: '2'
services:
web:
    image: myimage

mongo:
    image: mongo:latest
    command: mongod --port 27018
Run Code Online (Sandbox Code Playgroud)

Mongo 现在运行在 27018 上,并且仍然可以在网络中访问以下 url:

monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url, 27018)
Run Code Online (Sandbox Code Playgroud)