2017-02-18 5 views
0

У меня есть два приложения Flask, каждый в отдельном контейнере. Я хотел бы назвать приложение A из приложения B. На данный момент я могу сделать это только жесткое кодирование IP приложения А как это:Связь между двумя фляжными сервисами в Docker

@app.route('/') 
def hello_world(): 
    r = requests.get('http://172.18.0.1:5000') 
    return r.text 

Есть простой способ сделать звонки с использованием контейнеров псевдонимов? Что было бы рекомендовано решить такую ​​проблему, то есть две службы, которые общаются друг с другом?

Я новичок в докеров, и я не уверен, что мне следует искать, поэтому любые ресурсы/ссылки будут очень оценены.

+0

Измените URL-адрес ваших запросов на переменную, желательно одну, загруженную из файла конфигурации. Настройте его как имя хоста. Запустите контейнеры с 'docker run --name hostname' – Matt

ответ

0

Во-первых, рекомендуется использовать hostname вместо IP. Но ... почему? Ip может меняться каждый раз, и очень досадно проверять, какое IP-приложение имеет приложение, но hostname изменяется только в том случае, если вы этого хотите.

Тогда:

cd path/to/dockerfile 
docker build -t your_repo/image_name .  
docker run -d -p 6000:5000 image_name --name hostname 

И app.py (только имя) должно быть так:

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    r = requests.get('http://hostname:5000') 
    return r.text 

if __name__ == '__main__': 
    app.run(host='0.0.0.0') 

Обратите внимание, что я использую хост '0.0.0.0' причиной могут возникнуть некоторые проблемы, пытаясь для соединения обоих контейнеров.

Надеюсь, этого достаточно, чтобы исправить проблему.

Имейте славный день!

+0

Привет, Благодарим вас за ответ. Он не полностью решил мои проблемы. Выполнение запроса в «hostname» приводит к запросу 'request.exceptions.MissingSchema: Invalid URL 'host': никакой схемы не предоставлено. Возможно, вы имели в виду http: // host? ' Если я сделаю' http: // host: 6000', я получаю исключение max re-try. Очевидно, я делаю что-то неправильно. Есть идеи? Я нахожу работу в сети довольно запутанной, потому что докер развивается так быстро - довольно сложно понять, что такое текущий рабочий процесс. – LGTB

+0

Привет! Да, я ошибся, уже исправлена, спасибо! О вашей проблеме, вы должны использовать 5000, а не 6000, иначе она не сработает. В принципе, если вы видите команду запуска docker, сопоставляется порт 6000 вашего хост-компьютера на 5000 в контейнер докеров. Попробуйте с '' http: // host: 5000'' –

+0

Привет, я уже смущен. Если я: 'Докер запуска -d -p 5002: 5000 externall3 ' и externall3 изображение ' @ app.route ('/') Защиту hello_world(): возвращение 'б' ' я могу получить доступ к нему в порт 5002. Я правильно понял, что -p делает внешний порт: порт в контейнере? В любом случае это ('http: // host: 5000') не работает. – LGTB