---
# System prepended metadata

title: Docker

---

# Docker
## Теория
Простыми словами - Докер это инструмент, который позволяет разработчикам, системными администраторам и другим специалистам деплоить их приложения в песочнице (которые называются контейнерами), для запуска на целевой операционной системе, например, Linux. Ключевое преимущество Докера в том, что он позволяет пользователям упаковать приложение со всеми его зависимостями в стандартизированный модуль для разработки. В отличие от виртуальных машин, контейнеры не создают такой дополнительной нагрузки, поэтому с ними можно использовать систему и ресурсы более эффективно.
Что такое контейнер?
По сути контейнеры - это виртуальные машины, но на более низком уровне. Как раз за счет использования этих механизмов контейнеры потребляют меньше ресурсов по сравнению с виртуальной машиной.
![](https://i.imgur.com/NsW1r0X.png)
## Отличие образа(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
![](https://i.imgur.com/7KkBRmu.png)
**docker images** - просмотрим информацию о нашем скаченном образе:
![](https://i.imgur.com/SDouxyC.png)
**docker run -p 127.0.0.1:3306:3306 --name mariadb4 -e MARIADB_ROOT_PASSWORD=superpass -d mariadb** - запустим контейнер с пробросом порта 3306 наружу контейнера, именем  **mariadb** и root-паролем:
![](https://i.imgur.com/MpkAoyJ.png)
**docker ps** - посмотрим список запущенных котейнеров:
![](https://i.imgur.com/giy5Tg2.png)
**docker run --name adminer4 --link mariadb4:db -p 8080:8080 -d adminer** - запустим еще один контейнер и свяжем его с предыдущим по сети.
![](https://i.imgur.com/t9la9mG.png)

**docker exec -ti adminer4 sh** - подключимся к контейнеру с помощью оболочки sh.
![](https://i.imgur.com/JeQL9qm.png)
**docker stop *имя запущенного контейнера*** - остановим наши запущенные контейнеры
![](https://i.imgur.com/0Qg3PMq.png)
**docker ps -a** - вывести все контейнеры(и запущенные, и не запущенные)
![](https://i.imgur.com/ffz2Bke.png)
**docker rm *имя контейнера*** -- удалить контейнер
![](https://i.imgur.com/TmRqHf1.png)


**docker rmi *имя образа*** -- удалить image
![](https://i.imgur.com/rC1CCXc.png)





