Skip to content
This repository was archived by the owner on Jul 2, 2024. It is now read-only.

Commit 0805e3c

Browse files
add docker without example
1 parent eb6edd3 commit 0805e3c

File tree

1 file changed

+167
-1
lines changed

1 file changed

+167
-1
lines changed

lesson49.md

Lines changed: 167 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,172 @@ jobs:
960960
чаще всё-таки встречаются микросервисы, но это не машает, например, инстаграму, работать как монолит. В идеале оставьте
961961
вопрос архитекруты, для архитекторов, если есть такая возможность
962962

963-
964963
## Docker
965964

965+
Кто такой докер?
966+
967+
![](https://www.meme-arsenal.com/memes/6f421c7f32d39cac50982f0388050ca5.jpg)
968+
969+
Docker — один из самых известных инструментов по работе с контейнерами.
970+
971+
Давайте разберёмся кто такие контейнеры.
972+
973+
Контейнеры — это способ стандартизации развертки приложения и отделения его от общей инфраструктуры. Экземпляр
974+
приложения запускается в изолированной среде, не влияющей на основную операционную систему.
975+
976+
Разработчикам не нужно задумываться, в каком окружении будет работать их приложение, будут ли там нужные настройки и
977+
зависимости. Они просто создают приложение, упаковывают все зависимости и настройки в некоторый единый образ. Затем этот
978+
образ можно запускать на других системах, не беспокоясь, что приложение не запустится.
979+
980+
![](https://www.meme-arsenal.com/memes/c69830fc6e8ed01171ad3167fe4405ef.jpg)
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+
![](https://res.cloudinary.com/practicaldev/image/fetch/s--rI3jLpl3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w7hqdvkzj07mddjedq7u.jpg)
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+
![](https://preview.redd.it/3ds8gewnyxg51.jpg?auto=webp&s=a4d6e81743276487814f0e20934f3f8121b16611)
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

Comments
 (0)