Ранее…
В оформлении Предыдущий пост Мы видели введение в контейнеры докера и Linux и одно возможное использование для Smalltalk. Мы увидели, как создать Dockerfile для приложения для приложения для приморских приложений, разработанных и работает внутри VasmallTalk Создайте документ Docker и, наконец, запустите с ним контейнер.
Однако один из выводов из этого поста заключается в том, что с простой Докер
Команда мы можем запустить только один контейнер одновременно, и только в этом узле Docker работает. Итак, в этом посте я хотел бы дать вам введение в Docker Rash, что позволит нам сделать это. Но, чтобы облегчить понять, в этом посте мы увидим пример одного узла (но несколько контейнеров).
Кстати, большое спасибо Julian Maestri и Norbert Schlemmer за вашу помощь!
Докер Рой и Докер-Состав
Docker может работать в «MODE MODE», который в основном позволяет создавать кластер соединений докеров. Таким образом, вы можете запустить x количество контейнеров в пределах Y Количество узлов. Конечно, Докер Рой Поставляется с большим количеством инструментов для облегчения управления кластером.
Docker-Compose — это другой инструмент, который вроде в середине между простой докером (только один контейнер работает) и рой. Это позволяет запускать несколько контейнеров, но только в этом узле, насколько я понимаю. Из-за этого я не думаю, стоит тратить слишком много времени, объясняя/узнав об этом и просто переехать в рой.
Давайте начнем использовать Docker Rash для нашего применения SmallTalk
Мы продолжим с самого тот же пример В предыдущем посте, который является этим световым приморским демонстрацией, работающей на малине PI 3.
Жидкая ошибка: внутренний
Важно отметить, что для работы рома вам не нужны дополнительные пакеты или что-то еще, он просто поставляется с обычной установкой докера.
Таким же образом DockerFile был самым важным файлом для определения образа докера, Docker-Compose.yml
Это тот для рома. Вот где вы определяете, какие услуги вы хотели бы в вашем кластере, сколько «экземпляров» их, и все возможные конфигурации. Ниже наш пример:
# To start it up. # ./startSwarm.sh # To stop it # ./stopSwarm.sh version: '3' services: seaside: image: seaside-debian-slim deploy: replicas: 10 labels: traefik.port: 7777 traefik.frontend.rule: "HostRegexp:{catchall:.*}" traefik.backend.loadbalancer.stickiness: "true" balancer: image: traefik:v1.7 deploy: placement: # The webserver should only load on manager nodes constraints: [node.role == manager] # To see all available command line options: docker run --rm traefik:v1.7 --help | less command: --docker --docker.swarmmode --retry --loglevel=WARN ports: - "80:80" volumes: # Required because of docker backend, so traefik can get docker data. - /var/run/docker.sock:/var/run/docker.sock:ro
Важные вещи, чтобы примечание:
- Я определяю 2 сервиса
Приморский
ибалансировщик
- Для сервиса
балансировщик
Нет ничего, что нужно сделать, потому чтоТРАФИК: V1.7
должны быть найдены и загружены из известных онлайн-репозиториев (например, Dockerhub) Вместо этого для сервиса
Приморский
Я использую изображение под названиемПриморки-Debian-Slim
который является не на публичном репозитории. Таким образом, у вас есть 3 альтернативы:- Создайте изображение в каждом узле:
Docker Build -f ./debian_slim_dockerfile -t Приморский-Debian-Slim.
(Мы будем использовать это для этого примера) - Создайте изображение только один раз, экспортируйте его на .tar и импортируйте .tar в остальных узлах (вы можете использовать
Docker Export
иDocker Import
Команды для этого) - Используйте внутренний реестр/репозиторий. Это, очевидно, звучит как лучшая альтернатива, если у вас много узлов.
- Создайте изображение в каждом узле:
- Обратите внимание, что я указываю 10 реплик для
Приморский
услуга. Это означает, что у меня будет 10 контейнеров, работающих наприморский
изображение. - Все приморские контейнеры будут делиться тем же портом 7777. Как это возможно? Почему бы вам не получить
Ошибка: Адрес уже используется
? Докер виртуализации магии. Этот порт не разоблачен, и я не думаю, что вы можете сделать это, даже если у вас есть реплики. Hostregexp: {Chatall:. \ *}
это просто правило на веб-сервере Trafik, чтобы перенаправить все в базовую услугу (приморский в нашем случае)Traefik.backend.LoadLancer.Stickiness: «Истинно»
необходимо, потому что морской каркас является штаткой, и нам нужно сродство сеанса.- Мы служим на внешнем мире над портом 80.
Как запустить рой сейчас?
Сначала давайте получим пример и построить изображение:
cd $HOME git clone https://github.com/vasmalltalk/docker-examples.git cd docker-examples/source/SeasideTrafficLights/Raspberry/ docker build -f ./debian_slim_Dockerfile -t seaside-debian-slim .
Тогда вам нужно инициализировать рой. Поскольку это будет кластер с одним узлом, единственное, что вам нужно выполнить:
docker swarm init
Наконец, все, что вам нужно сделать, это начать рой, используя мой предоставленный startswarm.sh
:
#!/bin/bash docker stack deploy --compose-file docker-compose.yml seaside-debian-slim
Вы можете увидеть там команду Docker, чтобы развернуть стопку услуг, используя Docker-Compose.yml
и называя это Приморки-Debian-Slim
Отказ
Чтобы убедиться, что все работает, вы должны взять веб-браузер и ввести в хост-машина по порту 80. Пример http://marianopi3.local/trafficlight. или http://192.168.7.91/trafficlight. . Это покажет пример светового света приморского света, который мы видим на данный момент в примерах.
Вы можете остановить рой с Stopswark.sh
У кого есть немного магии, чтобы ждать, пока сеть правильно отключается … в противном случае он потерпит неудачу, как только вы попытаетесь начать снова:
#!/bin/bash readonly STACK_NAME=seaside-debian-slim docker stack rm $STACK_NAME declare TIMEOUT=0 readonly WAIT_INTERVAL=1 readonly LIMIT=120 echo -n 'waiting for network to shutdown' while [ "$(docker network ls | grep --count "$STACK_NAME")" -gt 0 ] && [ $TIMEOUT -lt $LIMIT ]; do echo -n . sleep $WAIT_INTERVAL (( TIMEOUT+=WAIT_INTERVAL )) done if [ $TIMEOUT -ge $LIMIT ]; then echo ' failed' 1>&2 exit 1 else echo ' ok' fi
В предыдущем посте мы использовали команды Контейнер
и изображение
чтобы увидеть наши результаты. Однако с роем вы должны использовать Сервис
команды. Некоторые примеры ниже:
Итак … сделать вывод, у нас есть 1 контейнер, работающий на нагрузке Traefik Web-сервера, балансируя на 10 контейнеров, работающих на 10 контейнеров, работающих на Docker Image, который имеет VasmaStalk с морями внутри одного узла (Raspberry Pi 3+ в этом случае).
Интересные советы
Бег Docker Service Logs Приморский - Debian-Slim_seaside
Очень удобно следить за журналами услуг.
Еще одна волшебная вещь — это политика по умолчанию Автозагрузка контейнеров. Убейте одну из контейнеров … Убейте -9 или что-то еще … И посмотрите, насколько магически Docker начинает новый контейнер, чтобы поставить тот, который снизился и удовлетворил необходимые реплики (10 в этом примере).
См. Приморские контейнеры 2 и 7? Я убил их, и Докер автоматически начал их для меня:)
Что дальше?
Очевидно, что следующий шаг — сделать рой на работу с более чем одним узлом:) Итак, вот это тизер следующего поста:
Обновление: см. Следующее сообщение об этой теме!
Оригинал: «https://dev.to/martinezpeck/step-2-single-node-docker-swarm-and-smalltalk-46i0»