@@ -960,6 +960,172 @@ jobs:
960
960
чаще всё-таки встречаются микросервисы, но это не машает, например, инстаграму, работать как монолит. В идеале оставьте
961
961
вопрос архитекруты, для архитекторов, если есть такая возможность
962
962
963
-
964
963
# # Docker
965
964
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