Краткое введение в docker swarm mode

Swarm join

Итак, самый простой способ заполучить бинарный файл со свормом — это скачать его образ себе на локальную машину, потом распакровать образ и извлечь любым возможным способом. Я же предпочитаю собирать его для себя сам. Решать как лучше я оставлю читателю.

Представим что у нас уже есть бинарник с Docker Swarm, мы скопировали его на наш настраиваемый сервер с докером. теперь нам нужно просто настроить Swarm по средством написания upstart-скрипта:

SERVER_IP вы можете легко извлечь сами, у меня он вставляется подставляясь из Elastic IP во время создания сервера в Амазон с помощью Ansible. Это именно тот айпи по которому будет соединятся SWARM Manage к этому докер хосту.

теперь стартуем наш swarm join:

проверить можно запросом типа такого

и должны получить ответ :

Теперь так же размасштабируйте кластер в любое колличество регионов. Меняя в настройках докер демона метки (lables) для каждого региона. Также можно добавлять несколько меток на каждый сервер (удобно делить сервера по регионам а также, скажем, производительности процессора, размеру памяти, типа диска).

Дополнение. Добавляем еще неограниченное кол-во хостов с проектами

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

1. нужно добавить строчки в /etc/hosts на вашей машине mac (или windows — c:\windows\system32\drivers\etc\hosts), чтоб ваша операционная система понимала по какому адресу обращаться при запросе вашего хоста.

нажимаем ctrl + o, ctrl+x (перезаписываем и сохраняем файл)

2. добавляем в файл конфига /Users/your_name/Documents/docker/lamp/config/vhosts/default.conf
следующие строчки, он будет синхронизирован с контейнером Докер.

3. Чтобы наши изменения вступили в силу — перезапускаем контейнеры:

Используйте службы и задачи для развертывания

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

  • Служба репликации — распределите серию задач репликации на каждый узел в зависимости от необходимого вам состояния настройки, например «—— репликации 3».

  • Глобальный сервис, применимый к задачам обслуживания на всех доступных узлах в кластере, например «—mode global». Если у вас есть 7 узлов Docker в кластере Swarm, на всех узлах будут соответствующие контейнеры.

Модель Docker Swarm имеет ограниченные возможности по управлению постоянным хранилищем данных. Когда узел выходит из строя, узел управления обходит каждый связанный контейнер и создает новый контейнер, чтобы продолжать поддерживать исходное рабочее состояние. Поскольку контейнер будет удален после того, как он перейдет в автономный режим, мы потеряем все вложенные тома данных в нем. К счастью, кластер Galera позволяет каждому контейнеру MySQL автоматически использовать состояние / данные для принятия конфигурации при присоединении.

установка Swarm Manage

Итак, теперь перейдем непосредственно к установке нашего сворм менеджера. По сути, его установка мало чем отличается от установки Swarm Join.

опять же повторяем шаги по копированию бинарника на сервер и далее создаем UPSTART скрипт:

SWARM_MANAGE_IP это айпи нашего Manage. В нашем случае — 200.200.200.200. Остановимся на -strategy эта опция определяет распределение контейнеров по нодам соответствующим все параметрам выборок. При стратегии binpack — вначале заполняется контейнерами первая нода, только потом — вторая. Если у вас сотни стартов/остановок контейнеров в час — это позволяет избежать фрагментации и позволяет удалять ненужные ноды из кластера.

Существуют 3 вида стратегий распределения контейнеров:

spread — распределение на наименее загруженную ноду
binpack — максимально плотная упаковка контейнеров
random — тут нечего и говорить — все и так понятно :) используется только для дебага.

теперь наконец запустим наш swarm manage:

и проверим что у нас вышло :

и получим что-то вроде этого :

по сути можно уже запускать контейнера :

Итак, у нас есть кластер, в котором можно запускать контейнера в зависимости от региона, и других данных. Что же дальше? — попробуем организовать по точку входа для каждого региона.

