@@ -960,6 +960,172 @@ jobs:
960960чаще всё-таки встречаются микросервисы, но это не машает, например, инстаграму, работать как монолит. В идеале оставьте
961961вопрос архитекруты, для архитекторов, если есть такая возможность
962962
963-
964963# # Docker
965964
965+ Кто такой докер?
966+
967+ 
968+
969+ Docker — один из самых известных инструментов по работе с контейнерами.
970+
971+ Давайте разберёмся кто такие контейнеры.
972+
973+ Контейнеры — это способ стандартизации развертки приложения и отделения его от общей инфраструктуры. Экземпляр
974+ приложения запускается в изолированной среде, не влияющей на основную операционную систему.
975+
976+ Разработчикам не нужно задумываться, в каком окружении будет работать их приложение, будут ли там нужные настройки и
977+ зависимости. Они просто создают приложение, упаковывают все зависимости и настройки в некоторый единый образ. Затем этот
978+ образ можно запускать на других системах, не беспокоясь, что приложение не запустится.
979+
980+ 
981+
982+ Docker — это платформа для разработки, доставки и запуска контейнерных приложений. Docker позволяет создавать
983+ контейнеры, автоматизировать их запуск и развертывание, управляет жизненным циклом. Он позволяет запускать множество
984+ контейнеров на одной хост-машине.
985+
986+ # ## Docker решает проблемы зависимостей и рабочего окружения
987+
988+ Контейнеры позволяют упаковать в единый образ приложение и все его зависимости : библиотеки, системные утилиты и файлы
989+ настройки. Это упрощает перенос приложения на другую инфраструктуру.
990+
991+ Например, разработчики создают приложение в системе разработки — там все настроено, приложение работает. Когда оно
992+ готово, его нужно перенести в систему тестирования, а затем в продуктивную среду. Если в одной из них нет нужной
993+ зависимости, приложение не будет работать. Программистам придется отвлечься от разработки и совместно с командой
994+ поддержки разобраться в ситуации.
995+
996+ В контейнерах такой проблемы нет, так как они содержат в себе все необходимое для запуска приложения. Специалисты
997+ занимаются разработкой, а не решением инфраструктурных проблем.
998+
999+ # ## Изоляция и безопасность
1000+
1001+ Контейнер — это набор процессов, изолированных от основной операционной системы. Приложения работают только внутри
1002+ контейнеров и не имеют доступа к основной операционной системе. Это повышает безопасность приложений:они не смогут
1003+ случайно или умышленно навредить основной системе. Если приложение в контейнере завершится с ошибкой или зависнет, это
1004+ никак не затронет основную ОС.
1005+
1006+ # ## Ускорение и автоматизация развертывания приложений и масштабируемость
1007+
1008+ Контейнеры упрощают развертывание приложений. В классическом подходе для установки программы нужно совершить несколько
1009+ действий : выполнить скрипт, изменить файлы настроек и так далее. В этом процессе не исключена вероятность человеческой
1010+ ошибки : пользователь запустит скрипт два раза, перепутает последовательность или что-то не поймет. Контейнеры позволяют
1011+ полностью автоматизировать этот процесс, так как включают в себя все нужные зависимости и порядок выполнения действий.
1012+
1013+ Также контейнеры упрощают развертывание на нескольких серверах. В классическом подходе для того, чтобы развернуть одно и
1014+ то же приложение на нескольких машинах, нужно будет повторять одни и те же действия. Контейнеры избавляют от этой
1015+ рутинной работы и позволяют автоматизировать развертывание.
1016+
1017+ 
1018+
1019+ # ## Контейнеры приближают к микросервисной архитектуре
1020+
1021+ Контейнеры хорошо вписываются в микросервисную архитектуру. Это подход к разработке, при котором приложение разбивается
1022+ на небольшие компоненты, по возможности независимые. Обычно противопоставляется монолитной архитектуре, где все части
1023+ системы сильно связаны друг с другом.
1024+
1025+ Это позволяет разрабатывать новую функциональность быстрее, ведь в случае с монолитной архитектурой изменение какой-то
1026+ части может затронуть всю остальную систему.
1027+
1028+ # ## Docker compose — одновременно развернуть несколько контейнеров
1029+
1030+ Docker-compose позволяет разворачивать и настраивать несколько контейнеров одновременно. Например, для веб-приложения
1031+ нужно развернуть стек LAMP : Linux + Apache, MySQL, PHP. Каждое из приложений — это отдельный контейнер для ОС Linux. Но
1032+ в этой ситуации нам нужны именно все контейнеры вместе, а не отдельно взятое приложение. Docker-compose позволяет
1033+ развернуть и настроить все приложения одной командой, а без него пришлось бы разворачивать и настраивать каждый
1034+ контейнер отдельно.
1035+
1036+ # ## Хранение данных в Docker
1037+
1038+ Одна из главных особенностей контейнеров — эфемерность. Это означает, что контейнеры могут быть в любой момент
1039+ остановлены, перезапущены или уничтожены. При этом все накопленные данные в контейнере будут потеряны. Поэтому
1040+ приложения нужно разрабатывать так, чтобы они не полагались на хранилище данных в контейнере, это называется принципом
1041+ Stateless.
1042+
1043+ Это хорошо подходит для приложений или сервисов, которые не сохраняют результаты своей работы. Например, функции расчета
1044+ или преобразования данных : им на вход поступил один набор данных, они его преобразовали или рассчитали и вернули
1045+ результат. Все, ничего никуда сохранять не нужно.
1046+
1047+ 
1048+
1049+ Но далеко не все приложения такие, и есть много данных, которые нужно сохранить. В контейнерах для этого предусмотрены
1050+ несколько способов.
1051+
1052+ Поэтому, я рекомендую использовать внешние базы данных для реальной разработки, ведь неважно откуда будет запрос, с
1053+ локали, сервера или докера.
1054+
1055+ # ## Архитектура (компоненты) Docker
1056+
1057+ # ### Docker daemon
1058+
1059+ Это некоторый резидентный процесс, который запущен на хост-машине постоянно. Он владеет всей инфраструктурой, а также
1060+ предоставляет интерфейс взаимодействия с контейнерами, включающего создание и удаление, запуск и остановку.
1061+
1062+ В ранних версиях платформы Docker можно встретить упоминание о dockerd, но на текущий момент демоны уже успели разбиться
1063+ на отдельные проекты. Все чаще можно встретить его современника — containerd.
1064+
1065+ # ### Docker client (клиент)
1066+
1067+ Это интерфейс командной строки для управления Docker daemon. Мы пользуемся этим клиентом, когда создаем и разворачиваем
1068+ контейнеры, а клиент отправляет эти запросы в Docker daemon.
1069+
1070+ # ### Docker image (образ)
1071+
1072+ Это неизменяемый файл (образ), из которого разворачиваются контейнеры. Приложения упаковываются именно в образы, из
1073+ которых потом уже создаются контейнеры. В технической литературе можно также встретить описание image как шаблона
1074+ запуска процесса.
1075+
1076+ Приведем аналогию на примере установки операционной системы. В дистрибутиве (образе) ОС есть все, что необходимо для ее
1077+ установки. Но этот образ нельзя запустить, для начала его нужно «развернуть» в готовую ОС. Так вот, дистрибутив для
1078+ установки ОС — это образ, а установленная и работающая ОС — это контейнер. Но контейнеры обычно разворачиваются одной
1079+ командой — это намного проще и быстрее, чем установка ОС.
1080+
1081+ # ### Docker container (контейнер)
1082+
1083+ Это уже развернутое из образа и работающее приложение.
1084+
1085+ # ## Docker Registry
1086+
1087+ Это репозиторий с образами. Разработчики создают образы своих программ и выкладывают их в репозиторий, чтобы их можно
1088+ было скачать и воспользоваться ими. Распространенный публичный репозиторий — Docker Hub. В нем собраны образы множества
1089+ популярных программ или платформ : базы данных, веб-серверы, компиляторы, операционные системы и так далее. Также можно
1090+ создать свой приватный репозиторий, например внутри компании. Разработчики будут размещать там образы, которые будут
1091+ использоваться всей компанией.
1092+
1093+ # ## Dockerfile
1094+
1095+ Dockerfile — это инструкция для сборки образа. Это простой текстовый файл, содержащий по одной команде в каждой строке.
1096+ В нем указываются все программы, зависимости и образы, которые нужны для разворачивания образа.
1097+
1098+ Пример :
1099+
1100+ ` ` ` dockerfile
1101+ FROM python:3
1102+ COPY main.py /
1103+ CMD [ "python", "./main.py" ]
1104+ ` ` `
1105+
1106+ Первая строчка означает, что за основу мы берем образ с названием python версии 3 это называется базовый образ. Docker
1107+ найдет его в docker registry, скачает и будет использовать за основу. Вторая строчка означает, что нужно скопировать
1108+ файл main.py в корень файловой системы контейнера. Третья строчка означает, что нужно запустить python и передать ему в
1109+ качестве параметра название файла main.py.
1110+
1111+ # ## Основные команды
1112+
1113+ - Команда docker build читает dockerfile и собирает образ.
1114+
1115+ - Команда docker pull скачивает образ из docker registry. По умолчанию docker скачивает образы из публичного репозитория
1116+ Docker Hub. Но можно создать свой репозиторий и настроить докер, чтобы он работал с ним.
1117+
1118+ - Команда docker run берет образ и запускает из него контейнер.
1119+
1120+ # ## Docker compose
1121+
1122+ Докер компоуз это возможность запустить несколько контейнеров одновременно и зависимо друг от друга.
1123+
1124+ Именно таким способом запускается большинство проектов, так как одного образа обычно не достаточно.
1125+
1126+ Например, нам необходимо сразу запустить, `gunicorn`, `nginx`, `postgres`
1127+
1128+ К сожалению я не успел дописать и перевести эту часть лекции, так что если мы успели сюда добраться, то дальше будем
1129+ следовать вот этой статье без перевода
1130+
1131+ [Докер и джанго](https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/)
0 commit comments