使用docker集线器的官方mongo镜像,我运行以下命令使其运行:
docker run --name api -p 127.0.0.1:27017:27017 -p 127.0.0.1:28017:28017 -d mongo
然后从另一个terminalshell,我运行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工人还是蒙戈人?
编辑:我做了一些调查,发现我不能从容器内访问互联网。 我通过运行docker exec -ti api /bin/bash连接到它,然后尝试ping Google或其他东西,并且该命令只是挂起。
我似乎只能通过在--net=host docker run命令中使用--net=host来从容器到外部世界获得互联网连接。
这里的问题是 – 如果一个容器在127.0.0.1上侦听,那么主机不能将端口映射到它。
你需要听取0.0.0.0或类似的,然后-p可以到达容器的界面。
您必须告诉容器使用它自己的IP地址而不是本地主机。
例如,假设您使用expressjs生成脚手架代码, expressjs必须使用routes/index.js编写expressjs代码
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来$ docker inspect $CONTAINER_NAME | grep IPAddress $ docker inspect $CONTAINER_NAME | grep IPAddress
用sudo sudo vim /etc/NetworkManager/NetworkManager.conf打开sudo vim /etc/NetworkManager/NetworkManager.conf并注释掉dns=dnsmasq这行,所以你现在有了:
[main] plugins=ifupdown,keyfile,ofono #dns=dnsmasq [ifupdown] managed=false
您现在可以使用服务名称而不是容器的IP地址,例如:
// Define where the MongoDB server is var url = 'mongodb://api:27017/dbname';