Docker Swarm cluster

Cluster construction

The two host ips that have been prepared are 192.168.12.205: IoTBroker and 192.168.12.206: iotdiscovery

Create a docker swarm cluster:

Check the swarm status: can be found

Description swarm has been activated View node status:

You can see the node situation of the swarm cluster. This cluster now has only one node, that is, the 206 local machine, whose role is the leader, that is, the management node.

Join the worker node to the cluster: View node status:

You can see that there are already two nodes in the swarm network, the management node on 206 and the working node on 205. The roles of the manager and worker of the node can be changed. For example, if you want to turn 205 into a management node and 206 into a working node, you only need to enter the 205 terminal and execute: can complete the role change

Cluster node operation

View the docker node configuration:

Some of the configurations can be modified so that the location and resources of the container can be precisely customized according to these configuration attributes when building with the compose file.

Modify the docker node configuration:

Docker Swarm

При преобразовании хостов в кластер нужно воспользоваться утилитой кластеризации Docker Swarm. Хост, находящийся в его составе, называется «узлом» (node), который бывает управляющим или рабочим. Один кластер содержит только один управляющий «узел».

Некоторые возможности утилиты

  1. Управление нагрузочными характеристиками — осуществляется оптимизация рассылки запросов между хостами, обеспечивая на них равномерную нагрузку.
  2. Динамическое управление — допускается добавление элементов в swarm-кластер без дальнейшего его перезапуска.
  3. Возможность масштабирования — позволяет добавлять или удалять docker-образ для автоматического создания контейнера.
  4. Восстановление «узла» после сбоя — работоспособность каждого хоста постоянно контролируется управляющим «узлом». При сбое кластера происходит его восстановление и перезапуск.
  5. Rolling-update — выполняет обновление контейнеров. Процедура может выполняться в определенной последовательности и с временной задержкой для запуска другого контейнера. Параметр указывается в настройках. Если произойдет сбой обновления, то Docker Swarm выдаст ошибку и процесс повторится заново.

Установка контейнера docker0

Все команды надо делать по рутом.

1) В файле /etc/lxc/default.conf закоментируйте строчки:

2) Установитк два контейнера:

3) Раскоментируйте обратнр строчки

4) Внесите изменения в файл /var/lib/lxc/docker0/config

Раскоментируйте строку

Это позволит создать Nested контейнер — возможность запустить контейнер в контейнере (вложенные контейнеры).

Добавьте в файл следующие строки

В файле /var/lib/lxc/docker0/rootfs/etc/netplan/10-lxc.yaml укажите:

5) Пересоздайте resolv.conf

Укажите в нем новый адреса DNS серверов:

Достаточно указать ДНС 172.30.0.1. На хост машине запускается dnsmasq на этом адресе и является проксирующим ДНС. Также он резолвит все домены из /etc/hosts. Поэтому при настройке сети на хосте нужно было в /etc/hosts прописать IP адреса контейнеров docker0 и docker1.

6) Скопируйте ssh ключ. Вместо /home/user укажите вашу домашнюю папку.

7) Запустите контейнер и подключитесь к нему:

8) Установите программы:

9) Установите локаль. Раскоментируйте строки в файле /etc/locale.gen

nano /etc/profile.d/0.locale.sh

Пересоздайте локаль:

10) Установите ssh сервер:

11) Далее нужно переподключиться к контейнеру через ssh.

Выйдите из контейнера:

Linux vs Windows

Где работает эта магия?

Родной операционной системой для docker является OS Linux, но время не стоит на месте и в текущий момент есть возможность запускать контейнеры и на операционной системе Windows/ Причем, появились и контейнеры на базе операционной системы Windows

В настоящее время в Windows реализована функция WSL2 – поддержка Windows Subsystem for Linux. Она поддерживается с версии сборки 19041 и позволяет полноценно работать с Linux-оболочкой в ОС Windows.

