Docker – это инструмент или программное обеспечение, которое позволяет создавать, тестировать и развертывать приложения. Docker хранит программное обеспечение в виде пакетов в стандартизированных единицах, называемых контейнерами (Container). Эти контейнеры (Container) содержат все необходимое для запуска приложения, например, библиотеки, системные инструменты, код программы и команды для его выполнения. С помощью Docker вы можете развертывать свои приложения в любой среде и быть уверены в их правильной работе.
В общем, Docker можно рассматривать как инструмент виртуализации, в котором приложениям разрешается совместно использовать ядро операционной системы вместо создания виртуализированной среды и установки операционной системы на нее. Эта конструкция делает контейнеры (Container) более легкими, быстрыми и портативными, при этом каждый из них работает в изолированной среде.
Docker написан на языке программирования Go, поддерживает различные операционные системы, такие как Windows, macOS и Linux, предотвращает конфликты между выполняющимися кодами путем их изоляции и, в отличие от других инструментов виртуализации, таких как VMware, выполняет свои операции непосредственно на операционной системе.
Сравнение условий работы, до и после использования Docker
Без использования Docker мы сталкиваемся с различными проблемами, такими как сложности при развертывании приложений в виртуализированных средах, проблемы с их конфигурацией, сложностями с обеспечением необходимых зависимостей и т.д.

Каково решение Docker для этой проблемы?
Docker решает эту проблему за счет оптимизации сред выполнения приложений и создания всех компонентов приложения и его зависимостей в контейнерах (Containers).
Docker добавляет приложениям возможность переносимости (portability) и позволяет им запускаться в различных средах без повторной настройки.
Он также обеспечивает стабильность приложений, гарантируя одинаковое поведение в стадиях разработки, тестирования и в конечном продукте.
Облегчение (lightweight) приложения – еще одна характеристика, которую Docker привносит в наши приложения.
Кроме того, Docker повышает производительность и масштабируемость, обеспечивает уверенность в потреблении ресурсов сервера, быстрое выполнение и развертывание в других сервисах.

Компоненты Docker
- Docker Engine: Docker Engine – это центральный компонент, отвечающий за создание и управление контейнерами (Containers).
- Docker Image: Этот файл представляет собой шаблон только для чтения, который используется для создания контейнеров (Containers), обеспечения последовательности выполнения кода и предоставления необходимых зависимостей.
- Docker Hub: Это облачный сервис, который можно использовать для обмена и поиска различных Docker Image.
- Dockerfile: Это файл, в котором описан процесс создания образа (Image).
- Docker Registry: Это система хранения, в которой можно хранить Docker Image как в приватном (Private), так и в публичном (Public) доступе.
Docker Engine
Docker Engine – это центральный компонент, который позволяет Docker запускать контейнеры. Он использует клиент-серверную архитектуру и отвечает за создание, запуск и управление контейнерами.
- Docker Engine Daemon – это компонент, который обрабатывает запросы, поступающие через API, и управляет образами (Images), контейнерами и различными сетями.
- CLI-часть Docker, или Docker Client, взаимодействует с Docker Daemon через REST API. Этот компонент предоставляет среду выполнения, в которой Docker Images инстанцируются внутри контейнеров.

Без Docker Engine образы (Images) не могут быть созданы или запущены.
В целом, процесс работы Docker Engine выглядит следующим образом:
- Раздел Client отправляет команды Docker.
- Раздел Daemon получает эти команды и выполняет операции, связанные с контейнерами.
- И здесь REST API является интерфейсом, который обеспечивает связь.
Docker Engine (механизм Docker) – это процесс, который обеспечивает контейнеризацию и управление ими, устанавливая связь между Docker Client (клиентом Docker) и Docker Daemon (демоном Docker).
Dockerfile
Dockerfile фактически использует язык, специфичный для предметной области (DSL – Domain Specific Language), и содержит команды, необходимые для создания Docker Image. Dockerfile определяет, как и в каких этапах должен выполняться процесс создания Image. При создании приложения необходимо правильно написать Dockerfile, поскольку Docker Daemon (демон Docker) выполняет все команды в нем сверху вниз.
Dockerfile по сути является исходным кодом (Source Code) Image.
Docker Daemon (демон Docker), который обычно называют просто «Docker», является фоновым сервисом, отвечающим за управление Docker-контейнерами в системе.
Этот файл является текстовым документом, содержащим набор необходимых команд, которые при выполнении создают Docker Image. Фактически, Docker Image создается с использованием Dockerfile.

Архитектура и принцип работы Docker
Docker использует клиент-серверную архитектуру (client-server). В этой структуре Docker Client взаимодействует с Docker Daemon, который отвечает за создание, запуск и распространение Docker-контейнеров.
Docker Client может выполняться на той же системе, что и Daemon, или подключаться к Docker Daemon удаленно.
Взаимодействие между Docker Client и Docker Daemon осуществляется через REST API, который доступен либо через UNIX socket, либо через сеть.

