Я пытаюсь настроить рой с помощью Docker, но у меня проблемы с взаимодействием между контейнерами. У меня кластер с 5 узлами. 1 менеджер и 4 рабочих.

3 приложения: Redis, Splash, MyApp

Myapp должен быть на 4 рабочих

Redis, брызги только на менеджера

Myapp должен иметь возможность общаться с Redis и всплеск

Я попытался использовать имя контейнера, но он не работает. Он разрешает имя контейнера для разных IP-адресов.

ping splash # return a different ip than the container actually has

Я развернул запуск роя, используя docker stack

docker stack deploy -c docker-stack.yml myapp

Связывание контейнера между ними также не работает. Любые идеи ? Я что-то пропустил ?

root@swarm-manager:~# docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:42:18 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:56 2017
 OS/Arch:      linux/amd64
 Experimental: false

Docker-stack.yml содержит:

version: "3"
services:
    splash:
        container_name: splash
        image: scrapinghub/splash
        ports:
            - 8050:8050
            - 5023:5023
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == manager

    redis:
        container_name: redis
        image: redis
        ports:
            - 6379:6379
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == manager

    myapp:
        container_name: myapp
        image: myapp_image:latest
        environment:
            REDIS_ENDPOINT: redis:6379
            SPLASH_ENDPOINT: splash:8050
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == worker
        entrypoint:
            - ping google.com

---- РЕДАКТИРОВАТЬ ----

Я попробовал также с curl. Не сработало docker stack deploy -c docker-stack.yml myapp

Creating network myapp_default
Creating service myapp_splash
Creating service myapp_redis
Creating service myapp_myapp

curl http://myapp_splash:8050

curl: (7) Failed to connect to myapp_splash port 8050: No route to host

curl http://splash:8050

curl: (7) Failed to connect to splash port 8050: No route to host

То, что сработало, так это получение фактического имени контейнера splash, которое представляет собой произвольную сгенерированную строку

curl http://myapp_splash.d7bn0dpei9ijpba4q41vpl4zz.tuk1cimht99at9g0au8vj9lkz:8050

Но это не очень помогает мне.

1
Bogdan Boamfa 24 Окт 2017 в 17:37

3 ответа

Лучший ответ

Мне удается заставить его работать, используя curl http://tasks.splash:8050 или http://tasks.myapp_splash:8050.

Я не знаю, что является причиной этой проблемы, хотя. Не стесняйтесь комментировать с ответом.

1
Bogdan Boamfa 25 Окт 2017 в 10:02

Пинг не является подходящим инструментом для подключения служб. По некоторым причинам это не работает с сетями докеров. Попробуйте вместо этого свернуться http: // serviceName.

Кроме этого: контейнеры не могут быть названы при использовании стека развертывания, вместо этого имя вашей службы используется (по совпадению то же самое) для доступа к другой службе.

2
herm 24 Окт 2017 в 15:10

Кажется, что контейнеры в стеке с именем tasks.<service name>, поэтому команда ping tasks.myservice работает для меня!

Стоит отметить, что такие имена, как <stackname>_<service name>, также разрешаются и могут пинговаться, но IP-адрес неверен. Это расстраивает.

(Например, если вы сделаете docker stack deploy -c my.yml AA, вы получите имя типа AA_myservice, которое будет преобразовываться в неправильные адреса)

Добавить к ответу выше. С точки зрения сети curl и ping делают одно и то же. Оба будут пытаться разрешить имя, переданное им, а затем curl попытается подключиться по указанному протоколу (http приведен в примере выше), а ping отправит эхо-запросы ICMP.

0
Fyodor 6 Фев 2019 в 01:02