Если вы хотите попробовать поработать с Docker на Windows, есть два варианта:

  • поставить виртуальную машину с Linux на Windows и устанавливать Docker в нем;

  • либо поставить WSL2 и разобраться, как в ней работать с Docker. В WSL2 решено большое количество проблем, она работает более стабильно. Если вы работаете в VS Code – там есть классные плагины поддержки WSL прямо внутри среды. Вы можете работать с файловой системой виртуальной машины внутри VS Code.

Рекомендация простая — если работаете на Windows – используйте WSL2.

В продуктивной среде, правильнее работать с Docker на Linux – так как его родная операционная система, и на ней будет минимальное количество проблем.

Еще один момент, который стоит отметить: контейнеры бывают двух вариантов – на базе образов операционных систем Windows и Linux.

В интернете размещено большое количество уже собранных образов и исходников для Linux-контейнеров.

Windows-контейнеры тоже появляются, но там есть свои проблемы:

  • Windows-контейнеры не содержат графической оболочки, поэтому работа с приложениями, имеющими завязку на GUI, будет вызывать проблемы. Например, при запуске клиента 1С вы не увидите, что происходит внутри контейнера и дополнительная установка, например, VNC проблему не решит.

  • Windows требует, чтобы версия ОС хоста соответствовала версии ОС контейнера. Если вы хотите запустить контейнер на основе новой сборки Windows, убедитесь, что у вас есть эквивалентная сборка хоста

  • Требования наличия лицензии на запуск. Вы не можете использовать образ контейнера, если у вас нет лицензии на соответствующую версию ОС

Стоит отметить, что на текущий момент Windows позволяет запускать как линуксовые, так и Windows-контейнеры, но на OS Linux можно запустить только Linux-контейнеры.

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

Начинаем установку

1. Устанавливаем git, чтоб он был доступен из командной строки. Процесс описывать не буду, это легко гуглится.

2. Устанавливаем сам Docker desktop for mac/windows https://docs.docker.com/docker-for-mac/install/https://docs.docker.com/docker-for-windows/install/

Затруднений при установке возникнуть не должно, делать все как описано в инструкции по этим ссылкам.
Главное чтоб у вас установился Docker desktop, чтобы его иконка отображалась в строке состояния со статусом: is running

В процессе установки на своё усмотрение выделяете необходимое кол-во ядер, памяти и места на женском диске.
Для windows не забудьте в настройках указать раздел жесткого диска.

3. Проверяете установился ли Докер. Когда вы установили сам клиент docker — открываете командную строку и вводите:

После выполнения команды должна отобразиться версия докера.

Если все хорошо на этом шаге — то, отлично, переходим дальше!

4. Теперь мы выберем сборку контейнеров для докера и создадим папку, в которой все это будет храниться.

Вообще можно собрать конечно самому сборку и я вначале так и пытался сделать, однако столкнулся с множеством проблем, чтением мануалов. Что привело меня к поиску уже готовой сборки для веб сервера. И я такую нашел: https://github.com/sprintcube/docker-compose-lamp

В нее входят следующие компоненты:

  • PHP (вы сами можете выбрать нужную вам 1 из 6 версий. начиная с 5.4 до 7.4)
  • Apache
  • MySQL
  • phpMyAdmin
  • Redis

Теперь нужно создать папку куда мы ее скачаем. У меня это — /Users/your_name/Documents/docker/lamp

lamp — это название сборки (в первую очередь для меня, чтобы не забыть)

5. Далее читаем Installation https://github.com/sprintcube/docker-compose-lamp
переходим в папку и выкачиваем файлы с репозитория:

6. Команда docker-compose up -d

Это команда обращается к пакетному менеджеру docker, скачивает и устанавливает (если еще не установлены) все компоненты которые описаны в docker-compose.yml — собирает их вместе и запускает контейнеры.

В файле docker-compose.yml — вы увидите какие именно это пакеты и как они прописаны. Обязательно откройте этот файл и ознакомьтесь с содержимым!

