短い質問は、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
ただし、コンテナを別のポートで実行するのではなく、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 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)
MongoDBに、構成ファイルで 別のポートでリッスン を指示するか、コマンドラインパラメーターを使用します。
services:
mongo:
image: 'mongo:latest'
command: mongod --port 27018
ports:
- '27018:27018'
同じポートでコンテナ内と外部のプロセスを実行できます。内部で同じポートを使用して複数のコンテナを実行することもできます。できないことは、ホストからコンテナに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
が機能します。
ホストから、マップされたポートとホスト上のアドレスを使用する必要があります。これは通常localhost
:mongo://localhost:27018