2017-01-19 9 views
0

Я хочу использовать docker-compose с Docker Swarm (я использую докер версии 1.13 и сочиняю с синтаксисом version: '3'). Является ли каждая услуга доступной как «единая» услуга для других служб? Вот упрощенный пример, чтобы быть ясно:Docker Swarm Service Clustering

version: '3' 

services: 
    nodejs: 
    image: mynodeapp 
    container_name: my_app 
    ports: 
     - "80:8080" 
    environment: 
     - REDIS_HOST=my_redis 
     - REDIS_PORT=6379 
    deploy: 
     mode: replicated 
     replicas: 3 
    networks: 
     - my_net 
    command: npm start 

    redis: 
    image: redis 
    container_name: my_redis 
    restart: always 
    expose: 
     - 6379 
    deploy: 
     mode: replicated 
     replicas: 2 
    networks: 
     - my_net 

networks: 
    my_net: 
    external: true 

Скажем, у меня есть 3 виртуальные машины, которые настроены как рой. Таким образом, на каждой виртуальной машине есть один контейнер nodejs, но есть только два контейнера redis.

На VM, где нет redis запущен: Будет ли контейнер nodejs узнать о redis?

Addiitonal вопросы: Когда я установил replicas: 4 для моего Redis, я буду иметь два REDIS контейнер на один VM: Будет ли это быть проблемой для моего nodejs приложения?

Последний вопрос: Когда я установил replicas: 4 для моего nodeapp: Будет ли это работать даже потому, что я теперь выставил два раза порта 80?

ответ

0

В том же порядке, что вы спросили:

  1. Одна услуга не видит другую услугу, как будто она сделана из реплик. Nodejs увидит уникальный Redis, который будет иметь один IP-адрес, независимо от того, в каком узле находятся его реплики. Это красота Рой.
  2. Да, вы можете иметь Nodejs в одном узле и Redis в другом узле, и они будут видны друг другу. Это то, что делает менеджер; сделайте контейнеры «верьте», что они работают на одной машине.
  3. Кроме того, вы можете иметь много реплик в одном и том же узле без проблем; они будут восприниматься как целое. Фактически, они используют один и тот же объем.
  4. И последнее, как следствие (1), не будет проблем, потому что вы на самом деле не подвергаете порт 80 дважды. Даже имея 20 реплик, у вас есть уникальная точка входа в вашу службу, конкретное направление IP: PORT.
+0

3. Но если у меня есть реплицированная база данных на ** разных узлах **, мне нужно настроить кластер для базы данных, потому что мне нужны синхронизированные данные - правильно? – Munchkin

+0

@ Манчкин Я не уверен, что вы подразумеваете под этим. Docker Swarm гарантирует, что у вас будут синхронизированные данные независимо от того, сколько реплик имеет ваша служба и сколько узлов они распространяются, вам не нужно беспокоиться об этом. –

+1

Чтобы быть ясным: например, У меня 3 реплицированных redis. Первый запрос приходит на redis # 1, и он обновит key1. Затем, позже, другой запрос приходит к redis # 2: Есть ли у redis # 2 новый (обновленный) ключ? Даже ** без настройки redis-cluster ** (опция «с включенным кластером да»)? – Munchkin

1

Услуги должны быть без гражданства. В случае с базами данных необходимо установить режим кластера в каждом экземпляре, поскольку они являются statefull.

+0

«в каждом экземпляре» - так что у меня действительно есть так ssh ('docker exec -it container/bin/sh') во всех случаях? Мех, это звучит как плохой способ обхода =/ – Munchkin

+0

Конфигурация будет зависеть от каждого конкретного решения (statefull). Например, для couchbase посмотрите на этот пример. Https: //blog.couchbase.com/couchbase-cluster-docker-swarm-compose-machine/ И это очень хорошая статья, связанная с этим Https://blog.couchbase.com/deploy-docker-compose-services-swarm/ приветствует –