web-dev-qa-db-ja.com

dockerでMongoDBに接続できません

Dockerハブからの公式のmongoイメージを使用して、次のコマンドを実行して実行します。

docker run --name api -p 127.0.0.1:27017:27017 -p 127.0.0.1:28017:28017 -d mongo

次に、別のターミナルシェルからmongoを実行します

ただし、次のエラーが発生し続けます。

MongoDB Shell version: 3.2.3
connecting to: test
2016-02-18T13:52:08.110-0700 I NETWORK  [thread1] Socket recv() errno:104 Connection reset by peer 127.0.0.1:27017
2016-02-18T13:52:08.110-0700 I NETWORK  [thread1] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017] 
2016-02-18T13:52:08.110-0700 E QUERY    [thread1] Error: network error while attempting to run command 'isMaster' on Host '127.0.0.1:27017'  :
connect@src/mongo/Shell/mongo.js:224:14
@(connect):1:6

exception: connect failed

コンテナのログを確認したところ、すべてが正常に見えました。

2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit Host=73334e5089e1
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] db version v3.2.3
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] git version: b326ba837cf6f49d65c2f85e1b70f6f31ece7937
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] modules: none
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] build environment:
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     distmod: debian71
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     distarch: x86_64
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten]     target_Arch: x86_64
2016-02-18T20:51:20.538+0000 I CONTROL  [initandlisten] options: {}
2016-02-18T20:51:20.542+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=8G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-02-18T20:51:20.615+0000 I CONTROL  [initandlisten] 
2016-02-18T20:51:20.616+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2016-02-18T20:51:20.616+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2016-02-18T20:51:20.633+0000 I NETWORK  [initandlisten] waiting for connections on port 27017

DockerまたはMongoの何が問題になっていますか?私はどこでも答えを探してきましたが、今のところ何も機能していません。ドッカーまたはモンゴは壊れていますか?

編集:もう少し調査したところ、コンテナ内からインターネットにアクセスできないことがわかりました。 docker exec -ti api /bin/bashを実行して接続し、googleなどにpingしようとすると、コマンドがハングします。

--net=Hostコマンドでdocker runを使用しないと、コンテナから外部にインターネット接続できないようです。

6
wheeler

コンテナーにlocalhostではなく独自のIPアドレスを使用するように指示する必要があります。

たとえば、expressjsを使用してスキャフォールドコードを生成したとします。routes/index.jsで記述する必要があります

var mongodb = require('mongodb');
router.get('/thelist', function(req, res){

  // Get a Mongo client to work with the Mongo server
  var MongoClient = mongodb.MongoClient;

  // Define where the MongoDB server is
  var url = 'mongodb://172.17.0.5:27017/dbname';

  // Connect to the server
  MongoClient.connect(url, function (err, db) {
  .........

ここで、172.17.0.5$CONTAINER_IPです

$ docker inspect $CONTAINER_NAME | grep IPAddressでコンテナIPを見つけることができます

コンテナにインターネットがない場合

Sudo Sudo vim /etc/NetworkManager/NetworkManager.confで開き、行dns=dnsmasqをコメント化すると、次のようになります。

[main]                        
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq                  

[ifupdown]                    
managed=false                 

編集:IPの代わりにサービス名

コンテナのIPアドレスの代わりにサービス名を使用できます。例:

  // Define where the MongoDB server is
  var url = 'mongodb://api:27017/dbname';

ここでの落とし穴はコンテナが127.0.0.1でリッスンする場合、ホストはポートをそれにマップできません。

0.0.0.0または類似のものをリッスンする必要があります。そうすると、-pがコンテナのインターフェースに到達できます。

3
Sobrique

私は同じ問題を抱えていましたが、この問題に対処する別の方法を見つけました。 Dockerイメージの実行中にネットワークパラメータを渡すだけで、Dockerは正しいローカルホストを指すようになります。

docker run --network="Host" ....

このソリューションのソース

1
hyperloopfan