Docker CLI
Интерфейс командной строки Docker (Command-line Interface) – это инструмент для непосредственного взаимодействия с Docker.
К наиболее распространенным и часто используемым командам этого интерфейса относятся: docker run, docker build, docker pull
Docker REST API
Этот раздел представляет собой HTTP API, который используется Docker CLI и другими инструментами.
Этот API облегчает связь между Docker Client и Docker Daemon.
Docker Daemon
Docker Daemon отвечает за управление образами (Images), контейнерами, сетями и томами (Volumes).
Этот сервис считается основным ядром Docker и управляет всеми объектами, связанными с Docker.
High-Level Runtime
Этот раздел управляет жизненным циклом контейнеров.
Его задачи включают создание (create), запуск (start), остановку (stop) и удаление (delete) контейнеров.
Docker Image
Docker Image по сути является файлом, состоящим из нескольких слоев, который содержит необходимые команды для создания и запуска Docker-контейнера.
Этот образ действует как исполняемый пакет и содержит все необходимое для запуска приложения, такое как: код программы, среда выполнения (Runtime), библиотеки, переменные окружения и настройки.
Принцип работы:
- Image определяет, как должен быть создан контейнер.
- Указывает, какие программные компоненты будут запущены и как будут настроены.
- Когда Image запускается, результатом является контейнер (Container).
Связь с контейнерами:
Docker-контейнер
Docker-контейнер – это, по сути, легковесная, исполняемая и независимая версия Docker Image.
Контейнер включает в себя код приложения вместе со всеми его зависимостями и выполняется в изолированной среде.
Контейнеры позволяют приложениям работать быстрее, согласованнее и надежнее в различных средах. Будь то ноутбук разработчика, тестовые серверы или производственная среда.
Принцип работы:
- Когда Docker Image запускается, на его основе создается контейнер.
- Контейнер выполняется как изолированный процесс на хост-машине (Host Machine), но разделяет ядро операционной системы хоста.
Пример:
Предположим, у вас есть образ (Image) операционной системы Ubuntu, на котором установлен NGINX Server.
Когда вы запускаете этот образ с помощью команды docker run:
Создается контейнер, и NGINX Server будет запущен внутри этого контейнера на Ubuntu.
Что такое Docker Hub?
Docker Hub – это облачный сервис репозитория, который позволяет пользователям загружать (Push) свои Docker Image или скачивать (Pull) их в любое время и из любого места через интернет.
В целом, Docker Hub значительно упрощает поиск и повторное использование образов (Images).
Этот сервис предоставляет возможности хранения образов (Images) как в приватном (Private), так и в публичном (Public) режиме, чтобы вы могли управлять ими и делиться ими с другими.
Важность Docker Hub
- Большинство команд DevOps используют Docker Hub как часть своего цикла разработки и развертывания.
- Это открытый исходный код и бесплатный инструмент, который можно использовать на всех операционных системах.
- Он функционирует аналогично облачному хранилищу, где хранятся образы (Images) и их можно загрузить (Pull) при необходимости.
Команды Docker
Благодаря представлению набора необходимых команд Docker, этот инструмент стал мощным программным обеспечением для упрощения управления контейнерами.
Эти команды помогают создать унифицированный и плавный процесс разработки и развертывания.
Распространенные команды Docker:
Docker Run
Используется для запуска контейнеров из образов (Images).
В этой команде можно указать различные опции, связанные со средой выполнения (Runtime) и настройками запуска контейнера.
Docker Pull
Эта команда загружает образы (Images) из реестра контейнеров, такого как Docker Hub, и сохраняет их в локальной системе.
Docker ps
Используется для отображения запущенных контейнеров.
Предоставляет важную информацию, такую как ID контейнера, используемый образ и статус контейнера.
Docker Stop
Эта команда останавливает запущенные контейнеры и корректно завершает процессы внутри них.
Docker Start
Используется для повторного запуска ранее остановленных контейнеров, возобновляя их работу с предыдущего состояния.
Docker Login
Используется для входа в Docker Registry и обеспечивает доступ к приватным репозиториям.
Docker Engine (Механизм Docker)
Программное обеспечение, отвечающее за хостинг и выполнение контейнеров, называется Docker Engine (Механизм Docker).
Docker Engine представляет собой приложение, основанное на архитектуре Client-Server.
Этот механизм состоит из трех основных компонентов:
Server (Daemon)
Сервер или демон (Daemon) – это часть, отвечающая за создание и управление Docker Images, контейнерами, сетями и Volumes.
Эта часть работает в фоновом режиме и составляет основное ядро операций Docker.
REST API
Этот API определяет, как приложения могут взаимодействовать с сервером Docker.
REST API предоставляет правила и пути, с помощью которых можно отдавать команды демону Docker для выполнения определенных задач.
Client (CLI)
Клиент – это интерфейс командной строки Docker, который позволяет взаимодействовать с движком Docker (Docker Engine) путем выполнения его команд.
Пользователи могут использовать этот инструмент для выполнения команд, таких как создание образов (Image), запуск контейнеров и управление ресурсами.