Первый раз процесс скачивания и установки может быть немного длительным, и в результате в командной строе должно отобразиться:

Поздравляю! Теперь можете заходить на localhost и отобразиться страничка, которая расположена по адресу /Users/your_name/Documents/docker/lamp/www/index.php

Разумеется, вы ее меняете, закачиваете в папку свой проект и наслаждаешь дальнейшей разработкой!

Исправление ошибок при запуске Docker Swarm

1) Если Docker swarm в LXC выдает ошибку:

или

То это означает, что у вас установлено старое ядро. Обновите ядро на хост машине согласно инструкции.

И не загружен модуль ядра br_netfilter. Его нужно загрузить командой:

Или прописать его в автозагрузку (об этом ниже в инструкции).

Более подробно об этой ошибке:https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1618283

2) Может возникнуть эта ошибка;

и syslog будет выдавать следующее

Это связано тоже с версией ядра и тем, что модуль br_netfilter не загружен.

3) Не пингуются контейнеры между собой и не пробрасывается порт. Это происходит по одной причине. Почему то виртуальные IP адреса и ingress в докер под LXC не работают. Решается это просто. Нужно включить dnsrr (DNS Round Robin) в секции для каждого сервиса и использовать mode: host при проброске портов. Ниже в самом конце статьи, я привожу пример yaml файла, где указаны эти параметры.

DNS Round Robin — это способ адресации к сервисам. В докере существуют два способа через виртуальные ip адреса (по умолчанию) и через DNS Round Robin. При использовании виртуальных IP адресов, для каждого сервиса создается IP адрес и все контейнеры его получают при поиске сервиса. При отправке пакета на этот IP адрес, докер сам разруливает к какому контейнеру отправить запрос. Получается виртуальный IP адрес — это промежуточный IP адрес. При использовании DNS Round Robin будут другие контейнеры будут получать прямые IP адреса контейнеров.

mode: host отвечает за проброс портов. Существует два варианта ingress (по умолчанию) и host. При использовании ingress обращение на порт любого серверу в Docker кластере будет переадресовано в контейнер, где указан проброс этого порта. Если поставить mode: host, то проброс потров будет работать только на том сервер, где запустился этот контейнер.

Метод 1: Настройка UFW для поддержки Docker Swarm

Если вы только настроили хосты Docker, вы можете использовать предварительно установленный брандмауэр UFW.

Чтобы открыть необходимые порты, на одном из менеджеров Swarm запустите следующий набор команд:

Затем перезапустите UFW:

Если брандмауэр UFW не включен, введите команду:

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

После этого нужно выполнить следующие команды на всех воркерах кластера:

Не забудьте после этого перезапустить на воркере UFW:

Опять же, если брандмауэр не включен, включите его:

Перезапустите демон Docker:

Теперь брандмауэр UFW поддерживает Docker Swarm.

Первичный запуск кластера

Проинициализируем наш кластер (Первичный запуск): на sever1.consul.example.com:

Сервис должен запустится и захватить терминал. В bootstrap режиме сервер сам назначает себя мастером и инициализирует все нужные структуры данных.

На остальных двух серверах (sever2.consul.example.com, sever3.consul.example.com) просто запускается консул в режиме сервера.

Эти сервера подсоединяются к bootstrap серверу. В данный момент мы имеем кластер из трех серверов, два из которых — работают в обычном режиме сервера, и один — в режиме инициализации, что значит что он сам принимает решения по распространению данных не спрашивая остальных.

Теперь мы можем остановить bootstrap сервер и перезапустить консул в режиме стандартного сервера:

На bootstrap сервере нажмите:

Консул остановится и затем перезапустите в режиме стандартного сервера :

sever1.consul.example.com:

Проверьте что все прошло хорошо с помощью такой команды:

Вывод должен быть :

Итак, у нас есть готовый и работоспособный консул кластер.

Что такое режим Swarm

