Skip to main content
 首页 » 编程设计

python之加载 http ://0. 0.0.0:27017 时 mac os 上的 Docker mongodb 连接被拒绝

2024年08月15日27oomusou

Browser Screenshot 我有 2 个运行 mongo:3.0.3 和 python:2.7 的 docker 容器。我有一个连接到 mongodb 实例的 app.py。在我的 app.py 中,我使用端口 5000 映射 27017。app.py 运行正常,但是当我访问 http://0.0.0.0:5000 时此连接被拒绝错误出现在终端上。

172.17.0.1 - - [01/Jul/2018 10:01:32] "GET / HTTP/1.1" 500 - 
Traceback (most recent call last): 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
return self.wsgi_app(environ, start_response) 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
  File "/pythonApp/app.py", line 16, in form 
    if posts.count()!=0: 
  File "/usr/local/lib/python2.7/site-packages/pymongo/collection.py", line 1023, in count 
    return self._count(cmd) 
  File "/usr/local/lib/python2.7/site-packages/pymongo/collection.py", line 985, in _count 
    with self._socket_for_reads() as (sock_info, slave_ok): 
  File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__ 
    return self.gen.next() 
  File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 699, in _socket_for_reads 
    with self._get_socket(read_preference) as sock_info: 
  File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__ 
    return self.gen.next() 
  File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 663, in _get_socket 
    server = self._get_topology().select_server(selector) 
  File "/usr/local/lib/python2.7/site-packages/pymongo/topology.py", line 121, in select_server 
address)) 
  File "/usr/local/lib/python2.7/site-packages/pymongo/topology.py", line 97, in select_servers 
    self._error_message(selector)) 
ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused 

我找不到任何 .conf 文件,因为这是一个容器。关于如何解决这个问题的任何想法? :/

我的 docker 镜像 https://hub.docker.com/r/sizijay/dockerexercise/ 查看 dockerfile 的详细描述

请您参考如下方法:

运行 Mongo 容器:

$ docker run -d -p "27017:27017" mongo  

在您的 app.py 中,使用 pymongo Connection。

from pymongo import Connection 
c = Connection(host=0.0.0.0, port=27017) 
c.test_database 

注意主机是0.0.0.0。

运行你的容器:

$ docker run -d -p 5000:5000 sizijay/dockerexercise 

如果您使用 localhost 作为您的主机,pymongo 将查看正在运行的容器内部(即 sizijay/dockerexercise)。 当您使用 0.0.0.0 时,连接将连接到您的主机,它现在将端口 27017 绑定(bind)到您的 mongo 容器内的 27017。


更好的选择是使用 docker-compose 链接您的容器。

在这种情况下,您需要创建一个文件: docker-compose.yml:

version: '3' 
 
services: 
  db: 
    image: mongo 
    ports: 
      - "27017:27017" 
 
  myapp: 
    image: sizijay/dockerexercise 
    ports: 
      - "5000:5000" 
    links: 
      - db 
    depends_on: 
      - db 

在您的 app.py 中,使用 pymongo Connection。

from pymongo import Connection 
c = Connection(host='db', port=27017) 
c.test_database 

注意:主机是db。

现在您的主机不在您的app 容器内,而是在db 服务(即mongo 容器)内。

您可以通过以下方式运行 docker-compose:

$ docker build -t sizijay/dockerexercise . 
$ cd location_of_docker-compose.yml 
$ docker-compose up