# Docker
## Теория
Простыми словами - Докер это инструмент, который позволяет разработчикам, системными администраторам и другим специалистам деплоить их приложения в песочнице (которые называются контейнерами), для запуска на целевой операционной системе, например, Linux. Ключевое преимущество Докера в том, что он позволяет пользователям упаковать приложение со всеми его зависимостями в стандартизированный модуль для разработки. В отличие от виртуальных машин, контейнеры не создают такой дополнительной нагрузки, поэтому с ними можно использовать систему и ресурсы более эффективно.
Что такое контейнер?
По сути контейнеры - это виртуальные машины, но на более низком уровне. Как раз за счет использования этих механизмов контейнеры потребляют меньше ресурсов по сравнению с виртуальной машиной.

## Отличие образа(image) от контейнера(container)
**Docker образ** — это шаблон (физически — исполняемый пакет), из которого создаются Docker-контейнеры. Образ хранит в себе всё необходимое для запуска приложения, помещенного в контейнер: код, среду выполнения, библиотеки, переменные окружения и конфигурационные файлы.
Docker-образ создаётся с помощью команды docker build, которая считывает конфигурацию создаваемого образа из специального конфигурационного файла — dockerfile.
В Dockerfile записываются команды и опции создания образа, а также некоторые настройки будущего контейнера, такие как порты, переменные окружения и другие опции.
Каждая команда записанная в dockerfile создаёт свой слой. Чем больше слоёв, тем дольше будет собираться образ и дольше загружаться контейнер. Финальный Docker-образ — это объединение всех слоев в один. Благодаря такому подходу можно переиспользовать уже готовые образа для создания новых образов.
**Контейнер** — это запущенный и изолированный образ с возможностью временного сохранения данных. Данные записываются в специальный слой «сверху» контейнера и при удалении контейнера данные также удаляются.
Для работы с контейнерами Docker предоставляет всего несколько основных команд: docker run/stop/restart.
## Установка для Debian 10
Для начала обновим наши репозитории:
> sudo apt update
И установим необходимые для скачивания утилиты:
> sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
Далее скопируем с сайта публичный gpg-ключ
> curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Добавляем директорию для скачивания docker-а
> sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Далее проверяем наличие в кеше и устанавливаем докер:
> apt-cache policy docker-ce
> apt install docker-ce
## Наиболее используемые опции в контейнере Docker:
**-ti** -- teletype (эмуляция входа в контейнер) и interactive (будем в эмуляции, пока сами не выйдем)
**-e** -- прописать переменные окружения в /etc/hosts
**-d** -- запустить в фоновом режиме (демоном)
**--link** -- подключение по сети двух контейнеров. Legacy функция.
**-p** - используется для проброса портов
**docker pull *имя образа*** - скачивание образа
**docker ps** - используется для просмотра активных контенеров
**docker run * -v** /home/mount/data:/var/lib/mysql/data -- примонтировать директорию на хосте в докер. В Docker Compose сначала указывается докер путь, потом хост путь.
**docker network ls** -- показать сети докера
**docker network inspect *имясети*** -- посмотреть конфигурацию сети
**docker rm** -- удалить контейнер
**docker rmi** -- удалить image
## Примеры
**docker pull mariadb** - скачиваем контейнер mariadb

**docker images** - просмотрим информацию о нашем скаченном образе:

**docker run -p 127.0.0.1:3306:3306 --name mariadb4 -e MARIADB_ROOT_PASSWORD=superpass -d mariadb** - запустим контейнер с пробросом порта 3306 наружу контейнера, именем **mariadb** и root-паролем:

**docker ps** - посмотрим список запущенных котейнеров:

**docker run --name adminer4 --link mariadb4:db -p 8080:8080 -d adminer** - запустим еще один контейнер и свяжем его с предыдущим по сети.

**docker exec -ti adminer4 sh** - подключимся к контейнеру с помощью оболочки sh.

**docker stop *имя запущенного контейнера*** - остановим наши запущенные контейнеры

**docker ps -a** - вывести все контейнеры(и запущенные, и не запущенные)

**docker rm *имя контейнера*** -- удалить контейнер

**docker rmi *имя образа*** -- удалить image