Docker в Swarm режиме это просто Docker Engine, работающий в кластере. Кроме того, что он считает все кластерные хосты единым контейнерным пространством, он получает в нагрузку несколько новых команд (вроде  и ) и концепцию сервисов.

Сервисы — это ещё один уровень абстракции над контейнерами. Как и у контейнера, у сервиса будет имя, базовый образ, опубликованные порты и тома (volumes). В отличие от контейнера, сервису можно задать требования к хосту (constraints), на которых его можно запускать. Да и вообще, сервис можно масштабировать прямо в момент создания, указав, сколько именно контейнеров для него нужно запустить.

Но важно понимать одну большую разницу. Сама по себе команда  не создаёт никаких контейнеров

Она описывает желаемое состояние сервиса, а дальше уже Swarm менеджер будет искать способы это состояние достигнуть. Найдёт подходящие хосты, запустит контейнеры, будет следить, чтобы с ними (и хостами под ними) всё было хорошо, и перезапустит контейнер, если «хорошо» закончится. Иногда желаемое состояние сервиса так и не будет достигнуто. Например, если в кластере закончились доступные хосты. В таком случае сервис будет висеть в режиме ожидания до тех пор, пока что-нибудь не изменится.

Запуск Apache 2.4 с модулем 1С внутри Docker контейнера

Про Apache и про Linux слышали, наверное, все. А вот про Docker пока нет, но он сильно набирает популярность последнее время и не зря. Поделюсь своим опытом и дам пошаговую инструкцию настройки веб-сервера Apache с модулем 1С внутри Docker контейнера на Linux хосте. При этом сам сервер 1С может находиться совсем на другой машине и на другой операционной системе

Это не важно, главное чтобы Apache смог достучаться до сервера 1С по TCP. В статье дам подробное пояснение по каждой используемой команде со ссылками на документацию по Docker, чтобы не создавалось ощущение непонятной магии

Также прилагаю git репозиторий с описанием всей конфигурации, можете попробовать развернуть у себя буквально за 10 минут.

Преамбула

Некоторе время назад перед нами стала задача спроектировать и развернуть систему для потокового видео. Суть была в массовом запуске/остановке инстанций, на которых происходит обратная сборка потокового видео и стриминг на множество media cdn провайдеров (youtube, livestream, ustream итд ) а также на собственные rtmp и ts точки назначения. Каждая инстанция требовала настройки перед запуском т.к. содержала специфическую для каждого клиента информацию. Также было понятно, что система должна работать в большом количестве регионов (как минимум во всех точках, где присутствует Амазон, а как максимум — в любом месте где можно ). Также основное требование — запуск инстанции в течении 1-2 секунд максимум, чтобы это было прозрачно для пользователя.

Было это в начале 2015 года уже были разговоры о том что Docker в скором времени выпускает родную систему кластеризации. И 26 февраля 2015 года она таки вышла. Сразу стало понятно что это для нас серебряная пуля и Swarm идеально ложится на наш проект. Проект был запущен в мае 2015.

Через 11 месяцев мы запустили второй, более сложный проект в котором требовалось организовать статические точки входа (ip:port) для оборудования третьих производителей, расширив при этом всю логику работы и запуска инстанций динамически в нужном регионе.

Powerful Docker management graphical interface: Protainer.io

Finally, I recommend an image interactive interface program that can get rid of the command line and realize docker management.Protainer.io installation instructions Show results After the installation is complete, use a browser to access port 9000 of the running protainer container ip, and you can get the following interface. (IE is recommended, Chrome is not accessible anyway)

The container of Protainer enables the interactive interface to run. After successfully establishing this interface, you can add the Docker status of other ip address hosts to this interface. There is no need to run the protainer container on each host, only port 2375 needs to be exposed. For linuxx:

Modify the docker file

Restart the docker service

You can add another host on the endpoint page

Almost all the operations on docker are included in protainer. Almost all the work that can be done with the command line can be done on this interactive interface, which is intuitive and convenient.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: