Transcript for:
Docker и Kubernetes для Разработчиков - Лекция 1

Всем привет С вами Евгений Сулейманов и это курс докер и кубернетес с глазами разработчика дисклеймер всё сказанное В данном видео является оценочным суждением автора и Никаким образом Не связан с компаниями с которыми автор сотрудничает цель данного видео - это дать теоретические основы и практические навыки работы с докер и кубернетес немного о себе более 10 лет опыта в разработке занимаясь созданием промышленных систем написанием кода и также публикую обучающие материалы статьи видео план нашего курса будет следующим сначала будет введение в курс в рамках которого мы ознакомимся с небольшими правилами которые позволят проходить данный курс более эффективно далее мы разберём модули которые будут в рамках нашего курса После этого мы с вами э разберём Что такое докер образы Что такое контейнеры поработаем с волюма Ани же Тома далее мы перейдём к сетевому взаимодействию контейнеров далее мы с вами создадим compose разберём детальнее докери зации springboot rest API и попробуем всё это задеплоить в aws После этого мы перейдём к кубернетес у нас будет введение в кубернетес разбор основных концепций далее будет развёртывание и работа с кубер кластером на локальное машине далее работа с томами которые относятся уже к кубернетес рассмотрим сетевое взаимодействие в рамках кубера и потом будет небольшое заключение рекомендации по работе с курсом весь курс разбит на небольшие части которые отмечен таймкодами Я рекомендую просмотреть конкретный раздел видео после этого скачать Исходный код учебного проекта который рассмотрен в рамках данной части далее повторить действия которые были выполнены в видео каждый этап Кроме того что это есть на видео он а отмечен и находится В отдельной ветке гит репозитория который мы рассматриваем там будет степ о степ 2 степ 3 и комит сообщение которое описывает что было сделано ссылки на все гит репозитории будут в описании к этому видео далее мы проверяем работоспособность приложения после выполнения задания каждого модуля и под модуля и если у Вас всё-таки будут вопросы то ответ на них вы можете увидеть в комментариях после того как вы их туда зададите Что будет изучено в курсе то есть мы с вами разберём ещё раз детальнее основы доке использование докер в Промышленной разработке с точки зрения именно ээ разработчика как инженера не девопса не тестировщика а именно разработчика далее мы перейдём к основам кубернетес И после этого мы рассмотрим использование кубернетес в Промышленной разработке как это выглядит схематично то есть основы Докера здесь мы будем рассматривать с вами образы и контейнеры далее будет работа с данными волюма и потом будет сетевое взаимодействие контейнеров После этого мы рассмотрим как же докер используется в Промышленной разработке то есть мы посмотрим как мы можем настроить приложение в котором мы работаем с с несколькими контейнерами После этого мы перейдём к использованию docker компо и далее мы попробуем задеплоить эти докер контейнеры когда мы перейдём к кубернетес мы рассмотрим ключевые элементы кубернетес То есть это будет сначала архитектура кубера в целом После этого мы разберём с вами деплоймент сервисы рассмотрим Как происходит масштабирование нашей системы и после этого мы ещё поработаем с данными и далее мы рассмотрим с вами использование кубе Промышленной разработки то есть мы с вами посмотрим как происходит сетевое взаимодействие и также попробуем задеплоить это всё на локальный кластер то есть мы развернёт кластер и попробуем прогнать примитивные команды и не только примитивные Далее по основам Докера То есть как это выглядит основа docker докер Промышленной разработки cuber кубер по Промышленной разработке думаю этих схем достаточно и можем переходить далее Что же такое доке докер - Это технология контейнеризации которая обеспечивает нам создание и управление контейнерами То есть это очень важный момент чтобы вы не думали что докер может что-то за пределами этого далее когда мы говорим о контейнере мы подразумеваем какую-то стандартную рабочую единицу То есть например Java CDE какое-то Java приложение и jdk которое есть вместе с этим приложением контейнер также имеет одинаковые поведение в любом окружении которое способно его запустить То есть если я запущу на своей машине какой-то контейнер вы запустите у нас будет с вами абсолютно одинаковое поведение далее большинство современных операционных систем Они как раз и поддерживают работу с контейнерами то есть докер - это крайне популярная технология которая решает целый ряд задач то есть очень часто Когда вы рассматриваете докер Вы можете видеть либо такую картинку либо ещё используют как контейнер потому что очень хорошая аналогия что есть какая-то коробка которую можно переместить куда угодно переместить много на чём Как на корабле на самолёте на Гру и потом его использовать открыть и уже работать с ним какие преимущества есть у контейнеров то есть контейнеры во-первых позволяют нам задавать детали окружения так как мы хотим тестировать работу нашего приложения на том же окружении на котором оно будет запущено то есть мы можем воссоздать абсолютно всё то есть операционную систему версии каких-то средств сборки версии языка и прочее далее докер даёт нам возможность поделиться нашим рабочим окружением как с членами команды так и в компании так и с другим разработчиком Если вы публикуете какой-то публичный артефакт и прочее далее доке даёт нам возможность легко переключаться между под проектами потому что более зрелые проекты могут работать на более старых версиях и также в рамках одного большого проекта могут быть приложения которые написаны как на разных версиях одного языка или фреймворка так и вообще на разных системах То есть например у вас есть какой-то большой проект на котором используется в одних проектах java8 А на других проектах используется уже дцать первая Java и чтобы вам это всё не ставить Вы можете это всё поднять через докер и использовать готовый модуль То есть например есть какой-то проект вам не обязательно даже скачивать исходники этого проекта вы взяли докер образ этого проекта вы подняли его и уже можете с ним взаимодействовать Это действительно очень и очень удобно рассмотрим виртуальную машину как некую в кавычках альтернативу Докера потому что очень часто и на собеседованиях спрашивают Чем отличается виртуалка от Докера и также на форумах Вы можете часто видеть сравнения опять-таки все пару статей я оставлю в описании к видео Но если в общем и целом мы можем разобрать базовые концепции то есть виртуальная машина - это система которая эмулировать некоторую платформу и создавать на ней среды То есть например Мы можем встать вообще новую машинку которая поверх моей osx платформы работает с Виндой или с другой операционной системой далее как это выглядит есть операционная система osx мы устанавливаем например на мою машинку Virtual Box и мы создаём две виртуальные машины то есть у меня два компьютера один на Debian который я использую для работы с pog и redes И я также свою другую виртуальную машинку которая имеет у себя Винду как операционную систему и там есть какой-то WoW Какие преимущества даёт нам виртуальная машина то есть Первое - это конечно же защита через изоляцию потому что виртуальные машины Они функционируют полностью в изолированном режиме и они защищены от потенциальных Атак То есть если у нас есть одна машинка допустим вида с не что пошло не так это никак не повлияет на машинку на которой стоит Ден далее интерактивное развитие то есть контейнеры обычно представляет собо некие статические определения и требуют конфигурации и зависимость для их запуска А виртуальные машины они более гибкие и могут настраиваться уже в интерактивном режиме то есть после того как мы указали ключевые параметры виртуальной машины её можно рассматривать как компьютер без операционной системы далее недостатки виртуальной машины то есть конечно же это первая скорость цикла разработки потому что создание и воспроизведение виртуальных машин требует значительного времени и ресурсов далее затрат на хранилище потому что виртуальные машины могут занимать значительное количество места в хранилище то есть на дисковом пространстве и в целом может привести это к нехватке дискового пространства на компьютере Где стоит вот эта сама виртуальная машинка докер в свою очередь позволяет нам создавать и управлять контейнерами как это выглядит у нас с вами есть наша операционная система поверх операционной системы то есть встроенной либо установ поверх есть слой поддержки контейнеров то есть нативный либо эмулятор далее уже уже поверх этого слоя поддержки контейнеров стоит движок Докера То есть он же docker Engine и уже благодаря докер жину Мы можем с вами создавать именно контейнеры опять-таки детальнее Что такое контейнер прочее мы разберём немного далее и соответственно уже поверх этого докер энна Я создаю два контейнера первый - это pog второй - это kickl для моего Security Какие преимущества даёт нам доке Первое - это скорость итерации то есть в большинстве контейнерных средств выполнения существует м общедоступный размещённый репозиторий с готовыми контейнерами эти репозитории содержат много популярных приложений база данных система обмена сообщениями брокеры и прочее Что поможет сэкономить затраты по времени наших разработчиков и также это надёжная экосистема то есть экосистема становится более надёжной благодаря тому что есть общедоступный репозиторий который можно увидеть образо можно просканировать и все понимают кто когда и что заливал далее недостатки Докера Конечно же это уязвимость общего узла то есть так как все контейнеры используют общую аппаратную платформу которая находится на более низком уровне э ну на уровне операционки это значит что если есть какой-то эксплоит который есть конкретно в докере он может повлиять на работу всей машинки и на работу других контейнеров которые у нас есть какие же ключевые компоненты doker У нас есть то есть Первое - это docker Engine который мы уже только что затронули это как бы ядро сердце Докера которое Нам необходимо для того чтобы вообще всё это запустило далее идт do Desktop это приложение юны клиент который упрощает нам работу с дором далее компонент doer compose позволяет нам управлять более сложными и много контейнерным приложениями То есть если вам нужно поднять не только приложение допустим jav API но и базу данных и какой-то и ещ что-то и также Doh это компонент который поет ща наши образы не только локально на нашей машинке А И удалённо то есть это некий аналог гитхаба для докер образов перейдём к установке доке на вашу локальную машину на этом слайде вы видите три ссылки которые соответствуют ссылкам с инструкциями по установке для каждой из трёх операционных систем Это Mac Windows и Linux в зависимости от вашей оси вы переходите по нужной ссылке выполняете простые инструкции которые здесь указаны Здесь вы можете видеть Примерно как это выглядит для Докера на Маке для Чипа Intel и для Чипа Сикон в зависимость от вашей конфигурации вы выполняете эти простые команды которые есть здесь И после этого вам необходимо выполнить простую команду docker - version которая позволит вам понять есть ли установленный докер на вашей машине и всё ли корректно здесь работает Итак мы с вами открываем терминал и и здесь в терминале мы с вами выполняем простую команду docker минус Минус version И если всё корректно и всё хорошо работает то здесь вы видите версию Докера которая стоит на вашей машинке в моём случае на текущий момент это версия 2.0.0 с этого момента Вы можете сказать Что На вашей машинке установлен докер И теперь мы с вами можем перейти к разбору сейчас ключевых компонентов Докера И после этого вы увидите как довольно-таки легко и быстро без усилий Вы можете запустить практически любое приложение на вашей машине с помощью Докера Давайте посмотрим как это будет выглядеть уверен что вы часто слышали такой термин как докер образ то есть образ - это некий шаблон в кавычках для контейнеров на основании которого мы уже создаём с вами рабочие единицы данный шаблон состоит из исходного кода приложения и среды которая необходима для его исполнения библиотеки инструменты средства сборки и прочее и прочее докер контейнер - это уже Рабочая единица приложения которое создаётся на основе нашего докер образа как это выглядит у нас с вами есть некий образ который состоит из двух ключевых компонентов в нашем случае это Исходный код и среда исполнения и потом уже на основании докер образа мы создаём рабочий контейнер где будет рабочее приложение То есть например если мы будем рассматривать с вами следующий пример там где мы пишем простое э node App приложение то там это будет Исходный код нашего приложения и сама нода которая нужна чтобы всё это красиво взлетело также на основании образа может быть Создано много контейнеров то есть до образ один а контейнеров рабочих юнитов будет много То есть например если у нас с вами будет образ у которого есть код springboot приложения rest API также есть среда которая будет состоять из гред как средства сборки и gdk для того чтобы всё это работало и може можем ми независимых контейнера которые будут Ну в данном случае просто копировать инстанс нашего приложения Итак ещё поговорим про сторонние образы помимо наших приложений которые мы сами пишем существует огромная база огромная коллекция образов популярных систем как я говорил раньше это база данных брокера сообщений и прочее для того чтобы это использовать мы с вами можем использовать команду Dock для того чтобы подтянуть нуж нам образ мы это будем повторять много раз и дальше рассмотрим детальнее И после этого условный docker Run который позволяет нам запустить наше приложение Но перед тем как мы перейдём к этому к сторонним образам Давайте с Вами рассмотрим простой пример Note App приложение ветка Step 1 то есть ссылка для приложения которое видите в описании это Note App и также там будет бранча СТП 1 вам стоит перейти на неё и повторить все последующие шаги которые я сейчас буду делать Итак мы с вами подтянули наш проект мы с вами переключились на ветку steep 1 Как видите в будущем тут будет много веток с которыми будем плотно работать но сейчас это ветка СТП о здесь у нас есть файл gign стандартный знакомый всем есть файл package J для тех кто знаком они знают что это файл для того чтобы очень грубо говоря подтянуть нужные нам зависимость и какие-то дополнительные данные прописать описание версии прочее и есть файлик server.js который и запускает наше приложение то есть в общем и целом Данный проект позволит мне увидеть какую-то страничку и на ней будет какая-то манипуляция то есть что я вижу я вижу что я здесь подтягивают сущность Body parser потяги какой-то непонятный экспрес то есть ну экспресс по названию то что позволяет быстро запустить приложение далее вижу переменную username joh далее строка 8 это app.on Это значит что после старта моего приложения перейдя в браузер на страницу Local Host Port 4200 я смогу увидеть наше приложение После этого я вижу что у меня есть какой-то app.get Exit Это значит что при переходе на localhost 4200 Exit сработает метод process Exit который завершит работу моего приложение на странице Get то есть на главной странице приложения мы увидим что-то наподобие Привет username далее username У нас как мы видим это пока J далее мы сможем опубликовать в формочке какое-то новое сообщение То есть задать новое имя и соответственно мы ожидаем что потом это имя изменится на То которое мы с вами заменили также здесь есть метод Set username который здесь используется вот Action Set username который как раз и позволяет нам во-первых вывести в консоль сообщение определённое и задать это имя которое изменится в данный момент мы не знаем с ничего про доке Мы не работали с ним у нас нет такой возможности для того чтобы стартовать да же мы с вами должны выполнить следующие команды то есть Первая команда - это npm Install давайте пока закрою другие табы То есть тут выбрали Clear Давайте ещё раз переотправить после того как мы выполнили npm install для того чтобы всё это стартовать я должен выполнить команду npm Start и что очень важно Для того чтобы это выполнить npm должен стоять на моей локальной машине То есть если у вас не стоит npm то есть нода не установлена и вы хотите запустить Вам теперь придётся это всё поднять э своими руками чтобы всё это заработало как понимаете это не всегда удобно Итак мы с вами стартовали приложение теперь Давайте с вами перейдём в наш браузер Итак мы с вами перешли в наш браузер и мы видим что у нас есть Local Host Port 4200 здесь у меня есть надпись Привет John do И теперь я э пишу Set username допустим prite Нажимаю кнопочку введите имя И теперь у меня моя надпись сменилась то есть довольно-таки простое примитивное приложение тут будет ещё какой-то тест 10000 введём какой-то введите имя всё поменялось очень примитивно очень просто если приду на Exit то у меня Моё приложение упадёт то есть всё не работает Извините приехали соответственно мы бы хотели теперь сделать так чтобы мне не нужно было устанавливать на свою локальную машину вот все моменты вот все библиотеки которые нам сейчас Нужны как раз для этих целей мы и можем использовать с вами докер Итак что мы с вами сделали мы с вами выполнили локальный Старт где прогнали команды npm Install npm ста После этого мы можем перейти к запуску средствами Докера для этого я перехожу на ветку Step 2 Внутри нашего проекта Note App для того чтобы перейти на нашу ветку Note App давайте мы тут всё почистим я делаю git checkout Step 2 Итак мы видим что у нас есть steep 2 смотрим git Log Мы видим что мы добавили здесь docker файл для гибкого старта Хорошо пока звучит отлично Можем пока из терминала выйти и посмотрим что же у нас здесь есть у нас с вами появился какой-то файл под названием docker File и что мы здесь видим мы видим с вами какие-то команды Давайте попробуем разобрать что же это такое то есть здесь на строке о Мы видим что мы используем какой-то From noe S Build Это означает что я хочу подтянуть некий образ или пакет и Пока непонятно зависимость под названием noda которая обзывается переменной Build и мы видим значок Build Это значит что это этап сборки то есть сборки нашего приложения это npm Install далее мы говорим что у нас появляется некая Рабочая директория уже внутри Докера с app то есть появляется с app После этого мы делаем ко точка Это значит я копирую всё что есть здесь в Моём проекте то что получится внутрь этой папки App далее я выполняю команду npm Install выполнить я е могу потому что я уже подтянул ноду как средство сборки После этого я говорю что я хочу прокинуть наружу порт 4200 то есть заэс поть его И после этого я говорю что теперь для того чтобы войти в Моё приложение Мне нужно выполнить команду npm Start иногда ещё используется здесь вместо entry Point cmd но мы будем использовать с вами entry Point то есть вроде Понятно но возникает вопрос как же мы теперь всё это можем запустить здесь мы видим какую-то команду docker Build то мину мину Tag Рав Note App latest данная команда нужна для того чтобы мы могли собрать доке образ на основании того что находится В текущей директории и добавить тег нашему образу То есть это грубо говоря некий аналог имени и версии называется тег который будет равен Note App latest после этого идут какие-то команды docker Run Но их давайте рассмотрим немного позже Давайте перейдём в наш проект и попробуем выполнить эту команду здесь я нахожусь в этой директории в которой находится docker File То есть я нажимаю LS вижу что здесь появился docker File Note modulis и прочее И что теперь я делаю я пишу Dock Build точка то есть собери всё что находится здесь в этой директории И дай ему г node App latest Итак происходит сборка моего проекта что мы видим что здесь прошла сборка детальнее мы всё рассмотрим чуть позже вот эти все сообщения которые мы увидели но теперь мы понимаем что у нас где-то появится наш докер образ пока мы не умеем работать с консолью мы перейдём с вами в наш Деп то то что мы установили при установке по инструкциям на сайте Докера смотрим что мы здесь увидим Итак здесь мы с вами видим некий образ есть такая вкладок images и здесь в images мы видим Note F который был создан буквально вот-вот его Сейчас никто не использует его размер 1,1 Гб И это как раз образ который мы с вами создали здесь только что используя нашу команду Итак теперь Давайте попробуем запустить наше приложение то есть мы говорили о том что у нас есть докер образ и на основании Докера мы уже можем с вами создавать контейнеры Давайте посмотрим как это будет выглядеть здесь мы видим команду docker Run ми P 4200 2то 4200 node App latest Что это значит Это инструкция которая говорит Дору запустить на порту 42 то что будет на порту 42 у этого образа То есть у нас в доке образе мы создаём приложение на пор 4200 Но это внутренний порт и мы хотим его спить с портом который в нашей системе соответственно мы выполнив эту команду и перейдя по ссылке Local H 4200 должны получить наше рабочее приложение потом мы с вами выполним вторую команду docker Run - P 5050 4200 Note App latest Это значит что мы увидим тоже самое то есть будет новая нода точнее новое пода на порту Local Host 5050 то есть то же самое но на другом порту Давайте попробуем это сделать мы переходим с нами в наш проект и здесь я выполняю данную команду То есть я пишу docker Run - P 42 4200 Note App latest нажимаю Enter и мы видим что здесь мы с вами вошли в какую-то терминал То есть у меня пока не свободен терминал я где-то пока заблочить Давайте посмотрим что же у нас происходит сейчас на Local Host если мы перейдём в браузер на нашу ссылку на пор 4200 И вот теперь перейдя на Local H 4200 мы видим то же самое у нас появляется Т какой-то тест 10000 я нажимаю Enter тут всё появилось И вот теперь если мы сейчас с вами вернёмся в наше приложение где у нас есть консоль мы с вами С вами видим что вот здесь будет Лог то есть мы понимаем что мы как бы находимся в терминале внутри нашего контейнера с которым мы сейчас работаем Теперь если мы с вами перейдём здесь в вкладку контейнер то мы увидим что у меня появился некий контейнер с именем люсид свенсон или свонсон который находится в статусе Running И если мы перейдём в него то внутри мы как раз увидим наши логи то есть мы видим что мы находимся в логах У нас всё хорошо Давайте проверим что у нас здесь пот новый сообщение То есть я сейчас пойду в браузер и попробую ещё несколько имён задать нашем в наш username то есть здесь я пишу тест 200800 поменялось тут будет какой-то лай допустим и сейчас если мы с вами вернёмся снова в наш докер Desktop влоги нашего контейнера то мы увидим что все эти имена у нас появились здесь Теперь если мы с вами пнем наш контейнер удалим его нажимаем Remove и перейдём в браузер мы увидим что всё закончилось что данная ссылка больше недоступна смотрим я обновляю страницу видим что всё закончилось Теперь давайте вернём наш проект и запустим теперь два контейнера на разных портах на 4200 и на порту 5050 я перехожу в проект здесь почистили консоль и снова выполняю команду которая была здесь кто не знает нажимая кнопочку вверх или вниз Вы можете переключаться по э истории ваших команд То есть я запускаю здесь Local запуск Note App на 4200 пошёл запуск открываю ещё одну вкладок Run ми P 55050 2 4200 и тут тоже пишу App latest нажимаю Enter и теперь давайте перейдём с вами сначала в браузер Итак Я перешёл в браузер здесь Local H 4200 всё есть Теперь если я открою ещё новую вкладок 5050 то здесь я также увижу что у меня приложение которое работает корректно То есть тут тоже тест 200800 тут ввести имя на Local H 4200 я передам допустим про The Lite видите имя всё работает и теперь Давайте ещё Переключи в наш докер Desktop посмотрим что у нас происходит там здесь мы с вами видим что у нас появилось два контейнера которые создан на основании образа node App latest Один работает на порту 4200 другой на порту 5050 и у каждого из контейнеров есть свои логи то есть Мы перешли сюда перешли сюда всё работает всё аккуратно всё корректно важным моментом при работе с образами является тот факт что мы не можем добавить наши изменения в уже созданный образ потому что образ - это как бы слепок нашего приложения в конкретный момент времени и для того чтобы применить наши изменения которые мы произвели Нам необходимо пересобрать наш образ то есть создать новый образ для того чтобы продемонстрировать это мы с вами перейдём в проект и Переключи на ветку steep 3 в которой есть некоторые минорные изменения в коде После этого мы с вами стартам старый образ попытаемся создать новый и его запустить переходим в проект Итак мы с вами переходим на ветку git checkout Давайте пересом ещё раз образ чтобы всё было аккуратно то есть docker Build то мину мину равно node App latest чтобы убедиться что данный образ собран на основании ветки СТП 2 Теперь мы с вами делаем git checkout steep 3 Мы перешли на третью ветку и мы видим что здесь есть некоторые минорные изменения то есть добавилась здесь строка 18 версия 2.0 и добавилась Привет многоуважаемый юзернейм Итак давайте почистим консоль И теперь я смотрю что сейчас у меня код вот такой то есть должны изменения быть и теперь я пытаюсь стартануть наш докер образ То есть я пишу доке Run ми P Давайте снова 42 2 то 4200 Note App latest и перейду в наш браузер перейдя на 4200 Мы видим что у меня изменения находятся здесь старые но не новые для того чтобы я мог увидеть новые изменения Мне нужно собрать Новый образ на основании текущего кода то есть сделать новый слепок возвращаемся в наш проект мы снова Чистим консоль И теперь я снова делаю do build мину мину ра node App двоеточие 2.0 происходит сборка и теперь я попытаюсь запустить новый контейнер то есть здесь я пишу не 42 давайте это будет у нас 6060 или 7070 форм 42 на 7070 и здесь мы используем уже latest 2.0 здесь Enter и Давайте перейдём теперь в браузер на пор 7070 И вот уже перейдя в версию 2.0 то то есть в контейнер на порту 7070 который был собран на основании образа Note App двоеточие v20 мы видим эти наши изменения которые у нас были Давайте теперь ещё перейдём в наш Dock Desktop и посмотрим что же у нас там происходит с образами и вот здесь вы видите что у нас есть сейчас два образа Note App То есть первый с тегом latest а второй с тегом v2.0 каждый из которых сейчас у нас находится в работе и у нас есть два контейнера первый контейнер на основании latest тега и второй на основании v20 тега оба работают и у нас проблем здесь никаких нет Таким образом мы с вами увидели что для того чтобы применить изменение в коде просто их добавить в код недостаточно их нужно применить с помощью пересборка каждая строка нашего докер файла - это упорядоченная инструкция по сборке и каждая инструкция преобразуется в слой он называется Image layer как это выглядит у нас с вами на левой стороне вы видите docker фай в котором есть From not Build Work и прочее далее сборщик преобразует каждую строку в отдельный слой и соответственно у нас появляется такой слоёный образ то есть каждая команда - это отдельный слой слои могут быть широва максимально детально по каширования Докера с официальной документацией там все варианты все кейсы которые только могут произойти описаны довольно-таки подробно если говорить в общем то при запуске сборки Строитель пытается повторно использовать слои из предыдущих сборок То есть если слой образа не изменён то есть не было То есть чек сам не поменялся то сборщик берёт его из кэша сборки Если же слой изменился с момента последней сборки этот слой и все последующие слои должны быть пересобрать быть Каширова поскольку она определяет самый базовый образ с которого начинается сборка базовый образ может быть закро на локальной машинке если он ранее был загружен но он не кэшируется в рамках сборки конкретного докер файла докер образа далее строка Work App - это слой установкой рабочей директории далее идёт копирование текущего всего текущего то есть слой копирования файлов проекта В контейнер и он будет кашированный в файлах проекта далее команда Run mpm Install здесь слой с установкой зависимости node.js этот слой будет широн только тогда когда зависимости Не менялись с момента последней сборки остальные команды такие как expose entry Point не создают отдельных слоёв и не будут широва рассмотрим концепцию утилит контейнера то есть контейнеры которые представляют собой только окружение мент в отличие от стандартного контейнера который является приложением с окружением То есть если в предыдущем примере у нас с вами было некое приложение Note App которое с окружением вместе запускалось могли посмотреть существуют образы и контейнеры на их основании которые просто представляют нам либо ноду либо какой-то язык ког данном примере соответственно мы с вами попробуем подтянуть образ из общего артефакта образов под названием То есть это язык программирования После этого мы запустим данный образ в интерактивном режиме То есть мне будет доступен терминал я смогу выполнять команды терминала здесь И после этого я попытаюсь выполнить команду внутри этого контейнера То есть я создам контейнер с именем ust контейнер в интерактивном режиме на основании образа ust А после этого я попытаюсь внутри контейнера Rust выполнить команду мину то есть вывести версию данного языка Итак переходим в терминал и выполняем команду docker po Rust происходит подтягивание этого образа Мы видим что Всё подтянулась теперь выполним следующую команду для старта этого контейнера Итак здесь мы копируем эту команду делаем запуск Мы видим что у меня стартовал новый контейнер Давайте перейдём в наш do Desktop И убедимся что он у нас там появился в контейнерах Мы видим что у меня появился Rust контейнер от образа Rust и он сейчас у нас запущен выполним следующую команду которая позволит мне получить версию данного Rust мы копируем данную команду выполняем docker EX то есть doer Выполни у Rust контейнера команду Rust C мими version запускаем и мы видим что здесь у нас появилась версия Rust Если же я пытаюсь просто это выполнить видим что на мо машине ничего связанного с растом Нет таким образом мы с вами смогли поработать с утилит контейнером и теперь давайте рассмотрим ключевые команды Докера в терминале так как до этого мы использовали докер Деп это не всегда удобно и не всегда правильно Поэтому мы можем посмотреть с вами что же у нам предоставляет докер Итак Первая команда - это Dock PS который возвращает нам список всех наших контейнеров которые активны то есть мы видим что здесь такая колоно как статус и мы видим что мы сейчас получили все три контейнера Итак здесь мы выполним команду do PS мину Help здесь будет список команд и опций которые мы можем добавлять сюда и также здесь есть такая штука Как All мину а или мину мину All которая показывает все контейнеры А по дефолту показывают только те которые запущены Итак я делаю do PS - видим что у меня есть контейнеров которые уже были здесь И теперь я попытаюсь сначала убить контейнер Rust То есть я беру его айдини копирую и выполняю команду docker Kill и вбиваю дишни теперь если выполняю команду docker PS мину Мы видим что у меня есть некоторые контейнеры которые в статусе Up А есть контейнеры которые либо в статусе created либо в статусе Exit хорошо Итак дальше мы с вами можем также остановить контейнеры снова делаем доке PS Мы видим что у меня есть два контейнера первая контейнер я беру и выполняю команду ST то есть D ST отдали дишни отличненько теперь при выполнении docker PS у меня остался только один контейнер далее Мы также можем пнуть все контейнеры то есть для этого я выбираю команду Dock ST здесь знак доллар открываю скобочки и тут делаю Dock PS - ми Q которые верте только айдини всё есть И теперь мы с вами смотрим Что же у нас есть я делаю docker PS - A У меня есть контейнеры в статусе created и прочее соответственно Теперь я могу использовать команду Remove Давайте сначала удалим контейнер в статусе created То есть я беру Dock RM created первый далее docker RM created второй и теперь docker RM cre ре снова делаем docker PS ничего делаем docker PS ми а видим что у меня есть три контейнера в статусе exited и есть очень интересная полезная команда под названием docker контейнер контейнер PR который удалит все неактивные контейнеры То есть все стопнули что было удалено три контейнера Теперь снова Если вы docker PS ничего docker PS мину а тоже всё пусто ничего нет далее мы с вами попробуем сейчас запустить снова наш контейнер То есть я делаю Dock Run минус P точнее мину P 4200 4200 Note App latest Мы видим что мы как бы заблочили то есть терминал для нас потерян мы можем выйти отсюда но это не всегда удобно давайте сейчас его пнем docker PS соответственно docker Kill вот этот контейнер И после этого docker контейнер контейнер прин то есть мы почистили все наши контейнеры Всё хорошо всё отлично и теперь для того чтобы мы не блочить мы можем использовать detached Mode То есть я здесь выполняю docker Run - D и здесь у меня будет снова мой контейнер запущенный то есть смотрим docker PS всё работает делаем снова docker Kill передаём нужный айдини сюда и Давайте ещё выполним приу чтобы всё было аккуратно Чистим консоль И теперь мы с вами попробуем ещё задать имя нашему контейнеру то есть мы здесь с вами создавали контейнер И теперь мы после порта можем задать э флаг минус - name зададим node App чтобы было понятно Итак Теперь мы снова с вами делаем docker PS и здесь мы видим Э что у нас есть names Note App то есть не то что мы по дефолту получали А что-то ну по несколько другому Итак мы теперь видим что у нас есть некий контейнер который находится в detached Mode но я хотел бы к нему подключиться для этих целей я беру копирую Edition данного контейнера и используя команду Dock сюда и соответственно теперь мы видим что здесь ничего не происходит И если мы сейчас с вами вернёмся в браузер на по 42 и там попытаемся получить се usame логи то мы их здесь увидим давайте это сделаем Итак здесь мы с вами сделаем тест 10000 далее тест 2800 и сечас когда мы вем с вами в терминал Мы увидим наши логи Итак снова Мы тут выходим отсюда делаем Clear чтобы почистить Всё Давайте ещё разберём пару команд Это команда docker logs то есть для этих целей мы используем дишни нашего контейнера получили Теперь можем использовать флаг мину F и получать наши логи как бы стриминговая минус Минус и вбить какую-то цифру Какое количество логов Нам необходимо получить Так давай теперь ещё раз убьём все наши контейнеры которые были то есть контейнер ID я делаю доке Kill есть и теперь доке контейнер прн убили всё на этом можно сказать что практически все команды ключевые с дором мы разобрали Итак здесь на Остаются только команды для работы с образами Итак мы можем использовать команду docker Image LS где мы увидим с вами Какие образы у нас есть списки чтобы мы не обращались к этим образом через docker des далее мы можем проинспектировали этих целей я делаю docker м inspect и задаю сюда образ и здесь мы видим очень много данных по нашему образу что здесь используется То есть откуда что когда мы тянули там опять-таки слои же можно посмотреть здесь вот мы видим что есть Root FS и тут пошли layers соответственно Вот это контрольная сумма наших леев с которым мы работаем далее Мы можем с вами также удалить наши образы То есть я снова делал docker Image LS и Допустим хочу удалить Вот непонятные мне пока образы то есть для этих целей я делаю docker rmi первый далее Dock rmi второй и тут docker rmi третий снова делаем docker ims видим что этих образов уже Нет давайте это тоже снесёт docker rmi убрали и также мы можем использовать команду такую как docker Image тоже приу которая которая позволяет нам удалить все как бы ненужные там какие-то мусорные образы которые мы сейчас не юзаем и почисть какое-то место в нашем дисковом пространстве на этом мы можем завершить Пока работу с докер образами локально на какое-то время и теперь давайте перейдём с вами к публикации наших докер образов в регистре перейдём к публикации докер образа докер образы хранятся в хранилищах тавтология но так оно и есть registry хранилища бывают публичными и бывают приватными наиболее популярным хранилищем является dockerhub Где вы можете создать как приватные образы так и публичные образы Но кроме dockerhub есть такие сервисы как jfr contain registry Amazon ecr Red github Reg то есть различные сервисы уже в этих registry хранятся различные образы это база данных gdk gradle candra нода и прочие и прочие сервисы мы с вами будем работать с dockerhub как с одним из наиболее популярных стрей в мире на текущий момент в первую очередь вам необходимо будет зарегистрироваться на dockerhub перейдя по ссылке которая есть здесь то есть hub.docker.com и после этого создать репозиторий Давайте с вами пройдёмся по этим шагам регистрацию я оставлю на вас а вот уже создание репозитория и прочая манипуляция Мы попытаемся сделать вместе результатом нашей работы будет создание локально докер образа и публикация его на dockerhub и соответственно возможность получить этот докер образ из публичного хранилища а потом мы уже запустим наше приложение на основании образа которое не локально А на удалённом регистре Давайте начнём Итак вы переходите по ссылке регистрируетесь и после регистрации начинаете создавать ваш Первый репозиторий после создания своего аккаунта на докер H вы переходите на страницу repositories здесь у вас если ничего ранее не было будет пусто Здесь вы видите свои не спейсы по дефолту будет только ваш аккаунт в моём случае это прой далее вы нажимаете кнопочку Create repit Здесь вы сейчас это будет User API посмотрите внимательно чтобы здесь была видимость Public после создания вы нажима нажимаем кнопку Create После этого у вас будет создан репозиторий И теперь мы с вами можем перейти к нашему проекту который есть по ссылке в описании к видео это проект под названием User API и нас пока интересует branch Step 1 Итак здесь что мы видим Мы видим простое приложение springboot API с одним нпои который возвращает список всех пользователей есть дто которая имеет дишни имя фамилия email и есть стартовый э класс здесь есть Application yaml э в котором есть Север пор который можно передать через переменную среды и при этом у него есть ещё э Spring Application name User API мы можем запустить наше приложение если у вас установлено всё что необходимо и после этого мы можем перейти в postman и попробовать выполнить запрос Итак Мы выполняем наш запрос Local Host 880 API V1 users и мы получаем в ответ наших пользователей наших юзеров видим что запрос нормально работает проблем никаких у нас нет Теперь мы можем выключить наше приложение пнуть сервер перейдя на ветку П 2 мы увидим что был добавлен docker файл здесь мы видим что есть этап сборки в рамках которого мы используем gradle и gdk 21 как После этого у нас есть этап создания артефакта то есть здесь мы с вами используем Open gdk 21 gdk Slim начинаем создавать артефакт далее мы задаём переменную се пор 9.200 чтобы работать с ним После этого мы копируем всё что было собрано в рамках сборки в директорию App User API 100 J И после этого у нас появляется entry Point которая запускает наш артефакт с помощью команды Java jar App и передаём директорию нашего джаника Итак для того чтобы это проверить что это всё работает для начала мы с вами выполним сборку нашего образа для этих целей Мы выполняем команду docker Build то ми Tag равно User API latest Итак происходит сборка нашего проекта и в результате сборки появляется образ то есть мы делаем docker Image LS и видим здесь что у нас появился новый образ под названием User API latest который создан 6 секунд назад отличненько Теперь попробуем запустить наш образ для этих целей я выполняю команду docker Run минус Port здесь делаем 9200 связываем с 9200 и запускаем User API latest Итак происходит запуск приложения на порту 9200 Теперь мы можем перейти с вами в postman и при попытке выполнить запрос на 880 ошибка потому что мы стопнули наш сервер локальный но если мы пропишет Local Host 9200 и выполним запрос мы увидим что всё отработала корректно то есть мы получили наших юзеров Это значит что мы запустили успешно наше приложение в докере соответственно теперь перед нами стоит задача сделать так чтобы мы смогли закинуть этот докер образ с нашей локальной машины в наш публичный афа для этих целей Мы выполняем следующую команду Это Dock Tag User API latest тегаем на prite User API latest то есть я говорю что мой локальный образ User latest я гаю на PR User API latest и здесь если вы хотите публиковать в ваш AR вместо должно быть ваше имя Итак мы выполнили данную команду И теперь я делаю docker Push prite User API latest Итак происходит Push нашего образа в artfactory Теперь мы можем перейти в наш dockerhub и посмотреть что мы там увидим здесь мы видим что несколько секунд назад появился новый образ с тегом latest Где вы видите его детали теперь Давайте проверим что мы действительно можем это образ и как-то работать с ним то есть публичным образом на своей локальной машине Итак сначала Мы удалим образы с локальной машины Итак я делаю docker IM LS Мы видим что у нас нет наших образов Если они у вас ещё остались вы их удаляете то есть мы видим что образов US API про у нас нет теперь я делаю следующее я пишу do poi и мы теперь как бы плим этот образ на свою локальную машину здесь теперь Мы выполняем команду до Image LS и мы видим что образ был подтянут к нам сюда на локальную машину Итак Теперь мы его теперь Давайте ещё раз удалим То есть я пишу docker rmi prite User API latest то есть всё его больше нет пере проверяем Dock ims убрали и тепер Давайте Пустим его То есть я пишу docker Run Port 9200 мам на 9200 и запускаю уже как бы с образа который удалённый то есть пишу User API latest Итак происходит запуск он говорит что он не может найти данный образ на локальной машине соответственно произойдёт пул этого образа к себе и когда мы его запу с удалённого репозитория Мы видим что наше приложение старта на порту 92 Давайте ещё раз перепроверить что это приложение работает Итак мы снова в нашем постмане я выполняю данный запрос и у нас всё работает корректно Таким образом мы с вами смогли опубликовать наш образ в публичном артефакто смогли подтянуть этот образ и запустить на основании этого образа новый контейнер теперь поговорим про работу с переменными среды перед этим в нашем проекте User API мы передавали переменную среды пор через docker файл используя ключевое слово ф далее имя переменной порт мы передали значение 9200 также можем это сделать с помощью флага ми E и выполнив команду которую видите ниже мы сможем это сделать То есть мы запустим приложение на порту 9000 Давайте попробуем перейти в наш проект и выполнить эти действия Итак мы берём эту команду и выполняем её смотрим Что у нас получается Здесь при старте Мы видим что приложение было на порту 9000 И теперь мы можем перейти в postman и попробовать выполнить данный запрос Итак Теперь мы берём порт 7878 отправляем запрос и мы видим что всё отработала корректно штатно без ошибок попробуем ещё один вариант для работы с переменными среды Мы также можем использовать так называемый фай То есть файл - это файл в котором мы храним наши переменные и здесь мы говорим что у нас появится какая-то переменная пор скорее всего и мы будем работать с ней для этих целей мы используем флаг мину - фа далее мы указываем где он у нас появится у нас это будет в корне проекта файл с названием точка NF задаём новое имя нашему контейнеру и запускаем его и мы должны будем его увидеть на порту четыре восьмёрки перейдём в наш проект Итак здесь давайте мы Пока потушим наши контейнеры То есть я делаю docker Kill наш контейнер теперь делаю докер контейнер прн чтобы лишнего ничего не было И теперь мы с вами попробуем переключиться на ветку номер п 3 в Ветке п 3 Мы видим что у нас появился новый файл под названием точка N и теперь мы можем выполнить следующую команду docker Run как я говорил ранее указать Где находится файл и запустить его Итак происходит старт проекта Мы видим что приложение стартанул на порту 9100 и соответственно теперь перейдя на порт четыре восьмёрки который мапи на пор 9100 мы должны получить корректный ответ переходим в постман в постмане мы прописали новый порт выполняем запрос и у нас всё отрабатывает штатно без ошибок Таким образом мы с вами научились работать с переменными СМИ среды docker File это фла - E и это использование файла то N на этом мы заканчиваем разбор именно основ работы с докеров - Это что такое докер далее предлагается вспомнить какие преимущества даёт нам докер в сравнении с обычным запуском на локальной машине далее В чём отличие между образом и контейнером и что такое Image layers то есть слои нашего образа далее предлагается вспомнить как работает кэширование слоёв при сборке вы также можете изучить материалы которые будут по ссылке вопрос Следующий Как войти в интерактивный режим при запуске контейнера и далее вопрос Что такое стри наш следующий раздел - Это работа с данными мы рассмотрим в рамках этого под модуля работу с данными как с таковыми работу с томами и работу с переменными среды когда мы говорим про данные в контексте Докера то данные можно разбить на три большие группы первая группа - это Исходный код и окружение вторая группа - это временные данные и третья группа - это постоянные данные и у нас есть характеристики это этапы получения данных типы данных и место их хранения когда мы с вами говорим про Исходный код и окружение то эти данные получаются на этапе сборки приложения тип данных это неизменяемый то есть во время сборки мы получили код получили окружение и изменить эти данные уже после этого мы не можем место хранения - это докер образ следующий этап - это временные данные они получаются нами на этапе работы приложения они изменяемых в докер контейнере хороший пример Таких данных - это username в node App то есть во время работы приложения мы могли изменять переменную username И она у нас была изменчива получалась на этапе работы приложения и хранилась в докер контейнере То есть если контейнер удаляется то данные теряются и финальный тип данных - это постоянный данные которые также получены на этапе работы приложения которые также изменяемых хранения - это некая постоянное хранилище пока написано в кавычках потому что мы разберём более детально позже Что же это за хранилище файловая система каждого контейнера изолирована от файловой системы других контейнеров соответственно если мы удаляем контейнер то все данные теряются для этих ситуаций существует такая штука как он же Vol то - это папка в файловой системе рабочей машины то есть Железяки на которой мы работаем который доступен внутри нашего докер контейнера то есть сама директория которая создаётся для Тома она не доступна за пределами доке То есть у неё есть свой путь но если вы попытаетесь найти этот путь просто на операционной системе вы не получите к ней доступа потому что это идёт исключительно через доке эта директория доступна как на чтение так и на запись и даже когда контейнер уничтожен сам Vol продолжает существовать как это выглядит у нас с вами появляется наша рабочая машина у нас есть некий контейнер который находится в какой-то директории home App и у нас появляется некий тово хранилище в файловой системе допустим User про docker Vol 1 и соответственно получить доступ вот к этой папочке из-за пределов Докера мы не можем Но докер контейнер хранит данные здесь и соответственно когда Том создан к нему можно подключиться как из этого контейнера так и из других контейнеров работа с томами для того чтобы мы разобрались что же это такое и как с этим работать на практике мы можем рассмотреть приложение fil Service фай Service П 1 перейдём в наш проект Итак мы с вами делаем обзор нашего проекта fil Service что у нас есть здесь мы видим простой проект это Java приложение которое держит в себе во-первых badle File в котором можем видеть с вами Starter Tim То есть это для работы с UI это Web для того чтобы мы могли подключить контроллеры и прочее то есть взаимодействие с этим U и тест который у нас просто идёт по дефолту далее Мы заходим с вами в пакет src Main resources здесь идут формочки Pay То есть это будет страничка для ввода каких-то данных под названием Котен эти у нас будут попадать в текстовый файл к котором мы будем иметь доступ через страницу P то есть здесь будет иметь доступ к содержимому какого-то файлика и Success будет просто страничка в которой у нас будет информация о том что при публикации данных на странице форм всё произошло у нас успешно если мы пойдём с вами по коду то здесь мы увидим следующее То есть это у нас просто стартер здесь мы с вами видим фас который делает что у нас есть какая-то File Location File Pass то есть Файлик куда мы будем писать данные далее при получении данных то есть Write to File мы получаем Post dto это обычный Record у которого есть string title и есть string Content далее содержимое этого поста попадает в наш Файлик fil Pass о котором мы говорим выводит какое-то сообщение нам в консоль если произошла ошибка мы получим сообщение об ошибки и далее У нас есть метод read From File который вычитывает содержимое нашего файла который указан по этой ссылке далее У нас есть пост контроллер у которого есть контроллеры для работы с формой здесь мы принимаем данные и потом эти данные у нас попадают в методе postmapping form в наш файл через вызов META Right to File Success просто вводит Success Exit для того чтобы потушить наше приложение и Pay показывают нам вычитывает данные из файла через metod read From File добавляет их в атрибуты Pay и потом уже этот P Мы видим здесь в HTML файли Вот примерно так Давайте попробуем запустить наше приложение мы вот видим что по дефолту У нас есть какой-то storage Location и если у нас есть какой-то Stage мы его Давайте возьмём с копируем Copy Pass я беру Copy Absolute Pass здесь я перехожу наш File Writer Application здесь беру Run configuration и здесь я добавляю пере Давайте их тут добавим environ variables здесь мы вбиваем переменную пока рандомное имя вбиваем наши данные жмём о о возвращаемся сюда и у нас есть storage Location переменной среды соответственно мы снова идём сюда modify Run configuration и в переменной среды мы меняем имя на нужную нам переменную делаем о и теперь попытаемся запустить на приложение в режиме дебага посмотрим что же произойдёт мы переходим по ссылке localhost 880 СФ и здесь мы видим страницу для заполнения то есть для ввода данных мы здесь вводим тест 10000 в title в Content нажимаем submit идёт дирек на страницу Success после этого переходим на payload и видим что в конце нашего файлика мы добавили следующие данные title те 500 контенте 500 давайте для теста ещё раз добавим наверное запись тест 200800 чтобы убедиться что всё работает корректно жмём submit go to payload и здесь мы видим тест 2800 тест 2800 То есть сейчас всё работает корректно так как мы хотим Но теперь Давайте попробуем запустить наше приложение с помощью Докера а не просто через локальный Старт для этих целей Мы тушим наш сервер переходим в терминал и Давайте ещё откроем наш докер файл здесь мы уже видим знакомый нам где мы с помою и gdk 21 делаем сборку После этого у нас следующий этап упаковки и запуска и потом уже идт entry Point в котором мы вызываем jav и запуск артефакта который будет собран на этапе сборки и эта жа Теперь мы можем во-первых собрать сам докер образ для этих целей выполняю команду do Build мину который будет равен latest начинается сборка нашего приложения и теперь мы должны получить Наш Новый образ я выполняю команду docker Image LS и здесь мы видим что у нас появился файл сервис Новый образ с которым можем работать Давайте почистим консоль И теперь мы постараемся запустить наше приложение для этих целей я буду использовать команду docker Run ми 807 который мапи на 88 После этого мы вбиваем флаг мину RM чтобы при выходе он сразу удалялся мы зададим имя нашему контейнеру fil Service и мы зададим переменную среды storage Location который будет равен у нас Давайте во обьём Темп Темп то и также мы должны создать с вами во F storage который будет у нас связан с tmp и запускать мы это всё будем на основании образа fil Service latest Итак происходит Старт нашего приложения Мы видим что всё у нас запустило всё аккуратно Пока и Давайте в соседнем АК терминала мым команду docker Volume LS То есть я хочу видеть список всех наших вольюм появился какой-то Volume с именем File Service storage и у него драйвер - это Local теперь я делаю следующее я выполняю команду docker Volume inspect и задаю сюда имя нашего волюма и здесь мы видим что же произошло я получаю здесь данные что он был создан какое-то время что драйвер у него Local лейблов нет точка его мантинга вот такая но при этом если вы попытаетесь как я говорил перейти по этой ссылке вы не получите к ней доступа у неё есть имя скоп локальный и никаких опций мы с вами не создавали соответственно Теперь мы делаем с вами что docker Vol RM если нам необходимо это сделать То есть Dock Vol RM fil Service есть и мы получаем ошибку потому что он сейчас используется в нашей машинке Теперь мы понимаем что мы с вами создали новый докер контейнер который запущен на порту 8070 Я предлагаю сейчас перейти в браузере по этой ссылке и посмотреть что же у нас сейчас произойдёт Итак здесь мы видим что перейдя на посылки 8070 форм мы вбиваем допустим тест 3600 сюда 3600 нажимаем submit получили Success и при переходе мы получили ответ только такой то есть здесь у нас есть только новые данные Потому что это не было связано с тем файли ком который у нас находится внутри кода я снова перехожу в форму тут вбиваю тест 10000 submit go to payot Всё хорошо всё работает всё отлично теперь я предлагаю нам перезапустить наш контейнер то есть давайте сейчас выключим приложение перезапустили что же у нас произойдёт после удаления контейнера Итак для этих целей я выполняю docker PS смотрю что ничего нет всё было удалено далее я смотрю docker PS - A на всякий случай выполняю docker контейнер н чтобы всё было по-честному Итак всё удалено и теперь давайте мы ещё раз попробуем запустить наш контейнер Итак я его запускаю смотрим Что происходит всё работает корректно и мы снова идём в браузер на порт 8070 Итак здесь мы видим что всё работает и Давайте сразу пойдём на страницу лода и мы видим что данные у нас не были потеряны даже после того как мы перезапустили наш контейнер это как раз связано с тем что у нас есть отдельный ВОМ где данные хранятся теперь Давайте попробуем сделать следующий шаг и мы снова выруби наше приложение удалим Vol Итак для этих целей снова Dock PS Dock контейнер н всё вырубили теперь у нас с вами есть do Vol LS видим что он есть далее мы удам наш Vol То есть я пишу docker volum RM имя передали всё удалено и Давайте теперь мы снова постараемся запустить наше приложение той же командой которая была до этого я снова запускаю наши апке снова переходим в браузер на пор 8070 и здесь нажимая payad Мы видим что ничего нет то есть данные были потеряны потому что мы удалили ВОМ Теперь снова т-1500 Мы сюда видим данные здесь возвращаемся в наш контейнер здесь мы снова делаем do PS проверка что у нас есть всё-таки здесь образ давайте мы это всё удалим сейчас то есть docker Kill убили данный контейнер Теперь мы смотрим Что доке PS ничего нет На всякий случай доке контейнер н сохранились потому что теперь Vol мы не удаляли Итак мы обновляем страничку и видим что данные У нас есть то есть наш т-1500 как был так и остался После того как мы разобрали работу с данными мы перейдём к сетевому взаимодействию здесь мы рассмотрим работу контейнера с внешним миром мы рассмотрим работу контейнера с локальным хостом Local Host и также работу контейнера с другим контейнером как это будет выглядеть мы с вами создадим новое приложение которое в нашем случае будет взаимодействовать с базой данных mong db которая будет находиться у нас в докере как докер контейнер она будет взаимодействовать эта оплеуха у нас ещё с пост с базой данных которая реально установлена на физической машине и также наш контейнер будет взаимодействовать со сторонним API который будет возвращать не список стран тут хост немножко другой но здесь просто для понимания что есть внешний ресурс который отвечает за взаимодействие с внешним миром есть внутренний контейнер mong db docker контейнер есть бдх которая поднята Как сервер на локальной машинке Итак сетевое взаимодействие мы сейчас с вами переходим к проекту Country API Step 1 в рамках которого Мы попытаемся его запустить Если у вас на текущий момент не установлено pog как баз данных на локальной машине у вас есть время как раз немножко поставить на паузу и установить эту базу данных Как сервер себе на свою машину после этого вам нужно будет подтянуть образ моги То есть это база данных документо ориентированная и дальше мы уже с вами попытаемся всё это запустить и посмотреть как же всё это у нас будет работать переходим к нашему проекту Итак мы с вами скачали наш проект по ссылке которую вы нашли это проект C внутри этого проекта Cry вы видите две папки это coun API Country Client Count Client сейчас не интересен C API интересен это Оха цель которой взаимодействовать с внешним ресурсом и получать данные по странам то есть есть endpoint process который получает данные со стороннего ресурса и сохраняет их в нашей базы данных то есть одна база данных - это у нас монго вторая база данных - это пос в пос хранятся все данные в монго хранятся не все данные соответственно мы запросили получили все данные потом есть endpoint для получения всех стран есть endpoint для получения страны по Альфа коду при получении страны по Альфа коду что мы делаем Мы сначала пытаемся найти эту страну в монго репозитории если там получили то мы её и вернули если не нашли то мы Обращаемся к postgres и выгреба данные из этой пог есть репозиторий которые монго репозиторий м получай работающие с монго есть жепа репозиторий который работает с погрей есть энтити как монго воя То есть документ есть Тит которая для пог и есть дха чтобы привести это всё к одному виду и тут есть маппинг методы которые преобразуют д тоху в из jp entity и в из mongo entity соответственно Вот так это всё должно работать теперь что мы можем сделать давайте сейчас с вами ещё обратим внимание на наш пакет resources и тут есть File Application здесь все данные мы передаём через переменной среды То есть у нас во-первых с вами есть тут сервер порт который дефолт 9090 либо получить из вне есть Data Source который по дефолту работает с локальной бхо через Local Host и именно pog и пос но можно передать их через переменные среды далее У нас есть таблицы создаются автоматические и mong db у нас опять-таки можно передать по дефолту это Local Host пор 2701 и имя базы данных - это Мон думаю по проекту в целом по ipi понятно Давайте попробуем сейчас это всё докери Зро и запускать на локальной машинке мы завершили обзор нашего приложения Теперь давайте подтянем на нашу локальную машину образ моги и постараемся эту Мон также и запустить Итак для этих целей я перехожу в терминал моего проекта здесь я выполняю команду docker Pool Мон после того как образ мы подтянули Давайте запустим наш контейнер монге то есть мы запускаем Мон на порту 2701 Итак происходит запуск Теперь если мы выполним команду docker PS Мы видим что у есть Мо и Давайте попробуем подключиться к ней через клиент в моём случае это будет dat GP для этих целей Я здесь выбираю новый datasource здесь я выбираю mong db соответственно здесь нажимаем Test Connection видим что всё подключилось всё корректно соответственно здесь мы видим что у нас появился новый дата Source это Мон в которой конечно же на данный момент не будет никаких данных да то есть тут пустая схима отличненько делаем следующий шаг Теперь мы с вами собрать образ нашего C API с помою команды doer Build Country API latest и потом попытаемся запустить данный контейнер на основании этого образа переходим в наш проект для того чтобы собрать наш образ мы смотрим наш докер файл здесь небольшие изменения от того что есть уже на гите здесь мы используем сначала jbc 5432 и для момы используем также мы подключались до этого Теперь давайте соберём наш образ я пишу docker Build текущая директория минус мину равно Country API latest происходит сборка образа образ собран давайте перепроверил что он появился я пишу docker Image LS видим что у нас появился вот наш Country API И теперь я попробую запустить это всё на локальной машине То есть я пишу docker Run - P 9200 мам на 9200 и указываю здесь Country API latest происходит Старт нашего приложения и Давайте посмотрим что же здесь произойдёт при попытке стартануть Мы видим что у нас посыпались ошибки то есть мы видим что мы не можем подключиться ни к pog ни также мы не можем подключиться к нашей монке то есть что же произошло почему это так давайте выполним следующую команду мы опять-таки посмотрим какие контейнеры есть мы видим что есть контейнер Мон соответственно теперь что мы сделаем я пишу do и вбиваю шный контейнер и здесь нас Очень интересует такая штука Как адрес Мы видим что у Мон появился вот такой IP адрес Давайте мы его сейчас скопирую и вот в Мон сюда мы передадим вместо Local Host вот этот айпишник Теперь мы снова попробуем пересобрать на об после сборки Давайте мн стараемся её стартануть и что мы здесь с вами увидим мы с вами Увидим что к монге Connect у нас происходит но коннекта к pog у нас нет то есть что я здесь наблюдаю то есть вот пошёл Старт здесь Connection Local Host 5432 refused А вот Connect к монге ошибок не выдал Теперь мы с вами немножко отти наши изменения и теперь вместо Хоста мы проше вот такую запись Host docker Internal Давайте снова попробуем пересобрать наш образ уже с этим docker файлом сборка произошла всё успешно и попробуем Теперь снова стартануть наше приложение смотрим Что происходит и мы видим что сейчас ошибок у нас не наблюдается Давайте теперь проверим через postman как у нас всё это работает Мы выполняем запрос пост на API V1 Count происходит процессинг Мы видим что произошёл Окей теперь Мы попытаемся получить наши страны с помощью метода Get Итак мы делаем обращение и видим что у нас пошли страны теперь Допустим мы сделаем запрос поиска страны по Альфа коду то есть cc2 И пусть это будет MD Молдова то есть идёт запуск мы получаем полные данные потому что у нас в погра хранятся полные данные а вот если мы допустим Запроси PL то мы получим коротенькие данные потому что не хорат в монге то есть теперь у нас всё заработало мы можем сказать что мы реализовали приложение и докери Зро его и мы можем сейчас взаимодействовать как с внешним миром так и с монгой В контейнере и с pog которая стартует на локальной машинке теперь нам Интересно почему же это не сработало с Local Host сработало с каким-то IP адресом Но к погра мы не подключились Давайте разбираться в теоретической базе причина ошибки описана в нашей документации То есть тут говорится что хост для контейнеров с которым мы работаем он может изменяться И если мы хотим чтобы мы не были зависимы от этих изменений мы можем использовать стандартный хост Host docker Internal то есть внутри docker Desktop есть несколько DNS серверов DNS запросы от контейнеров сначала обрабатываются вот этим сервером внутри dockerd который распознаёт имена других контейнеров в этой же внутренней сети Это позволяет нашим контейнерам работать друг с другом даже без знания конкретных внутренних IP адресов то есть каждый раз когда приложение запускается внутренняя пишка может меняться динамически но контейнеры всё равно смогут обратиться по этому имени Host docker Internal благодаря внутреннему встроенному DNS серверу внутри нашего dockerd то есть остальные поисковые запросы они отправятся в Core DNS а потом в зависимости от домена запросы перенаправлять в один из двух DNS серверов на Хосте то есть domin docker Internal он считается как бы исключительным особенным и включает в себя DNS имя Host docker Internal которое преобразуется в IP адрес для текущего Хоста то есть конечно когда всё желательно когда всё у нас контри нези но иногда Host doer Internal позволяет нам обращаться к любому локал хосту и не заботиться о ХТ конге наших адресов то есть чтобы этого избежать опять-таки у нас может быть создана отдельная единая сеть в которой все контейнеры смогут легко друг к другу обращаться то есть мы можем создать новую сеть То есть у нас есть такая возможность как создание нового Нетворк который может быть создан с помощью dok Run минус - Network и мы даём имя этой сети далее внутри этой единой докер сети все контейнеры смогут общаться друг с другом и их IP адреса будут определены автоматически на основании только имени нашего контейнера то есть мы можем создать нашу сеть потом увидеть её либо создать и потом когда мы будем стартовать заново наш контейнер например Мон мы при старте укажем что данный контейнер он принадлежит к конкретной сети в данном случае Network Count Итак давайте для начала проверим что все контейнеры которые были они убиты То есть у нас больше нет контейнеров если у вас что-то работает попрошу их удалить и потушить и теперь Давайте проверим Какие сети У нас есть то есть я использую команду docker Network LS Мы видим что у нас есть какие-то системные сети но никакой cnet у нас пока нет теперь я выполняю команду docker Network Create Create cet cet Теперь мы снова выполняем команду видим что у нас cet появилась D Bridge по драйвера немного позже пройдёмся Какие они бывают и какие мы используем теперь я хочу запустить наш контейнер Мон дав ему конкретное имя и присоединив его к нашей сети cnet для этих целей я использую команду docker Run теперь маппинг порта 27017 на 27017 даём имя монго контейнер и делаем det Mode и подключаем его к сети то есть используя лаг Network Я указываю Count net и говорю что я запускаю на основе образа Мон происходит запуск всё запустило всё супер Теперь мы можем посмотреть что у нас есть docker PS Mon и теперь можем ещё выполнить команду docker inspect и посмотреть что у нас здесь есть DNS Конте идиш то есть мы можем обрати теперь к этому контейнеру либо по вот этому имени либо по его айдини что довольно-таки удобно Вот здесь есть NW Count и вот DNS имена нашего контейнера Мон отличненько думаю с этим пока понятно И теперь предлагаю запустить уже наше приложение передав ему вот через переменно среды нужные данные то есть что мы можем сделать То есть мы можем использовать следую команду она меня тут подготовлена заранее запустить docker Run манг порта 9200 на 9200 и передав следующее переменное среды То есть тут идёт Data Source URL pog используется Host docker Internal Потому что это не контейнер а реальный сервис поэтому данный Host остаётся имена понятно и потом мы говорим что у меня есть mongo Host и тут идёт mongo db контейнер это возможно как раз потому что внутри cnet Нетворк У нас есть DNS имя mong db контейнер задали порт задали базу данных и указали На основани какого образа это всё у нас будет происходить Итак мы запускаем наше приложение и смотрим Что произойдёт видим что у нас полетела ошибка по докер то есть Давайте разберёмся Почему так случилось потом это случилось по той причине давайте это сейчас топнем пока по той причине что мы не указали сеть к которой нам нужно подключиться это очень критично Теперь же если мы с вами сделаем следующий шаг И теперь мы выполним такую команду где мы в конце укажем Network cnet Country API latest и запустим ещё раз то в этот раз никаких ошибок уже не будет потому что данное имя интерпретируется и оно находится в единой сети Давайте теперь перейдём в наш postman Итак здесь у нас сейчас происходит процессинг Теперь мы берём Count cc2 выбираем MD то есть мы получаем данные из постс и тут мы получаем данные из монг то есть всё работает всё корректно Всё аккуратненько Давайте переходить к следующему этапу Теперь давайте подытожим только что мы с вами создали API который был запущен в нашем контейнере и он взаимодействовал с внешним миром из которого он получал данные по странам он взаимодействовал с db базой данных которая была запущена В контейнере и он взаимодействовал с которая была поднята на нашей локальной машинке Теперь давайте поговорим про драйверы то есть вот когда мы с вами создавали Network там было опция драйвера и там по умолчанию используется Бридж То есть это значит что если мы используем Бридж то контейнеры будут искать друг друга по имени внутри одной сети если мы используем хост то у нас нет изоляции между контейнером и нашей системой то есть весь Local Host в этом случае становится сетью далее есть драйвер overlay он считается и в этом случае несколько докер могут работать друг с другом то есть несколько докер инв то есть машинок далее Macan задаётся Каст мадрес для контейнера который используется для связи с ним и также есть сторонние плагины которые обеспечивают различные варианты взаимодействия допустим Катара и прочее и это значит что сети у нас будут отключены полностью теперь Давайте с вами поговорим про такую штуку как всего что мы с вами собрали во что-то единое То есть у нас с вами есть сервис у сервиса есть какие-то Тома У него есть сети есть переменно среды есть порты с которыми он работает и для того чтобы всё это объединить нам было бы намного удобнее работать с чем-то единым вот таким единым является компонент docker comp который позволяет нам объединить вот различные сервисы имеется вду база данных и прочее и запу вместе то есть у дор компо есть целый ряд тегов с которыми будем работать сейчас мы рассмотрим в нашем же каут в Степе 4 как мы сможем это всё поднять в докер композе то есть здесь у нас во-первых есть версия doer comp с которой работаем есть сервисы от которого будет от которых будут зависеть наши контейнеры или контейнер далее У нас есть образы Мы также можем задавать имя контейнера указывать Как происходит сборка задавать переменные среды задавать порты и пользу dependson то есть указать От каких сервисов зависит наша приложу без которой мы не можем стартануть Давайте вернёмся к коду и посмотрим Count э приложение Step 4 давайте мы с вами перейдём на степ 2 и здесь вы видите что мы с вами добавили наш Count Client который Тоже имеет докер образ это простой react Клинт для нашего сервиса проверяем во-первых что у нас все остальные контейнеры работают то есть работает mong работает Country API Теперь мы с вами создадим докер образ для C КТА То есть я выполняю docker Build то мину Tag Рав Count Client latest после этого произойдёт сборка нашего образа когда сборка завершена мы теперь стартам контейнер на основание этого образа То есть я пишу docker Run - P 4200 маппинг на пор 3.000 пор 3.000 стандартный для реакта и теперь Я указываю что я хочу запустить его для образа C Client Tag latest происходит запуск после успешного запуска мы перейдём в браузер на Local Host 4200 Итак здесь мы нажимаем кнопочку process чтобы запустить процессинг Мы видим что процессинг успешный 200 ок и у нас появились наши страны далее я могу посмотреть детали по какой-то стране вернуться обратно и уже после этого мы можем переключиться на бранч Step 4 потому что в рамках Step 3 мы только добавили наш мишк то есть здесь я делаю переключение на Step 4 и уже здесь в рамках п 4 вы увидите что мы добавили файл под названием docker compose Давайте посмотрим что же здесь есть мы используем версию 3 далее мы говорим что у нас есть сес Database который создаётся на основании образа mong latest hostname у него будет mongo порты у него будут 2701 Maps на 2701 далее мы говорим что мы хотим создать после этого Новый образ Country API который будет создан на основании образа Country AP порт будет 9200 на 9200 задаём переменные среды которые нам нужны Мы также говорим что App зависит от Database и только после этого мы начинаем выполнять сборку C Client его образа и работы с ними и по итогу я рассчитываю что он будет запущен на порту 3.000 и мы говорим что наш клиент зависит от API для того чтобы мы могли запустить наше приложение нам достаточно выполнить одну простую команду Это команда docker compose Up Build После этого мы должны С вами получить три докер образа и Также получить с вами три рабочих контейнера после этого когда мы перейдём в нашем браузере на посылке Local Host 3000 мы должны получить всё что мы видели перед этим при запуске поэтапно Давайте проверим наш браузер Итак мы находимся с вами в браузере Port 3000 Local Host я Нажимаю кнопочку process После этого у нас должен стартовать бы фу процессинга Мы видим что все данные были получены Теперь если я посмотрю сюда то данные все есть соответственно мы здесь можем сказать что благодаря docker композ мы смогли с помощью только одной команды запустить все три сервиса в нужном нам порядке Теперь если мы с вами выполним команду docker PS то здесь мы видим что у нас есть во-первых у нас с вами есть наш API и у нас с вами есть наш таким образом благодаря Дору А в частности доке компо Мы можем с вами получить возможность иметь такое же абсолютно окружение как на локальной машине так и на продакшене то есть это означает что мы будем иметь одинаковое поведение То есть у нас есть локальная машина у нас есть окружение кото можем подели и воспроизвести и также прокк делиться и его же воспроизвести теперь давайте рассмотрим следующую ситуацию у нас с вами есть некоторый разработчик который хотел бы этим всем поделиться То есть он поднял какой-то локально докер у него всё работает теперь он хотел бы чтобы с этим могли воспользоваться другие пользователи или другие разработчики соответственно этот разработчик должен взять наш докер образ закинуть его в регистр как мы делали допустим в докер хабе а далее уже на основании образа из этого регистра мы могли бы поднять это всё на каком-то сервере то есть простая железяка и уже если у этой Железяки публичный доступ то мы сможем получить м доступ к этому функционалу API что бы там ни было и очень хорошо бы чтобы этот процесс был более налажен и более настроен Но это следующий этап А пока мы попробуем с вами развернуть всё это на каком-то облачном сервисе давайте мы с вами попробуем это всё развернуть на aws облаке для этих целей мы создадим E2 instance vpc То есть это Железяка которая находится у амазона к которой мы сможем получить доступ мы дальше сможем сконфигурировать этот сервер настроить определённые группы безопасности чтобы наш сервер был доступен для внешнего мира после этого мы сможем подключиться к данной машинке по ssh далее мы устанавливаем докер на нашу машинку после этого запускаем наш контейнер для примере возьмём наше приложение node App чтобы мы могли обратиться по API поправка по IP адресу к этой машинке и в нашем браузере увидеть что же там происходит для этих целей Вам необходимо перейти по ссылке которую видите здесь регион можете выбрать не US East а любой другой и соответственно после этого нам необходимо будет запустить instance нужно будет выбрать ему конфигурацию в нашем случае мы выберем конфигурацию Linux 2 Ami далее мы выберем T это как бы й уровень нашей машинки T2 Micro потому что он входит в бесплатный тайр но опять-таки очень внимательно следите за расходами потому что здесь могут быть какие-то косты и также вы можете взять любую машинку у любого провайдера а не только у амазона далее После этого мы создадим новую пару ключей для того чтобы мы могли подкос этого мы перейдём к запуску нашего инстанса при переходе по ссылке которая указана в презентации вы попадёте на такой дашборд eas 2 сервиса здесь нажимаем кнопочку запуск инстанса После этого мы должны С вами выбрать instance то есть какой тип машинки мы будем использовать здесь нас интересует Amazon Linux 2 Ami hpm kernel 510 далее мы с вами выбрали архитектуру это будет 64 Бита далее instance Type То есть как бы уровень нашей машинки это будет Т2 Micro это очень важно потому что он подлежит к бесплатному использованию То есть если Вы только зарегистрировались на сервисе Amazon то первое время вы сможете бесплатно пользоваться каким-то количеством ресурсов далее У нас такая важная секция - это kpay то есть логин как мы будем коннектится к нашей машинке здесь важно сгенерировать новую пару То есть мы нажимаем здесь Create New Payer и здесь я делаю какую-то пару про The LITE Э кубес Пусть называется далее тут выбираем rsa здесь выбираем pem И после этого мы нажимаем кнопочку Create Key Payer Это очень важный шаг который нельзя пропустить когда мы нажимаем создание мы получим скачанный этот файл к которым мы немножко позже перейдём с вами далее мы должны выбрать здесь эту пару которую мы с вами создали После этого мы можем нажимать на кнопочку Launch instance здесь мы ничего не трогаем Network settings Мы разрешаем весь трафик здесь ничего не меняем выбираем Create Security Group чтобы группа безопасности была создана автоматически и остальное остаётся по дефолту нам здесь не критичны никакие изменения мы нажимаем кнопку Launch instance после этого начинается процесс создания нашей машинки виртуальной машинки с которой мы будем работать когда машина будет создано мы с вами можем перейти на вкладок instances и здесь в instan вы увидите что у вас была создана машинка которая в моём случае сейчас находится в статусе pending И когда состояние изменится на уже созданную машину тогда мы можем Будем считать что наша машинка готова к использованию Итак мы видим что наша машинка была запущена теперь для того чтобы мы могли подключиться к нашей машинке мы можем нажать на неё то есть на instance ID и здесь у нас есть такая кнопочка как Connect мы нажимаем на кнопку Connect и здесь есть инструкция для подключения к нашему инстанс Как с помощью например встроенного клиента амазона так и через ssh Client мы нажимаем кнопочку ssh Cent Что позволит нам по сути через терминал подключиться к нашей машинке здесь есть детальные инструкции того что нужно сделать и важно теперь перейти в терминал и попасть в ту директорию в которой у вас находится вот наш файл prite kubernetes PM В вашем случае если вы дали другое имя ключу соответственно подставить имя своего ключа Итак мы с вами находимся в нашей директории здесь видите что именно в этой директории находится PR cuber и соответственно в первую очередь Нам необходимо изменить право доступа к этому файлу и здесь я вбиваю про P отлично то есть мы это сделали теперь нам нужно выполнить команду ssh - I здесь забить про [музыка] нашей машинки то есть мы можем сейчас вернуться с вами снова в наш браузер здесь мы копируем вот эту строку и выполняем эту команду далее здесь мы нажимаем Yes потому что это первое подключение к нашей машинке И теперь мы находимся уже внутри нашей Железяки То есть это уже не ваша консоль это как раз вот ssh консоль нашей машинки теперь можем выполнить команду sud yum update - Y Что позволит нам про апдейт Всё теперь далее мы можем установить docker для этих целей Мы выполняем команду suda yum - Y Install docker после этого вы должны запустить docker так как он уже был установлен соответственно выполняю команду suda Service docker Start соответственно мы теперь видим что docker стартанул И теперь мы ещё должны выполнить команду suda User Mode - A - G docker ec2 User Всё теперь можем сказать что наша машинка готова для того чтобы мы могли с ним работать теперь мы должны проверить что у нас в нашем докер хабе в стре который мы с вами создавали ранее есть наш образ node App если его там ещё нет то нам необходимо сделать так чтобы он туда попал Давайте вернёмся в проект с noe app Итак что мы здесь видим Мы во-первых про у здесь есть доке об то есть в первую очередь мы делаем сборку То есть я нахожусь Сейчас в проекте делаю docker Build то мими ра latest происходит сборка нашего образа далее после того как образ был собран мы перепроверять данное приложение для этого япишу R на 42 и здесь я запускаю node App latest Мы перешли в браузер здесь мы видим что всё работает корректно проблем никаких нет нажимаем введите имя всё работает всё отлично Теперь давайте App и далее проверяю что он публичный Нажимаю кнопочку Create Отлично мы видим что сейчас у нас образ собран теперь нам нужно его запушить с нашей локальной машины для этих целей здесь мы должны загатье репозиторий на удалённый соответственно я пишу команду docker Tag noe App latest на prite noe P latest После этого я должен запушить свой локальный образ prl Note App latest в мой стр для этих целей я использую команду docker Push prite Note App latest Мы видим что Push произошёл Давайте перейдём в браузер и убедимся что наш образ находится сейчас в стре Итак мы Обновили нашу страничку и видим что несколько секунд назад мы действительно заали наш образ pral Note App в наш публичный стри теперь Давайте попробуем запустить этот образ в нашем ec2 instance с помощью ssh здесь важное уточнение Если вы работаете на какой-то специфической м машинке в моём случае это OS osx M1 вам желательно ещё указать платформу образа который вы собираете то есть здесь мы указываем не просто docker Build но также указываем Linux amd64 потому что по в моём случае это будет ARM 64 который не запустится на машинке которая у нас поднята соответственно здесь мы собираем наш образ происходит сборка После этого мы делаем г Note App latest мы тегаем на prite Note App latest И после этого мы делаем docker Push node prite node App latest Теперь когда произойдёт пуш Нам необходимо будет перейти в нашу машинку ec2 через ssh и попытаться запустить наше приложение уже там Давайте посмотрим как это будет выглядеть Итак сейчас мы находимся внутри нашей машинки теперь для того чтобы запустить наше приложение мы Для начала проверяем что у нас нет никаких запущенных контейнеров То есть ни обычных ни выключенных Теперь мы поем команду docker Run - P 4200 на 4200 и здесь Я указываю prite noe App latest Итак происходит сейчас запуск Мы видим что запуск произошёл без каких-либо проблем но теперь Давайте попробуем зайти на наш сервер по айпишник через адрес Теперь если Мы попытаемся пингануть наш айпишник через Ping то здесь вы увидите что у нас идёт потеря данных то есть мы по какой-то причине не можем подключить Давайте же разберёмся почему так происходит если мы вернёмся в наш instance то здесь мы увидим такую вкладок нетворкинг и Security и здесь если мы нажмём на Security то мы увидим такую штуку как inbound Rules соответственно если мы посмотрим сюда то мы видим что мы сейчас разрешаем подключение к нашей машинке откуда угодно но только по протоколу tcp на порту 22 соответственно это значит что можем подключиться только через консоль А вот исходящий трафик идёт куда угодно но для того чтобы подключиться через браузер к это или через просто любой пин любой клиент к нашей Железяки Нам необходимо немного модифицировать наши правила для этих целей мы находим такую вкладок Security groups заходим сюда и здесь Нам необходимо добавить новое правило мы нажимаем кнопочку Edit inbound Rules или Edit здесь нажимаю Add rule и здесь Я указываю следующую вещь то есть я говорю что у меня есть фик и я разрешаю Кому угодно на любом порту по любому протоколу подключаться к моей машинке конечно же вы не можете делать подобное во всех случаях в реальной жизни но для Учебного проекта это подойдёт Теперь мы нажимаем Save Rules соответственно это означает что на данный момент мы можем подключиться откуда угодно к нашему айпишник Давайте теперь перейдём по ссылки в браузере где у нас будет айпишник и порт 4200 И теперь когда мы с вами перешли на порт 4200 Вот по этому айпишник мы видим что у нас на данный момент всё работает корректно то есть всё как мы хотели так и работает уже не на нашей локальной машине а на удалённой железяке то есть на удалённой машинке которая запустила под капотом у себя докер приложения крайней и крайне важный момент который нужно Не забыть сделать - это остановить нашу машинку чтобы мы больше не тратили деньги на наш instance для этих целей вы подключаетесь из другого окна термина к нашей машинке здесь Мы выполняем команду docker PS далее Мы выполняем команду docker kill для того чтобы убить наш контейнер далее Мы выполняем команду docker контейнер прн Мы видим что теперь у нас нет никаких контейнеров ни таких ни выключенных ничего подобного И теперь мы должны выключить саму машинку в консоли aws для этих целей мы идём на наш E2 dashboard здесь у нас есть наши инстансы и здесь я выбираю такую штуку как actions точнее instance State и здесь я Нажимаю кнопочку terminate instant То есть тут предупреждение что мы всё это вышиб но мы всё равно нажимаем terminate и теперь мы видим что теперь статус будет э SH Down и потом он будет мий то есть Убедитесь что Вы удалили ваш и больше вам не идт как бы не капают косты на вашу машинку отлично то есть на этом мы можем сказать что наша работа с докеров Итак мы с вами увидели пример так называемого ручного деплоймент развернуть на сервере нужно было руками идти в консоль что-то делать всё это мониторить соответственно Вы уже поняли что такой подход сложно поддерживать особенно если у нас более чем один сервис с которым нам нужно работать у нас возраста Т кратно вероятность ошибки То есть я где-то что-то не то написал прописал не те конфиги возникли проблемы далее тратится много времени на всё это у нас возможны проблемы как с безопасностью так и с конфигурацией по следующий этап - это процесс мониторинга который у нас вызывает много сложностей То есть например у меня 50 сервисов как мне понимать кто работает Кто не работает Если они масштабированных работает на кого направлять нагрузку если такая необходимость возникла то есть целый ряд проблем промышленных возникает которые нам пока трудно решать для того чтобы решить эти проблемы используется очень часто такая технология как куне куне - это инструмент для оркестрация контейнеров это Open Source система для автоматического деплоймент масштабирования и управления контейнери Зро ими приложениями то есть Она позволяет нам вот все эти проблемы решить и мониторинг и деплоймент и масштабирование и балансировка нагрузки То есть это очень такая серьёзная система которую мы рассмотрим сейчас именно как разработчики потому что система очень обширная И если рассматривать как девопс то на это потребуется очень много времени но как разработчики мы с Вами рассмотрим ключевые компоненты и попробуем что-то поднять своими руками Итак кубернетес - это экосистема которая решает для нас следующие задачи Первое - это мониторинг состояния и автоматического деплоймент автоматическая масштабирование Когда мне необходимо поднять несколько инстан это балансировка нагрузки если у меня мои сервисы горизонтально масштабированных провайдеру мы можем использовать как гцп ажур АС так и свою какую-то железяку на которую мы накатим кубернетес или куб с которым мы и будем работать куб - это такая аналогия как бы уменьшенная версия кубера как k3s и прочее и также решает проблему коммуникации между узлами кластера то есть в кластере может быть много машин то есть допустим у нас 10 железяк Они все обменятся в единый кластер и между ни Нужно как-то настраивать коммуникацию Таким образом мы конфигурируется эту конфигурацию на кластер с которым работает у нас получается рабочее железо То есть как это выглядит если брать Верхнее приближение У нас есть всегда какой-то главный узел он же Master Note у которого есть управляющий слой который называется Control Plane и уже это этот управляющий слой он распределяет нагрузку и делает вызовы на так называемые Work Notes или worker Notes рабочие узлы внутри этих уже рабочих услов у нас находятся наши поды то есть контейнеры и конфиги на основании которых наши контейнеры и работают и взаимодействуют друг с другом если брать более такое близкое приближение то у нас есть некий главный узел Master Note у которого есть управляющий слой и ещё какие-то магические компоненты которые нам пока непонятны и не ясны давай Дава попытаемся их разобрать То есть если посмотреть немножко по-другому Как выглядит cer то мы видим что у нас есть Control Plane в котором У нас есть как бы в центре всего так называемый Cube API сервер который и взаимодействует с нашими рабочими узлами То есть у нас есть сервер он шлёт какие-то команды Пока непонятно Какие на наши рабочие узлы на наши рабочие машинки внутри ко Plane есть ещ такие компоненты как atd это некое хранилище сечас разберём детальнее что это такое Cube controll Man который отвечает как бы ну за менеджмент всей этой красоты У нас есть Cu sched который отвечает за поднятие опускание наших нодов и Cloud contr менеджер который отвечает за работу с облачными сервисами рабочие узлы ноды они состоят каждый НОД состоит из лета и прокси Сейчас посмотрим что же это такое более детально Если мы с вами говорим про Cube API то это наш Сервер это компонент кубера управления который представляет как бы AP ку Бернеса То есть это клиентская часть панели управления нашим куром Cu API сервер предназначен для горизонтального масштабирования и деплоймент трафик между этими экземплярами далее atd - это распределённая и очень надёжное хранилище наших данных в формате ключ значения такая Ke value storage которое используется как основное хранилище всех данных кластера в кубернетес если наш кластер cuber использует hcd в качестве осново хранилища нужно убедиться что у нас настроено резервное копирование данных далее Cube scheduler - это компонент нашей плоскости управления тут может меняться вот Ctrl Plane пытался переводить поэтому разные термины используются и он отслеживает созданные поды без привязанного узла то есть есть пода но она не привязана к какому-то ноду И вот именно он выбирает ноду на котором э этот эта под должна работать при скели нашего деплоймент на узлах учитывается много факторов и тут включается требования к ресурсам ограничения связаные с аппаратными политиками э и прочее Cube Controller Manager э запускает процессы контроллера то есть э логично что каждый контроллер представляет собой отдельный процесс и для упрощения все такие процессы скомпилированный файл и выполняются в одном процессе контроллеры включает себя контроллеры узла это Note контроллер контроллер репликации поддерживает количество подов для каждого объекта контроллер нпои он заполняет объект конечных точек то есть endpoints и связывает сервисы и поды что такое сервис рассмотрим чуть дальше и контроллер учётных записей и токены токенов то есть аккаунт и токен контролер они создают стандартные учётки и токены для доступа там для для новых пространств имён далее Cloud controll медр он запускает контроллер которые взаимодействуют с основными облачными провайдерами это бинарный файл Альфа Альфа функциональность которая появилась в кубе 1.6 и Cloud Котлер менеджер запускает только циклы контроллера которые относятся к облачному провайдеру далее Cub - это агент который работает на каждом узле в нашем кластере на каждой ноде он следит за тем чтобы контейнеры были запущены в нашей в поде и работали Ута Cub принимает набор под спецификацию и гарантирует что всё будет работать и исправно с точки зрения контейнеров Агент лета не отвечает за сами контейнеры которые не созданы кубернетес пси - это сетевой прокси который работает на каждом узле в кластере и реализует часть концепции сервиса далее кубер То есть отвечает за создание управления контейнерами за использование ресурсов которые представляет инфраструктура чаще всего Облачный провайдер мониторинг состояния нте и за масштабирование сервисов как это выглядит с точки зрения другой схемы вот у нас с вами есть некий кластер внутри которого есть три ноды То есть кластер - это группа НОД на которых работает наши докеров приложения далее У нас есть нода и нода - это физическая или виртуальная машина которая взаимодействует с нашим кластером и которая является по сути хостом для то есть и worker Notes далее есть такая штука Как поды поды - это рабочие приложения которым были выделены определённые ресурсы и есть Такая сущность как сервисы То есть это логически объединённая группа подов под которую выделяется отдельный IP адрес Теперь мы можем перейти к установке кубера на наш локальную машину мы будем с вами устанавливать куб потому что он Хорошо подходит для э нашего именно одноузловой машинка на ней будет кластер кубера вы выбираете свою операционную систему Следуйте инструкциям выбираете свой гипервизор который Вам будет нужен а далее м у нас есть необходимость ещё установить Cub ctl вы также выбираете вашу операционную систему здесь очень подробной инструкция Когда вы это выполните мы можем перейти к продолжению к проверке того как шла установка для проверки Мы сначала проверим что у нас установился Cub ctl для этих версий я выполняю для этих целей я выполняю команду Cub ctl version мими Client и здесь я вижу что остановка пошла хорошо После этого мне необходимо стартовать мой minic для этих целей я выполняю команду Min Cube ста dver я выбираю в данном случае doer и также вбиваю команду no vtx Check которая поможет мне избежать ряда проблем На маке Итак сейчас происходит подтягивание докер образа для мини Куба и когда он будет подтянут начнётся этап старта контейнера мини Куба Итак после старта нашего мини Куба мы можем выполнить команду Min cbe статус здесь мы увидим что у нас используется Control Plane H запущен лет запущен API сервер запущен Cube config сконфигурирован соответственно мы скачали образ Куба и мы подняли контейнер в котором У нас сейчас куб и крутится соответственно Теперь мы можем с вами запустить дашборд нашего мини Куба то есть для этих целей я использую команду Min Cube dashboard Итак после этого в браузере мы увидим консоль нашего мини Куба здесь мы видим что на данный момент у нас ничего не для ражение То есть у нас нет Джов у нас нет подов у нас не настроены ни сервисы ничего То есть у нас чистый мини куб с которым мы сейчас Можем начинать нашу работу после проверки мы можем перейти уже к основам работы с кубера более практически То есть когда мы говорим про кубе то у нас есть три ключевых компонента это поды наши рабочие контейнеры то есть рабочие юниты это деплоймент которые описывают то каким образом мы поднимаем эти поды на основании чего как они работают и прочее и это сервис который предоставляет доступ внешнему миру к нашим подам то есть мы смотрим сюда то есть под наименьшая Рабочая единица с внутренним IP адресом который недоступен наружу далее деплоймент определяет Какие поды и какое количество запускать сервис группирует поды под одним каким-то общим IP адресом и позволяет обратиться к поду по айпишник мира Теперь мы можем с вами перейти к созданию деплоймент мы уже с вами создали наш наше приложение э noe App И теперь мы будем создавать наш deployment то есть посмотрим что это такое Главное чтобы вы понимали что в этом случае мы работаем ни в коем случае не с локальным образом а с образом который у нас находится в регистре и здесь в терминале мы начинаем выполнять команду Cube ctl То есть я прошу Cube ctl создать мне deployment cre deployment и далее даю ему имя То есть я назову его prite noe App И после этого Я указываю На основании какого образа это сделать То есть я говорю что мне нужен образ prite node App и нажимаю enter то есть теперь мы видим что у нас наш деплой был создан я выполняю следующую команду Cub ctl Get depl здесь мы видим что у на появился у которого сейчас состояние 0 то есть мы понимаем что ни один пот не запущен ещё теперь выполняю команду qp ctl Get pods Мы видим что контейнер всё ещё создаётся То есть он на этапе создания вероятнее всего это связано с тем что мы ещё подтягиваем наш образ в какой-то момент вы увидите что у вас Get poots отдаёт Вам адрес вашего пода точнее его имя и говорит что он готов Теперь если мы ещё раз выполним команду Get deployments то здесь вы видите что у него состояние рейди один из одного то есть что у нас всего подразумевается один под и этот под уже находится в рабочем состоянии Теперь если мы с вами вернёмся снова в наш minic дашборд Давайте откроем отдельную вкладок здесь чтобы мы не заблочили основной консоль Min Cube дашборд то здесь вы увидите что уже у нас появился во-первых Один деплоймент который рабочий У нас есть один под который рабочий и у нас реплика сет одна То есть мы видим деплоймент поды реплика сеты отличненько теперь Давайте попробуем перейти по нашей ссылке Local Host 4200 на которую мы обычно переходили перед этим когда запускали это всё локально при попытке перейти на Local Host 4200 Мы видим что мы не можем обратиться сюда Это связано с тем что в данном случае это уже что-то внутренне как я говорил ранее у поды есть внутренний IP адрес к которому мы не можем обратиться из-за пределов наше то есть что здесь произошло мы с вами выполнили команду и прочее далее Ctrl Plane выбирает рабочий узел по ряду параметров в нашем случае у нас Один узел Но если было два то он бы сделал какой-то выбор далее отвечает за управление подом и на основании образа деплой создаётся наш под теперь для того чтобы мы получили доступ к нашему поду нам нужно сделать очень много усилий сейчас нужно каким-то образом прокинуть внутренний айпишник наружу У нас есть типы прокиды Нея это cler IP это Note P или Load balancer про каждый из них вы можете почитать в документации я оставлю ссылку Но мы с вами будем использовать Note Port то есть соответственно мы говорим что сейчас я хочу заэс поть deployment prl Note App и за Экспо его на порт 4200 на основании этого у нас появится новый сервис Давайте вернёмся в наш в наше приложение посмотрим как это будет происходить соответственно здесь Мы выполняем команду Cube ctl exp deployment PR node App далее тип Я указываю No Port и пор в данном случае будет равен 4200 то есть теперь мы говорим что у меня по App который является то есть проки наружу теперь команду Cub ctl Get Services то есть либо Services и мы здесь увидели что у нас появился Ну cuber это понятно но здесь нас интересует про Note App Либо мы можем использовать команду Get svc и вот мы с вами видим что у нас появился какой-то сервис теперь для того чтобы мы могли получить доступ к нашей системе мы должны подключить ещё minic то есть в этом случае я выполняю команду minic пожалуйста обратись мне к сервису prite noe App нажимаю Enter И теперь у нас есть уже готовая ссылка то есть вот она появилась у нас перейдя по этой ссылке мы увидим наше рабочее приложение давайте это проверим итак перейдя по этой ссылке мы с вами увидели наше рабочее приложение к которому мы привыкли да то есть тут вбиваем prite в видите имя всё работает всё отлично и теперь интересный момент Давайте с вами сейчас нажмём Exit чтобы проверить что приложение сейчас Потуши И что будет происходить далее мы сейчас подождём какое-то время и мы увидим что наш под был пересоздать о котором мы и говорили что если даже с подом что-то случается мы по какой-то причине выключили то кубер нам обеспечит как бы рабо работоспособность это этого пода То есть он увидел что произошла какая-то беда что под сейчас не отвечает и соответственно его нужно пересоздать давайте сейчас ещё зайдём с вами в наш куб дабор и здесь мы сейчас видим что у нас всё работает всё корректно и теперь если мы ещё обратимся к нашим подам и здесь зайдём в наш конкретный под мы ещё можем поть ивент и Здесь вы всегда видите что происходило на каком этапе То есть как всё планировалось как запускалось и прочее то же самое у нас есть по деплой по деплоймент где расписывается что когда происходило И основная мысль заключается в том что как вы увидели сам отслеживает работоспособность наших подов и если с подом что-то случилось то в этом случае мы просто его перезапустите работоспособен теперь мы переключаем на новый бранч это ветка П 5 здесь в Ветке 105 Вы видите что у нас есть версия кубернетес Def То есть это как бы изменение в код с которым мы хотим поработать сейчас мы с вами соберём Новый образ для этой версии соответственно do Build ра версия Dev Мы ждём пока образ будет собран и по завершении сборки мы можем его теперь тегнуть и запушить в наш СТ то есть соответственно теперь я пишу do App Def на PR И после этого мым образ соответственно я делаю docker Push prite noe App Def происходит пуш нашего образа на сторонний сервер на registry и когда образ запущен мы делаем следующие изменения то есть здесь я пишу Cub ctl установи пожалуйста образ для деплой prl node App node App про node App Def то есть мы как бы для нашего существующего деплой хотим применить Новый образ Мы выполняем эту команду Мы видим что имидж для данного деплоймент был изменён и теперь если я выполню команду Cu C Get pods то в этом случае Вы у видите что у нас создаётся новый контейнер для это же этого же пода То есть сейчас будет происходить пул нашего образа А после Пула мы запустим новый и потушим старый Итак мы видим что мы перезапустили под У нас есть новый рабочий под который был стартова минут назад и теперь если мы перейдём с вами по той же ссылке где Мы проверяли наше приложение мы увидим что наши изменения были применены Итак здесь мы теперь видим что у нас есть версия cuber Def она рабочая То есть все изменения отрабатывают и проблем никаких нет таким образом Мы научились с вами применять новые изменения для уже существующего деплоймент теперь по такой же аналогии мы переключаем на наш следующий бранч это П 6 мы делаем чекаут и видим что здесь из изменений это изменение версия kuber prod вместо Def соответственно Теперь мы снова собираем Новый образ То есть я делаю docker Build точка мину мину Tag Рав node App про происходит сборка нашего образа После этого мы должны создать тег То есть я гаю node App prot на prolite node appp происходит Г И теперь я пушу этот образ в наш СТ то есть tocker Push prite noe App prod то есть теперь происходит алод нашего образа И теперь мы меняем для нашего деплоймент пожалуйста новые изменения для моего деплой Теперь мы вбиваем Cub ctl gets Мы видим что изменения применили моментально 8 секунд прошло Давайте теперь проверим что же происходит сейчас в нашей системе здесь мы видим что теперь у нас версия kubernetes prod проверяем что всё работает по классике про The Lite введите имя всё таким образом мы с вами применили первую версию и применили вторую и выполним ещё одну интересную команду мы попробуем создать два пода То есть как вы видите сейчас у нас есть только один под для нашего деплоймент Он работает всё корректно И теперь я выполняю команду Cube ctl Scale deployment prel Note appp и здесь я пишу repas равно 2 соответственно теперь когда мы проверяем Мы видим что сейчас у нас создаётся второй контейнер он довольно-таки быстро создан И теперь мы с вами попробуем перейти сначала в наш браузер и выполнить несколько команд А потом проверим логи на подов Как видите Здесь всё работает то есть тут будет например 1 2 3 4 п и так до де посчитаем и потом посмотрим какие из этих вызовов полетели на один под А какие на другой под Я возвращаюсь в нашу борду здесь у меня есть поды Я смотрю что у меня есть Note первый здесь у нас есть такая кнопочка посмотреть логи и ви что сюда пошли вызовы 1 2 3 4 5 6 7 8 9 10 То есть пока Пошли все пром пока второй Note App здесь мы видим что сюда пришло только Note prite Давайте ещё в объём что-нибудь проверим что придёт сюда то есть и здесь мы видим что часть в обращении Пошла сюда а часть обращение пошла на другую поду Таким образом мы увидели что с помощью команд в консоли мы можем задавать конфигурацию нашего окружения но использование только команд создаёт ряд сложностей с поддержкой рабочего окружения потому что мы можем можем вбить потом забыли потом не понимаем на основании чего применялись таки прочие изменения это сложно контролировать мы не понимаем историю изменений и прочее в реальной жизни чаще всего применяется подход использования конфигурационных файлов то есть инфраструктура как код infrastructure sde для этих целей мы с вами можем сейчас сначала удалить все наши деплоймент удалить наши сервисы посмотреть что нет никаких подов И после этого перейти к написанию нах нашего деплой с помощь фор yel сча Мы проя у нас есть дей Get deployments далее мы можем удалить Это deployment отме я использую Кома Cub ctl Delete deploy prl noe После этого я смотрю какие у меня есть серс то есть cuc Get Services теперь я использую Кома Delete serv и задаём имя нашего который мым удалить далее мы проверяем какие у нас есть поды Cub ctl Get pods Мы видим что никаких подов сейчас у нас нет И теперь мы с вами можем переключить СТП 7 то есть мы переключились на п 7 здесь мы смотрим Что был добавлен deployment файл и Давайте посмотрим что же это за node App deployment фай То есть это у нас файл который описывает како что должно быть в нашем деплой то есть здесь мы пишем что мы используем версию Apps V1 в документации которой есть по ссылке вы сможете ознакомиться со всеми возможными опциями далее мы говорим что у меня есть метаданные с таким-то именем про node App deployment далее указываем количество реплик их четыре далее У нас с вами есть node App имя much Label T - это клиент то что это не Back Front далее мы задаём шаблон тут опять-таки Label App тип Клинт и далее мы указываем по контейнерам Я говорю что я хочу создать контейнер с именем Light Note App на основании образа Pro The Lite Note App latest Итак теперь что я должен сделать для того чтобы это у меня применила Я прихожу опять в консоль и использую команду Cub ctl apply - F node App node App deployment yaml то есть я говорю Cub ctl пожалуйста примени файл node App deployment yaml После этого мы получаем информацию о том что был создан новый deployment я проверяю это Командо Cub cta И теперь мы видим что у меня появилась появился деплой у которой че пода проверяем что есть действительно чере пода то есть и они действительно все работают Таким образом мы с вами смогли создать de файл Теперь мы должны С вами сконфигурировать сервис чтобы это у нас корректно работало соответственно Мы можем с вами тепер переключиться на шаг номер и здесь вы увидите что был добавлен сервисный фа мы зайдём в него то мы здесь видим следующие данные мы говорим что у нас есть API version V1 тип этого файла это сервис метаданные это node App Service далее Я хочу работать с приложением node node App и далее Я говорю что у меня есть порт tcp пор на восьмидесятый Target 4200 соответственно Теперь давайте ИТ что мы здесь тоже поставим 42 чтобы было п not то что мы забивали в консоли теперь происходит здесь соответственно Теперь мы пере проверяем что никаких сервисов сейчас у нас нет идёт Cub ctl Get serv У нас есть только cuber теперь мы делаем следующее Cub ctl apply - F noe App noe App Service Y отличненько соответственно Теперь мы проверяем что у меня есть уже мои сервисы я выбиваю команду Cub ctl Get здесь я вижу что есть P и теперь мне осталось только запустить с помощью Куба я пишу Min Cube Service noe App serv происходит запуск и соответственно перейдя по ссылки я смогу увидеть что же у меня здесь есть и здесь мы видим код который был у нас в версии latest не Def и не про а именно latest здесь Давайте просто во обьём тоже про zite проверим что всё работает Таким образом мы понимаем что сейчас у меня уже есть deployment у меня есть сервис которые были созданы на основании наших конфигурационных файлов и остался только один момент это применение изменений к нашему деплоймент Например я смотрю что сейчас у меня есть четыре пода то есть делаю Cub ctl Get pods четыре пода всё работает и я хочу изменить чтобы их стало два в этом случае я просто меняю их файле Если нужно я это кочу и после этого использую команду Cub ctl apply File node App dey Отлично Теперь если мы сделаем Get что у меня два пода останавливаются и в какой-то момент когда они остановятся у меня останется только два пода отличненько Теперь мы с вами можем переключиться на бранч номер де где мы с вами добавим новые файлы это будут файлы node App deploy который будет работать на основании образа это будет который соответственно на проде и два сервиса Client Dev и Client про который будет взаимодействовать с со своим деплой для Дева и для прода здесь Един момент что мы забьём другие порты То есть тут тоже поставлю 4200 и тут поставлю 4200 далее Что нам необходимо сделать давайте для начала пнем все деплой которые у нас есть и все сервисы чтобы проверить что подов пока не осталось То есть тут я пишу cbct Get deploy теперь этот deployment я удаляю Cube ctl Delete deployment node App далее Cub ctl Delete Service prite node App Service такого нет соответственно node App Service Да скорее всего отлично и проверяем что у меня больше подов нет всё подов в данном у нас нет Теперь мы можем перей к нашим файлика node Def deploy и node App depl и также сервисы для Дева для прода Всё это находится у нас в бран под номером де kitch мы находимся в степ де финальный степ для этого приложения Соответственно что мы теперь делаем мы увидели что у нас Никаких подов никаких деплой никаких сервисов нет И теперь мы с вами можем зать наши изменения то есть соответственно Теперь мы делаем следующее в Cub ctl apply - F то есть я могу прямо несколько файлов применить сюда Note App deployment Def yaml - F Note App deployment prod yaml - F node App deployment поправка Service Def yaml и - F node App Service prod yaml Так у нас есть наши файлики смотрим Что произошло теперь Мы выполняем команду Get deploy У нас есть два дей Теперь у нас есть два наших сервиса Client и теперь соответственно мы делаем Min Cube сес Client и в соседнем окне мы делаем Итак их запустили давам нас появилась Итак здесь мы видим что на одном порту у нас поднялся сервис и рабочее приложение для Дева на другом порту поднялся сервис и есть рабочее приложение для прода Таким образом мы теперь можем переключаться между окружения на уровне кода Итак мы переходим в наш проект fil Service и переключаем на branch Step 2 здесь у нас есть docker compose File в котором мы запускаем наше приложение и создаём Vol соответственно для того чтобы это всё старта мы используем команду docker compose Up - D мину мину Build Итак команда запускается у нас подтягивается образ всё запущено Теперь если мы с вами перейдём на порт 8989 то здесь если мы с вами в обьём данные то есть тест 1 тест 1 submit payot мы видим эти данные Теперь давайте мы с вами выключим наше приложение и удалим контейнеры соответственно здесь выполняем команду docker compose Down Теперь мы удаляем наши контейнеры То есть я пишу docker контейнер прн контейнеры удалены И теперь мы попробуем снова поднять наше приложение через docker compose App и теперь если мы снова обновим то мы увидим что данные у нас не потеряны перейдём к томам в кубернетес потому что до этого момента Мы работали с томами контейнеров кубернетес в свою очередь представляет нам свои Тома которые дают нам ряд преимуществ они имеют различные типы не всегда персистентные Они имеют различные драйверы то есть могут быть локальными на нода и облачными через облачные драйвера более детально мы можем ознакомиться с ними перейдя по ссылке которую вы видите здесь то есть здесь у нас есть разные типы вомонд авса для ажура есть локальный есть sinder config Map и прочее MTD с которым мы немножко поработаем соответственно изучив эту документацию и зная свою ситуацию на проекте то есть что вам необходимо вы всегда можете выбрать себе корректный тип волюма для кубера Теперь давайте мы снова вернёмся в наше приложение и попробуем поработать уже с томами кубернетес для начала мы Переключи на новый бранч и попробуем запустить наше приложение с помощью уже кубера с помощью файлов деплой и сервисов Итак мы переключаем на бранч п 3 и здесь вы видите что у нас появились файлы fil serv deployment и fil serv Соответственно что мы с вами видим здесь мы добавили стандартный наш дей файл Но самое интересное нам Мы видим с вами здесь у нас есть спецификация есть контейнер и тут есть такой раздел Vol mounts то есть мы говорим что мы хотим спить наш ВОМ наш контейнер с вольюм который будет расположен вот по такому Pass App storage и имя этого вома fil Service Vol А здесь мы создам сам и здесь мы видим что у него тип идт empt Теперь давайте мы соберём новый докер образ на основании текущего кода используя команды docker Build мину мину равен Files то latest пока идёт создание образа мы с вами создадим Наш новый репозиторий то есть здесь появляется репозиторий с именем fil Service здесь я е пере проверяю что он яется публичным Я создаю данный репозиторий и возвращаюсь в наш проект внутри проекта Мы видим что образ уже был создан теперь нам нужно его тегнуть то есть мы используем стандартную команду Dock Tag fice latest и мы его тегаем на prite fil Service Tag latest нажимаем Enter И теперь мы пушим наш образ в наш удалённый арфа do Push latest печатка и теперь должно быть всё хорошо Итак идёт pion нашего рези нашего образа и Мы также видим что в наш удалённый артефакто мы загрузили несколько секунд назад Наш Новый образ теперь можем вернуться в проект и попробовать применить наши deployment и наш сервис для этих целей я пишу Cube ctl apply - F fil Service deployment yaml и - F fil Service Service yaml Итак мы видим что у нас были созданы новые деплоймент Новый сервис и теперь выполняю команду Min Cube Service F Service сервис на данный получили ошибку потому что ещё образ не подтянулся если мы сейчас выполним с вами gets то здесь мы видим что у нас есть F Service deploy и контейнер всё ещё создаётся такая ситуация бывает нам стоит подождать пока под будет создан Итак теперь ВИМ что под был создан ива ещ раз Выполни команду minic serv fil serv Service теперь мы видим что ошибок мы не получили и теперь Если мы с вами перейдём снова на страницу фом и тут мы во обьём тест тест submit go to payad видим что данные у нас здесь есть то есть мы ничего не потеряли всё корректно работает но если сейчас мы с вами сделаем следующее То есть я беру под gets И попытаюсь удалить данный под чтобы cuber сам его пересоздать соответственно теперь мы видим что мы создаём новый под На текущий момент снова Get pods он запущен У нас всё хорошо и сейчас я вернусь в наш э браузер и посмотрю что же там происходит сейчас на данный момент мы видим здесь тест Но как только я обновлю страницу я увижу что данные были потеряны потому что мы с вами использовали empt dirar Давайте вернёмся в код то есть здесь мы с вами видим что мы использовали тип вома MTD Это значит что при пересоздание нашего пода мы получим пустой вольюм в котором ничего не будет текущий вид томов кубернетес не поддерживает кластерную модель то есть наличие нескольких связанных узлов для решения нашей задачи существуют персистентные Тома persistent volumes более детально о них Вы можете прочитать в официальной документации персистентные Тома делятся на то есть есть у нас стандартны которые определяются создаются и работают на уровне именно пода их администрировать довольно-таки сложно а персистентные Тома они определяются создаются и работают на уровне уже кластера и управляются Они через клеймс они крайне просты и понятны в админист Итак мы переключились на бранч Step 4 и здесь мы с вами видим следующие файлы То есть это Local Volume в котором мы с вами создам то есть мы видим apion 1 это далее мы даём имя Local persist Volume ему мы выделяем ему 2 Гб в нашей файловой системе storage Class name - это Standard доступ read wr Man Это значит что можем записывать читать и записывать этот файл мы создаём Pass storage и директория или создание То есть если такой директории нет то мы её создадим далее У нас есть йс которые работают с нашим localist volum и они говорят Какие ресурсы мы здесь можем использу То есть это уже как бы сами лейсы Теперь давайте перейдём в наш браузер почистим консоль и выполним команду Cube ctl gets Мы видим что сейчас у нас persistant Volume есть только для нашего мини Куба то есть ничего связанного с нами у нас нет теперь вы Поня выполняю команду Cub ctl apply - F Local Volume yaml и - F Local Volume clim yaml отличненько Теперь мы с вами создали наши волю теперь е напишу Cub ctl Get scc ничего пока не поменялось а далее мы с вами идём в наш F Service deployment и здесь мы видим что есть некоторые изменения то есть вот здесь мы в volumes указали что наш Volume File Service Volume теперь persistent Volume claim который ссылается на этот clim А clim в свою очередь ссылается на Local volum соответственно Теперь мы можем ещё выполнить следующую команду Cube ctl Get persistent volumes видим Так они уже были созданы далее я могу ещё вбить Get persistent Volume claims и теперь ещё Get Cube ctl Get pods Мы видим что наши поды сейчас крутятся соответственно сейчас мы можем с вами применить те изменения которые у нас были соответственно мы сейчас делаем Что я могу создать То есть я пишу Cub ctl apply - F fil serv deployment yaml то есть мы видим что всё было сконфигурировано Теперь мы смотрим Cub ctl Get pods видим что под был запущен наш и соответственно давайте сейчас снова вернёмся в наш браузер добавим туда какие-то данные перезапустили здесь мы видим что пока payload пустой я вбиваю тест 1 тест 1 смотрю в добавились Давайте ещё добавим тест 2 тоже submit Данные есть всё хорошо возвращаемся сейчас в наш проект соответственно я вбиваю команду Cu Delete по вбиваем её имя почистим Cu Get видим что уже пода была запущена возвращаемся браузер и здесь если мы обновим страницу Мы видим что данные никуда не не делись они остались потому что теперь мы используем именно персистентный волюм Теперь мы можем переключиться на бранч Step 5 и здесь мы видим что в этом бранчевский файлы нам нужны для того чтобы мы не забивали руками вот в деплоймент себе данные сами А чтобы мы могли брать эти данные непосредственно из переменной среды То есть у нас с вами появляется какой-то config Map то есть мапа с переменными то есть У меня появляется какая-то переменная File Service storage Location и здесь её значение как Ke value Теперь мы смотрим Где используется данный э файл Мы видим что у нас теперь здесь есть Files Service deployment volumes config Map yaml где мы вместо хардко используем File Service storage Location теперь После этого мы с вами что можем сделать у ми который у нас уже есть и удалим сервис который у нас уже есть и потом передним новый и создадим Новый сервис для этих целей Давайте почистим консоль То есть я снова пишу далее мы фас сносим Del Давайте заодно ещ Вот это снем аккурат аккуратненько То что осталось от прошлых проектов Отлично Теперь мы делаем Cu ctl Get опять-таки мы можем снести прошлое то есть Cu ctl Delete serv Client Client и также снес ещё и F serv serv то есть здесь serv отличненько теперь что мы делаем мы с вами начинаем применять наши фай то есть Япи при config Map наш После этого я применяю наш dey F dey volumes config Map и дальше я применяю ещё наш сервис File serv serv Y в котором также у нас есть изменение что мы работаем с этим деплой Итак мы нажимаем Enter Мы видим что были созданы и деплой и config и сервис далее я выполняю команду Min Cube serv фа Service Service некорректно скопировал так происходит запуск и Давайте теперь Переключи в нашу в наш браузер здесь мы видим что мы создали наш файл здесь мы видим старые данные потому что мы подключились всё к тому же persistent во потому что независимо от того кто к нему подключается Vol остаётся всё таким же данные там хранятся и мы получаем к ним доступ Итак давайте сейчас удалим текущий deployment снова делаем Cub ctl Get deployment удаляем его то есть Cub ctl Delete deployment удалим наши сервис Cube ctl Get Service соответственно его тоже нужно снести Cub ctl Delete Service далее мы проверяем что у насс никаких подов не осталось Cub C Get pods Да подов тоже нет всё хорошо и теперь давайте мы Переключи на следующий бранч это branch Step 6 шестой бранч и здесь у нас с вами появляется новый файл fil serv Secret то есть здесь мы можем хранить различные данные пароли и прочее здесь данные закодированы с помощью кодировки Base 64 это значит что если мы с вами пойдём и сделаем декод вот этой строки то мы с вами получим наш App storage storage txt и далее мы можем применить наш fil Service Secret и дальше у нас появился с вами ещё новый deployment File Service deployment Volume Secret и здесь мы видим что у нас появляются данные о нашем value From отсюда То есть у нас появляется какой-то storage Location и storage Location у нас берётся из File Service Secret файла и он берётся из значение File servers storage соответственно в данном случае это не так критично Но если бы это были пароли к базе данных или прочем это было бы более удобно хорошо Теперь давайте мы с вами сделаем следующее то есть мы применим все эти файлы то есть apply - F fil Service deployment volumes Secret и конечно же сначала нужно бы ещё прикрепить сами секреты то есть F Secret и в конце мы е перем То есть тут будет serv serv yam отлично нажимаем здесь теперь Enter всё создано теперь нажимаю команду Min Cube Service fil Service Service происходит запуск и здесь мы видим что приложение работает Давайте тут в объём тест 8 тест 8 нажимаем submit go to payload и видим что и старые данные остались и текущие данные у нас всё также сохранились Таким образом мы с вами рассмотрели разли виды люмов и также рассмотрели варианты передачи данных в нашу систему через config Map и через Secret Какие же преимущества даёт нам Такая сущность как Secret первая безопасность То есть даже если значения в секрете кодируется просто в b64 они всё равно не хранятся в открытом виде и не отображается в ял файлах манифестов кубера это может быть крайне Полезно если значение секретов содержит чувствительные данные такие как пароли Или ключи доступа далее управление доступом Секреты могут использоваться для ограничени доступа к чувствительным данным на нашем кластере и Мы также можем управлять правами доступа к секретам с помощью ролей и разрешений в кубе ещё следующий момент интеграция с инструментами управления секретами то есть кубер имеет возможность интегрироваться с таким инструментами как aws sec Man и прочее Это позволяет нам более безопасно управлять этими секретами также автоматически их обновлять и производить ротацию ключей не задействуя какую-то ручную работу глубокую простота обновления потому что ЕС нам нужно заменить Като значени мы просто берём в конкретном файле меняем и потом всё это будет применено и дальше хотя b64 кодирование не обеспечивает полной безопасности использование секретов кубе представляет дополнительный уровень безопасности и управления данными в нашем клас таким образом что мы видим у нас с вами есть некий прецедентный Том у нас с вами Может быть несколько узлов в рамках которых У нас есть сколько угодно под в данном случае три штуки и через То есть через настройки доступа к стент вому который есть на данном узле мы можем подн к одному и тому же тому и мы переходим к сетевому взаимодействию в кубес мы будем рассматривать детали в сервисе persons там будет у нас три под проекта детально всё есть на гитхабе и мы это всё сейчас разберём то есть что мы будем делать у нас будет некий кластер в котором будет два пода один под будет содержать один сервис API Gateway который будет доступен внешне и он будет обращаться к сервису Person serv внутри другого пода И также у нас будет ещё под Address сес и с ним вместе в поде будет Person серс и опять-таки Address сервис будет доступен для вызова из внешнего мира а Person сес нет и соответственно мы будем как бы иметь защищённый ресурс которому нельзя Достучаться Извне Но к нему можно будет Достучаться через другие сервисы то есть API Gate и Add для этих целей мы с вами переходим в наш проект Person и здесь мы находимся на ветке branch Step 1 То есть я делаю git branch и тут вижу П 1 все остальные Давайте вкладок чтобы они нам не мешали Итак что мы здесь делаем у нас есть три сервиса это Address Service это AP Gateway и это Person Service Person serv это просто все эти сервисы это просто springboot приложение которое предоставляет а то есть в базу данных никуда не ходят просто генерируют какие-то данные под капотом и к этим данным можно обратиться в Михе очень детально всё описано Как это работает тоже самое примерно происходит и в Address Service и IP Gateway но при этом IP Gateway имеет следующую штуку То есть тут внутри него содержится такая штука Как Person Client который с помощью обычного телета может обратиться к другому сервису по этой Ур То есть у нас есть какая-то переменная Person Service URL которая находится здесь то есть она либо именуется Person Service либо по дефолту это Local Host 8080 и то же самое у нас находится внутри Address сервис который также содержит в себе клиент который обращается к нашему Person Client у него есть свои нпои но под капотом он вызывает другой сервис давайте пока всё это свернём аккуратненько и посмотрим на файл docker compose здесь что мы видим Мы видим что у нас есть docker compose версия 3 у нас есть три сервиса То есть первый это Person Мы здесь будем собирать образ на основании докер файла который находится внутри Person Service для гевея на основании docker файла здесь и для Add сервис настане docker файла там и каждый мы запускаем на своём порту То есть у всех из трёх этих сервисов используется дефолтный порт 8080 под капотом Но мы его мапи для Person Service на 8070 для AP Gateway 8080 и для Address Service для на 8090 Соответственно что мы делаем мы сейчас выполняем команду docker compose Up - D - - Build Теперь мы проверяем что у нас были созданы наши образы То есть я пишу docker Image LS и мы видим что здесь Мы создали три образа Person Gateway persons Gateway persons persons и persons Address Давайте теперь мы запушил arf то есть Я создаю три репозитория Person Gateway Person Person и persons Address Итак здесь появляется первый сервис - это persons Address публичный создали далее мы добавляем ещё один репозиторий это Person Gateway тоже публичный и третий - это Service persons Person Таким образом мы с вами сейчас видим что у нас появились три новые репозитория это Person Person Person Gateway Person Address для каждого сервиса свой отдельный artfactory теперь уже самом коде Мы сначала создаём теги То есть я пишу Dock Tag persons Person Давайте Person Address начнём Person Address тегаем на prite Person это сделали Теперь мы запу это на наш artifactory то есть docker Push Address теперь Мы выполняем команду следующую теперь выполняем команду г Person Gateway и тегаем его на prite persons Gateway происходит пуш нашего образа далее мы делаем ещё один тег и соответственно и этот образ Мы пушим в наш артефакто Таким образом мы с вами видим что у нас есть первый репозиторий addresses в котором уже есть образ latest У нас есть второй репозиторий в котором есть образ latest и есть третий репозиторий в котором также есть образ latest Итак мы 2 здесь мы видим что были добавлены следующие файлы у на есть пакет и внутри него у нас есть два файлика то есть пер и Давайте посмотрим здесь мы создаём стандартный даём ему имя далее После этого у нас есть интересная вещь вот здесь где идут контейнеры мы создаём не один контейнер а два То есть первый контейнер - это Address далее У него идёт образ persons Address latest далее мы передаём переменный среды в которой мы отдаём Person Service URL localhost 8080 и Север Port мы даём 8090 далее У нас появляется здесь Person и мы ему даём образ Person Person late соответственно сервис работает с этим дейм прокиды нам порт 890 по tcp и прокиды тип прокиды - это соответственно теперь можем сделать что мы с вами Заходим в консоль и выполняем команду apply ми F лучше будет даже зайти в кубете сначала а теперь нажать F Add serv Итак происходит запуск что ий были созданы Теперь мы проверяем что у нас поднялись поды Cu ctl Get pods смотрим Что контейнеры пока создаются Итак мы видим что поды были подняты и у нас всё сейчас работает соответственно Теперь мы можем проверить во-первых работу самого Add для этих целей я перехожу в наш postman и здесь я делаю вызов API Address какая-то цифра Нажимаю кнопочку S происходит запрос и здесь мы видим что данные были получены и как вы помните по логике в коде Address обращается к Person то есть здесь у нас всё работает то есть к адресу мы Обращаемся без каких-либо проблем теперь Давайте попробуем обратиться к самому Person сервису и как вы видите если мы Обращаемся Local Host 880 API V1 Person к которому мы и Обращаемся здесь то у нас ничего не получается это изза того что у нас есть только сетевое взаимодействие внешнее проки для Add сервиса но уже AD с взаимодействует внутри нашего пода Итак мы переключаем на ветку п 3 Здесь вы видите что у нас добавились новые файлы это добавление ресов и нов отдельных файлив то есть соответственно давайте для начала снем де который уже у на есть то есть я делаю сонно мы делаем удаление Delete deployment этот далее У нас идёт ql Get serv мы снес Address Service Cub C Delete serv Address отлично и соответственно теперь проверяем ql Get pods подов нет супер соответственно теперь у нас с вами есть следующие фалы То есть первый фай - это Person dey в этом случае у на здесь есть у нас создаётся deployment который взаимодействует с нашим Person Person образом на основании него поднимается одна реплика далее У нас с вами есть Person Service и здесь мы видим что у нас появляется тоже Application Person но здесь тип у нас идёт cler IP То есть это как раз значит что внутри кластера мы доступны далее мы с вами идём в Address deployment File и здесь мы опять-таки взаимодействуем с нашим Address деплоймент мы создадим и берём точнее на основании образа Person Address latest и вот здесь мы используем переменно среды следующую То есть тут идёт Person serv default 880 интересная вещь Потом посмотрим Откуда она у нас всё-таки берётся и сервер пор будет 8090 чтобы мы сам Add сер запустили на порту 890 отличненько Далее идм в Address тут уже прокиды идт соответственно мы сможем об к нашему Address сервису теперь делаем следующее То есть я теперь снова делаю Cub ctl apply - F М что мы сделаем здесь мы берём Address deployment yel здесь мы берём Address Service yaml здесь мы берём Person deployment yaml и ми F Person Service Person Service yaml Отлично мы видим что всё было создано ошибок сейчас нет соответственно теперь Мы выполняем команду minic Service Person serv и в соседнем окошке Мы тоже выполняем команду minic сес Address сес Cube Address поправка сес Address Service Итак Всё теперь мы запускаем его тоже отличненько И теперь мы ещё можем проверить Какие сервисы У нас есть Давайте Cu C Get Services отлично Какая же здесь особенность Итак Теперь мы берём наш порт который у нас появился для нашего Address сервиса то есть здесь мы берём наш Address сервис копируем вот этот порт и переходим в postman Итак Теперь мы делаем вызов на новый порт и видим что здесь мы получили данные у нас всё корректно работает всё отлично теперь Давайте попробуем сделать обращение на наш Person и ВМ мы уже получаем доступ потому что мы находимся внутри единого кластера наша машинка и мы можем сюда обратиться то есть Таким образом мы с вами подняли уже приложение Person к которому можем обратиться и Извне и из нашего кластера и также через Address сес Итак здесь важный момент что обратиться к сервису Мы можем по такому имени то есть имя сервиса потом точка Деол Кроме этого мы можем здесь использовать следующую запись то есть вместо вот Person можем поставить здесь переменную окружение под названием Person Service serv Host почему это должно заработать Это должно заработать по следующей причине мы делаем с вами Cub ctl gets у нас с вами есть Address здесь я делаю следующее я зайду в интерактивном режиме и посмотрю переменный среды нашего Address деплой соответственно Cub ctl EX мину it интерактивный диник Нашего Нашего пода минус Минус ф мы запускаем и здесь если мы постараемся найти вот эту переменную То есть я вбил вот наш хост то есть здесь внутренний айпишник смап с нашим сес Host соответственно это будет у нас корректно всё работать Итак мы с вами переключаем на бранч Step 5 в рамках этого бранча мы с вами добавили в пакет kubernetes два файла это Gateway deployment который по классике стартует на основании об своего то есть Gateway мы передам ему переменные среды Person serv URL и Server 8070 и в Gateway serv Мы видим что у нас ста на основании приложения Gateway прокиды через и протокол tcp соответственно Теперь мы с вами Заходим в пакет cuber делаем apply - F Gateway Fate проверяем что поды уже подняты Cub ctl Get pods стартанул И теперь мы можем запустить это через куб соответственно идёт Мику сервис Gateway сервис так происходит Старт мы скопировали вот этот порт который у нас здесь есть и идём в наш postman здесь мы делаем запрос соответственно мы можем получить данные от персона по одному персону и также по всем соответственно мы с вами смогли поднять приложение Gateway которое также взаимодействует с нашим Person сервисом потому что у него идёт тип прокиды Нея через кластер IP А так как Gateway находится в том же кластере соответственно Мы можем с ним взаимодействовать вывод в данном курсе Мы изучили теоретические основы и получили практические навыки работы с docker и кубес Мы научились работать не только с локальным окружением но и взаимодей с облачными сервисами такими как dockerhub и aws опять-таки вместо Reg dockerhub можете использовать любой другой концепция не изменится aws можно использовать другой Облачный сервис который даёт вам возможность поднять eas 2 instance то есть какую-то машинку и подключиться к ней по ssh далее мы разобрали с вами внутренние устройства как Докера так и курне и также научились настраивать что я хочу посоветовать тем рекомендациям которые были в начале то есть не просто просмотреть залпом а просматривать внимательно повторять то что было сделано в коде выполнять все команды смотреть что всё работает и дальше переключаться на следующую ветку потому что все репозитории Они будут залиты на github у вас будут ссылки на эти репозитории и соответственно вы сможете любой из них подтянуть и работать если что-то не можете поднять локально без Докера то это не критично Это было просто показано для того чтобы вы видели что поведение при локальном старте и через докер не особо отличается а местами не отличается совсем также я очень рекомендую ознакомиться с документацией ссылку ссылки на которую Также будут под этим видео потому что в документации описание наиболее полное и наиболее актуальное там же оно постоянно обновляется обратная связь если у вас возникнут вопросы предложения жалобы пожелания то Пожалуйста пишите комментарии под видео и также по любым вопросам Можете написать мне на эту почту prl a& yahoo.com Я благодарен вам за ваш время желаю вам успехов и до новых встреч Всем пока