Docker Swarm сервис для обслуживания вызова - PullRequest
0 голосов
/ 18 января 2019

Я - рой нук.У меня есть два приложения Python Flask, которые переносятся для запуска в качестве служб докеров, и одно необходимо вызвать другое.Я использую обратный прокси-сервер nginx для управления внешними подключениями к сервисам.

Настройки местоположения nginx:

location /alpha/ {
  proxy_pass https://alpha-app:5000/;
}

location /beta/ {
  proxy_pass https://beta-app:5001/;
}

При работе в Docker Swarm, где «demo» - имя стека:

$ sudo docker service ls:
NAME        PORTS
demo_alpha  *:3002->5000/tcp
demo_beta   *:3001->5001/tcp
demo_nginx  *:443->443/tcp

Я могу получить доступ к услугам извне по адресу:

https://my-host/alpha/some_endpoint
https://my-host/beta/some_endpoint

Теперь мне нужно, чтобы служба alpha вызывала службу в бета-версии.Если я запускаю приложения в обычных док-контейнерах, то работает следующий вызов из альфа-версии в бета-версию:

url = https://my-host/beta/some_endpoint
requests.get(url, cert, verify)

Обратите внимание, что при запуске в Docker Swarm приложения работают на разных хостах, но используют одну и ту же сеть.,Я не могу установить соединение между приложением и приложением, чтобы оно работало, когда приложения выполняются как службы в Docker Swarm.Я все еще могу позвонить в каждую службу приложений из-за пределов роя:

https://my-host/alpha/some_endpoint -> works
https://my-host/beta/some_endpoint  -> works

Я не могу получить альфа-версию для использования службы из бета-версии.Я попытался просто использовать имя службы:

url = https://beta-app/some_endpoint -> connection refused
url = https://beta-app:5001/some_endpoint -> hostname doesn't match
url = https://my-host/beta/some_endpoint > name or service not known

запросы .get () всегда терпит неудачу

Какой правильный URL-адрес используется для одной службы Docker Swarm для вызова другой?Нужно ли искать внутренний IP-адрес службы?

1 Ответ

0 голосов
/ 22 января 2019

Использование Service name в качестве host поможет установить связь между двумя сервисами / контейнерами Docker, работающими в Docker Swarm в одной оверлейной сети.

Ссылка: https://docs.docker.com/v17.12/docker-cloud/apps/service-links/#discovering-containers-on-the-same-service-or-stack

Пример файла стека: test.yml

version: "3.4"
services:
    # This is the service name which is used in master as host.
    # ex: http://shard:<port>
    shard:
        image: ramidavalapati/shard:0.1
        deploy:
            restart_policy:
                condition: on-failure
        networks:
            - abc
    master:
        image: ramidavalapati/master:0.1
        deploy:
            restart_policy:
                condition: on-failure
        ports:
            - 5000:80
        networks:
            - abc
networks:
    abc:
        driver: overlay

развертывание: sudo docker stack deploy -c test.yml test

вызов API: curl http://localhost:5000. Этот вызов перейдет в мастер-сервис, а мастер-сервис вызовет сервис шарда.

Мастер (app.py):

import urllib

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    r = urllib.urlopen("http://shard:80")
    return r.read()

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

осколок (app.py):

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

Dockerfile для мастера и шарда:

FROM python:2.7-slim
RUN pip install Flask
ADD . .
CMD ["python", "app.py"]
...