Соединение Docker mongodb отказано в Mac OS при загрузке http://0.0.0.0:27017

1

Скриншот браузера У меня есть 2 контейнера докеров, на которых запущено mongo: 3.0.3 и python: 2.7. И у меня есть app.py, который подключается к экземпляру mongodb. В моем 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, так как это контейнер. Любая идея о том, как это сделать? :/

мое изображение докера https://hub.docker.com/r/sizijay/dockerexercise/ см. подробное описание файла dockerfile

  • 0
    Просто зайдите в IP-адрес контейнера.
Теги:
docker
macos
docker-for-mac

3 ответа

1
Лучший ответ

Запустите контейнер Mongo:

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

В приложении app.py используйте соединение pymongo.

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, привязанный к 27017 внутри вашего контейнера mongo.


Лучшей альтернативой было бы использование компоновки докеров для соединения ваших контейнеров.

В этом случае вам нужно создать файл: 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.

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

Примечание: хост - db.

Теперь ваш хост находится не внутри вашего контейнера приложений, а внутри службы db (т.е. Контейнера mongo).

Вы можете запустить docker-compose:

$ docker build -t sizijay/dockerexercise .
$ cd location_of_docker-compose.yml
$ docker-compose up
  • 0
    mongo уже работает 0.0.0.0:27017->27017/tcp, и когда я захожу в браузер 0.0.0.0:27017, появляется эхо «Похоже, вы пытаетесь получить доступ к MongoDB через HTTP через порт встроенного драйвера». так что проблема с app.py он не может подключиться
  • 0
    2 контейнера уже работают mongo-> 0.0.0.0:27017->27017/tcp sizijay / dockerexercise -> 0.0.0.0:5000->5000/tcp
Показать ещё 4 комментария
1

Другое решение, которое не использует docker-compose, - это запустить два контейнера в одной и той же мостовой сети (созданной с помощью docker network create <networkname>) с помощью флага --network в командах docker run для обеих команд. контейнеры:

docker run -p 27017:27017 --name mongo1 -d --network sizijaynetwork mongo

docker run -p 5000:5000 --name app1 -d --network sizijaynetwork appimage

Затем в вашем скрипте Python вы можете сделать:

from pymongo import MongoClient
client = MongoClient(host = 'mongo1', port = 27017)
db = client.databaseName

Обратите внимание, что хост должен быть именем, которое вы назначаете своему контейнеру Mongo, и в случае, если вы не используете флаг --name, просто используйте имя по умолчанию для контейнера, который вы можете найти в NAMES, когда вы делаете docker ps

  • 0
    благодарю вас. это тоже работает. хорошо для меньшего количества контейнеров.
0

Поскольку я использую Mongoengine, параметры подключения,

    db = connect(<database name>, host='mongo-server', port=27017)

И мой docker-compose.yml есть,

    version: "3.4"
    services:
    ...
    ...
        db:
           image: mongo:3.4
           container_name: mongo-server
           ports:
               - "27015:27017"

Я могу подключить mongodb из моего веб-приложения, работающего как докер-контейнер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню