web-dev-qa-db-ja.com

別のポートでdocker run mongoイメージ

短い質問は、27017とは異なるポート(たとえば、27018で)でmongo:latestイメージからmongoを実行できますか?

はいの場合、次のコマンドを入力できるようにするために、docker-compose.ymlファイル内でこれを行うにはどうすればよいですか:

docker-compose run

長い話:

AWS EC2インスタンスで実行しているアプリがあります。このアプリは、mongodbとWebアプリケーションで構成されています。ここで、このアプリの一部を、同じAWS内部dockerコンテナー(別のmongo用とWebアプリ用の2つのコンテナー)で実行される独自のマイクロサービスに分割することにしました。問題は、ポート27017でmongodbを実行できず、同時にポート27017のdockerコンテナ内で別のmongodbを実行できないことだと思います。私はこの仮定を持っています。なぜなら、最初のmongo(私のアプリmongo)を停止すると、私のdocker mongoが動作するからです。

だから、別のポートで実行する2番目のmongo(dockerコンテナー内にあるもの)と、別のポートでmongoをリッスンする2番目のWebアプリ(別のdocker conianter内にあるもの)を作成しようとしています。 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 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
8
Mahshid Zeinaly

同じホストで実行されている異なるコンテナ間のデフォルトの通信

ただし、コンテナを別のポートで実行するのではなく、docker-composeバージョン2の1つの新機能を学習することで問題を解決しました。リンクまたはネットワークを指定する必要はありません。デフォルトで新しく作成されたコンテナは、docker0ネットワークの一部であるため、互いに通信できます。

Matt で述べたように、同じポートのコンテナー内でプロセスを実行できます。それらは分離されるべきです。したがって、問題は、Dockerコンテナとホストが同じポートを使用していることではありません。問題は、おそらくホストの使用済みポートをコンテナの別のポートに転送しようとしていることです。

作業用のdocker-composeファイルは次のとおりです。

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

    mongo:
        image: mongo:latest

Githubのmongo:latestドッカーファイルを見て、27017が公開されていることに気付きました。したがって、ポートを変更したり、ホストポートを実行中のmongoコンテナーに転送したりする必要はありません。そして、mongo urlは同じポートにとどまることができます:

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

Dockerは別のポートでイメージを実行します

したがって、上記のソリューションは問題を解決しましたが、質問のタイトル「docker run mongo image on different port」については、最も簡単な方法は、docker-composeを次のように変更することです:

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

mongo:
    image: mongo:latest
    command: mongod --port 27018

Mongoは現在27018で実行されており、次のURLは引き続きWeb内からアクセスできます。

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

MongoDBに、構成ファイルで 別のポートでリッスン を指示するか、コマンドラインパラメーターを使用します。

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

同じポートでコンテナ内と外部のプロセスを実行できます。内部で同じポートを使用して複数のコンテナを実行することもできます。できないことは、ホストからコンテナに1つのポートをマップすることです。または、既に使用中のポートをコンテナにマッピングします。

たとえば、これはホストで機能します。

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コンテナーの内部ポートに接続できる必要があります。 コンテナネットワーク でこれを行うことができます。これにより、コンテナ間の接続と各サービスの名前解決も可能になります。

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

アプリからURL mongo://mongo:27017が機能します。

ホストから、マップされたポートとホスト上のアドレスを使用する必要があります。これは通常localhostmongo://localhost:27018

3
Matt