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

Я только начал пользоваться докером. Мне удалось создать файл компоновки докеров, который развертывает три компонента моего приложения с необходимым количеством репликаций на одном хосте. Я хочу воспроизвести то же самое на нескольких хостах. У меня есть три процесса: A [7 копий], B [1 копия], C [1 копия] Я следил за руководством по созданию роя на веб-сайте докеров, и мне удалось создать менеджера и прикрепить к нему двух воркеров.

Итак, теперь, когда я запускаю свою команду

 docker stack deploy --compose-file docker-compose.yml perf

Он действительно порождает необходимое количество машин, но все они находятся в самом менеджере. В идеале я бы хотел, чтобы они создавали C и B в диспетчере и объявляли копии A, распределенные между worker 1 и worker 2. Вот мой файл docker -compose

version: '3'

services:

  A:
    image: A:host
    tty: true
    volumes:
      - LogFilesLocationFolder:/jmeter/log
      - AntOutLogFolder:/antout
      - ZipFilesLocationFolder:/zip
    deploy:
      replicas: 7
      placement:
        constraints: [node.role == worker]
    networks:
      - perfhost

  B:
    container_name: s1_perfSqlDB
    restart: always
    tty: true
    image: mysql:5.5
    environment:
      MYSQL_ROOT_PASSWORD: ''
    volumes:
      - mysql:/var/lib/mysql
    ports:  
      - "3306:3306"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
       - perfhost

  C:
    container_name: s1_scheduler
    image: C:host
    tty: true
    volumes:
      - LogFilesLocationFolder:/log
      - ZipFilesLocationFolder:/zip
      - AntOutLogFolder:/antout
    networks:
      - perfhost
    deploy:
      placement:
        constraints: [node.role == manager]
    ports:
      - "7000:7000"


networks:
  perfhost:

volumes:
     mysql:
     LogFilesLocationFolder:
     ZipFilesLocationFolder:
     AntOutLogFolder:

B) И если у меня все получится, как мне использовать тома для передачи данных между Conatiner для службы A и контейнером для службы B, учитывая, что они находятся на разных хост-машинах.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
2 061
3

Ответы 3

Сначала ты должен бежать docker node ls И проверьте, все ли ваши узлы доступны. Если да, то вы должны проверить, есть ли у воркеров образы, необходимые для запуска контейнеров. Я бы также попробовал с ограничением, используя вместо этого идентификатор каждого узла, вы можете увидеть идентификаторы с помощью предыдущей команды.

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

Tanmay Bhattacharya 02.05.2018 20:18

@Imrak Я задавался вопросом, является ли документ docker-compose правильным или нет, потому что в документе, который я где-то упоминал, чтобы распределить службу A между 2 рабочими, что, если присутствует несколько рабочих, docker позаботится об этом самостоятельно?

Tanmay Bhattacharya 02.05.2018 20:19

Да, одна служба Docker с несколькими репликами по умолчанию масштабируется.

Bret Fisher 03.05.2018 02:49

Как упоминал @BretFisher, докер будет масштабироваться по умолчанию. Примечание. Исключение составляют случаи, когда вы запускаете службу в глобальном режиме, когда каждый узел запускает отдельный экземпляр. docs.docker.com/engine/reference/commandline/service_scale/…

namokarm 03.05.2018 15:54

Несколько советов и ответов:

  • для названий служб я не рекомендую заглавные буквы. Используйте допустимые имена хостов DNS (строчные буквы, без специальных символов, кроме -).
  • container_name не поддерживается в swarm и не требуется. Похоже, C: должен быть чем-то вроде scheduler и т. д. Сделайте имена служб простыми, чтобы их было легко использовать / запоминать в своей виртуальной сети.
  • Все службы в одном файле compose всегда находятся в одной сети докеров в swarm (и docker-compose для локальной разработки), поэтому нет необходимости в назначении сети или перечислении.
  • перезапуск: в рое всегда не нужен. Этот параметр не используется и в любом случае используется по умолчанию. Если вы используете его для docker-compose, он редко нужен, так как вы обычно не хотите, чтобы приложения находились в цикле респауна во время ошибок, которые обычно приводят к состоянию гонки ЦП. Я рекомендую не использовать его.
  • Тома используют «драйвер тома». По умолчанию это local, как и обычные команды докера. Если у вас есть общее хранилище, вы можете использовать подключаемый модуль драйвера тома с store.docker.com, чтобы обеспечить подключение общего хранилища к правильному узлу.
  • Если у вас все еще возникают проблемы с назначением задач работнику / менеджеру, предоставьте нам выходные данные docker node ls и, возможно, docker service ls и docker node ps <managername>, чтобы мы помогли устранить неполадки.

Большое спасибо @Bret, это многое проясняет, я действительно заставил рой работать, возникла проблема с тем, что он теперь работает с образами контейнера. Я прочитал один из ваших других ответов, где вы рекомендуете Rex-ray, я попробую использовать его для настойчивости. Просто интересно, позволяет ли rex Ray нескольким клиентам читать и писать на общем томе хранения? или я могу добиться этого с помощью плагина драйвера тома?

Tanmay Bhattacharya 03.05.2018 07:17

В основном мне нужно передать данные из службы C в 7 копий службы A, даже если я использую отдельные тома, поэтому в любой момент к этому тому будут подключены две службы A и C. Я не думаю, что RexRay позволяет это, есть ли другой плагин, который я могу использовать для этого? Может, Флокер?

Tanmay Bhattacharya 03.05.2018 08:03

В случае большинства драйверов громкости они просто позволяют вам использовать любой базовый общее хранилище, который вы хотите. Характеристики хранилища что будут определять, можете ли вы иметь несколько подключений для чтения / записи к этому тому хранилища. Например: AWS EBS и DigitalOcean Block Storage позволяют подключаться только одному контейнеру за раз (взаимно однозначное отношение). AWS EFS допускает соединение «многие к одному», поскольку он спроектирован как сетевое хранилище NFS. REX-Ray просто автоматизирует процесс подключения.

Bret Fisher 03.05.2018 17:59

Флокер мертв. Если вам нужна полная репликация файлов, подумайте о portworx.com, но я думаю, он все равно не будет правильно открывать файлы (например, базы данных). Для этого вам нужна репликация на уровне приложения (кластеры баз данных и т. д.)

Bret Fisher 03.05.2018 18:00

Мое основное требование - чтобы несколько приложений совместно использовали некоторые файлы, прежде чем пытаться докеризовать всю настройку, я использовал простую общую папку в Windows для этих целей. Насколько я понимаю, я думаю, что раздел NFS должен работать за меня?

Tanmay Bhattacharya 04.05.2018 16:31

Запуск до docker stack deploy:

mkdir /srv/service/public
docker run --rm -v /srv/service/public:/srv/service/public my-container-with-data cp -R /var/www/app/public /srv/service/public

Используйте каталог /srv/service/public как том в контейнерах.

Другие вопросы по теме