мяучие правила:
1. обезличено
2. термины !!!
3. объяснение как для детей/уток
Материалы для себя:
https://ru.wikipedia.org/wiki/Docker
https://habr.com/ru/company/southbridge/blog/515508/
https://www.hava.io/blog/cattle-vs-pets-devops-explained
https://habr.com/ru/post/253877/
Каток привет, это я, твой единственный подписчик. Мне кажется можно приложить аналгоию с домиками, когда будешь рассказывать. Dockerfile - чертёж, контейнер - дом, базовый образ - фундамент и т.п.
# Docker: сага о контейниризации

----
<div class="TOC" >
О чем сегодня будем говорить:
<p>
</p>
</div>
<style>
.TOC {
font-size: 26px;
font-weight: 550;
color: #270469;
text-align: left;
</style>
[TOC]
----
## Что такое Docker и почему нам стоит знать что это?

### А причём тут Домашние животные и контейнеры?
Чтобы понять суть докера, сперва углубимся в историю и разберём простейший пример реальной жизни.
Раньше доставка грузов по всему миру осуществлялась в деревянных коробках, бочках и прочих ёмкостях. Проблема была в том, что все они были разных размеров и форм, что затрудняло перенос. Разные корабли использовались для разных типов товаров. Для разгрузки требовалась уйма времени, что увеличивало стоимость доставки.
Никто не мог ускорить процесс, ведь для разгрузки требовались люди и специальная техника. Всё это стоило денег и не давало большого прироста в скорости транспартировок.
Все было достаточно печально до тех пор, пока не изобрели контейнеры. Те самые универсальные блок-контейнеры, что сегодня можно встретить на любом корабле.
Человек, который придумал такую оптимизацию, заработал кучу денег, а индустрия выиграла в долгосрочной перспективе после внедрения этих контейнеров повсеместно. Теперь не важно что конкретно находится внутри самой ёмкости, так как сама ёмкость одной формы. Люди смогли построить по всему миру одинаковые краны для разгрузки, перестать использовать людской труд и переключиться на одинаковые машины для перевозки. Тем самым сроки разгрузки и погрузки сократились до минимума, а кол-во затрат значительно сократилось.
***
((? Возможно сильное углубление в именно код /серверную логику. Мб убрать что-то одно?))
Но при чем здесь Докер? Докер сделал такую же революцию, но в сфере разработки.
Ранее для работы и разработки проекта требовалось установить много разных технологий и настроить все на устройстве. Например, вы верстаете сайты. Для работы вам надо установить себе язык программирования, веб сервер, библиотеки для работы с HTML страничками и так далее. Если вы захотите сделать ещё один сайт, но использовать другой веб сервер/язык программирования, то вам придётся тоже всё это устанавливать. И не факт, что не возникнут конфликты версий.
Затем вам нужно будет показать результаты и запустить сайт в интернете.Для этого надо загрузить результаты работы на удалённый сервер и повторить процесс, настроив всё необходимое для работы в сети Internet. Если нужно будет что-то поменять в сайте, то вероятно весь процесс придётся повторять заново. У вас могут прийти обновления на сервер, и тогда возможно часть сайта не будет работать.
Всё это напоминает отношение с проектом как с домашним животным. Ухаживая за любимыми котами, вам каждому нужно уделять внимание, каждого кормить едой которая ему нравится. Вы беспокоитесь из-за проблем со здоровьем ваших домашних животных и приводите их к врачу.
Докер кардинально изменил подход, предложив систему контейнеров. Представим что вы создали проект и сам проект может быть написан на разных технологиях: Питон, Джава, С++, JS. Вы запихиваете ваше приложение в контейнер, а вместе с ним добавляете всё необходимое окружение: среду выполнения, сервер, различные пакеты, приложения и всё остальное. Далее при помощи специальных команд вы можете выгрузить ваш проект (контейнер) и после передать его клиенту, начальнику или другому разработчику.
Это уже в свою очередь больше похоже на отношения фермера со своим скотом. Однажды построенная ферма может уместить в себе все множество животных. Ты не заботишься о каждом отдельно, а поддерживаешь работу фермы в целом. По чертежу этой фермы и бизнес плану можно легко машстабироваться.
### Так что же значит Docker
Таким образом, Докер стал революционной технологией за счёт того, что предложил разработчикам и администраторам единый вариант обращение с проектами - контейнеры. Внутри контейнера имеется всё необходимое для запуска программы, при этом контейнеры запускаются одним и тем же способом.
### Зачем это специалисту ИБ
Многие сейчас могут задать вопрос:"А зачем это знать пентестеру вроде меня? Технологии есть технологии, неважно каким образом они запускаются".
***
## Немного терминологии
Docker: клиент-серверная платформа виртуализации
Docker Hub: сервис для распространения и управления docker контейнерами.
Docker Daemon: серверная часть Docker. Система запускающая контейнеры. С пользователем напрямую не взаимодействует.
Docker Client/CLI: клиентская часть Docker. Инструмент общения с Docker Daemon.
Образ - Это по сути база нашего контейнера. Их можно разделить на 2 типа. Базовые и Модифицированные. Базовые обычно предоставляются производителями операционных систем, компиляторов и тому подобного. Вот самые простые примеры из топа [DockerHub](https://hub.docker.com/search?q=).

Модифцированные образы отличаются от базовых значительно большим весом и колличяеством предварительных настроек. Чаще всего это целые инстурменты, завернутые в Docker, с большим гайдом по запуску. В качестве примера можно привести веб-сканер [jock3r](https://hub.docker.com/r/koutto/jok3r/), тоже распространяемый через Dockerhub.

На практике такие образы при разработке таское особо не используются.
Чтобы скачать какой либо образ нужно использовать команду pull
```
docker pull ubuntu:latest
```
После двоеточия идёт тег образа, по умолчанию это latest - либо предлагаемый по умолчанию либо последний доступный. Обычно на странице образа указываются поддерживаемые теги. Лучше выбирать из них. В случае с теми же ubuntu лучше ориентироваться на lts релизы.

**Контейнер** - это в отлчии от образа не база, а уже готова единица приложения. Из одного образа можно собрать несколько контейнеров, работающих отдельно друг от друга. Отдельно контейнер можно запустить командой
```
docker run <имя образа>
```
Флаг *--name* позволяет здать имя. Посмотреть id контейнера можно командой docker ps.

Однако в контексте разработки тасков такой вариант запуска нам не подойдёт, потому что мы будем пользоваться _орекстратором_. Что это и зачем нам нужно расскажу позже.
Но тут стоит упомянуть важную опцию входа в уже рабочий контейнер, для этого нам нужна команда docker exec. Синтаксис следующий
```
docker exec -it <id-контейнера> <команда облочки>
```
it обозначает интерактивный ввод, если нужно одно действие, то флаг можно опустить. От id можно кстати ввести только первые 3 цифры, этого достаточно. Команда можент быть любой, но для интерактивной оболчки помимо флага интерактивного ввода нужно вызвать собственно оболочку. В случае с Ubuntu это может быть bash, у Alpine - ash. Если не уверены, то пишите sh - он есть везде.
**Volume** - Изначально докер контнейры задумывались эфимерными (контейнер умер? ничего, сам перезапустится и начнёт работу как ни в чём не бывало), но в реальности нам иногда приходится долгосрочно или краткосрочно хранить какие-либо вещи, будь то сессии пользователей или измненяемые конфиги. По умолчанию у контейнера есть собсвственная файловая система, которая с хостом не свзяана. Можно либо мануально копировать файлы при сборке или в уже запущенный контейнер (docker copy). Но для динамического доступа можно пробросить волум - Специальные папки, которые на хосте живут по пути */var/lib/docker/volumes/* .
**Network** - Это сеть для коммуникации между контейнерами. Если вдруг требуется, тут лучше примеры смотреть.
**Dockerfile** - Это сценарий сборки контейнера. Благодаря ним у нас есть возможность собирать свои модификации контейнеров. Важно сказать, что всегда обязательной строкой докерфайла является директива FROM, указывающая какой образ использовать в качестве основы. Также вместо файла сценария можно войти в работающий контейнер и дать комманду [*docker commit*](https://docs.docker.com/engine/reference/commandline/commit/), она зафиксирует измененённый контейнер как новый образ.
**Docker-compose.yml** - Конфигурация для орекстратора docker compose. Если Dockerfilе описывает как собирать образ, то docker-compose.уml показывает как ими управлять. В приложении не обзяательно должен быть один контейнер, так как хорошим тоном является разделние: 1 контейнер - 1 задача. То есть например у нас есть вебсервер Python и База данных Redis, которая хранит куки для веб таска в первом контейнере.
***
## История явления Докера народу
В 2006-2007 годах компанией Google был разработан механизм Process Containers (позднее переименованный в cgroups), который позволил ограничить и изолировать использование группой процессов ЦПУ, ОЗУ и др. аппаратных ресурсов. В 2008 году функционал cgroups был добавлен в ядро Linux. Достаточная функциональность для полной изоляции и безопасной работы контейнеров была завершена в 2013 году с добавлением в ядро пространства имен пользователей – user.
В 2008 году была представлена система LXC (LinuX Containers), которая позволила запускать несколько изолированных Linux систем (контейнеров) на одном сервере. LXC использовала для работы механизмы изоляции ядра – namespaces и cgroups. В 2013 году на свет появилась платформа Docker, невиданно популяризовавшая контейнерные технологии за счет простоты использования и широкого функционала. Изначально Docker использовал LXC для запуска контейнеров, однако позднее перешел на собственную библиотеку libcontainer, также завязанную на функционал ядра Linux. Наконец, в 2015 появился проект Open Container Initiative (OCI), который регламентирует и стандартизирует развитие контейнерных технологий по сей день.
## Как работает?
Docker Daemon
Docker CLI
Docker Engine
Docker registry
Dockerfile
Image
Container
## Установка
## РАБОТАЕМ
### Собираем вебчик
### Юзаем настроенные инструменты
## Про безопасность
## Оркестрация
Swarm, Kubernetes, podman
***
# Практика
***
# Курс(Ы)
***
# Домашка (по желанию)
***
## **СПАСИБО ВАМ ЗА ВНИМАНИЕ, надеюсь было понятно и полезно! (не забывайте практиковаться)**
Дальше....
