Обзор Docker

Docker - это открытая платформа для разработки, доставки и запуска приложений. Docker позволяет отделить приложения от инфраструктуры, что позволяет быстро создавать программное обеспечение. С помощью Docker вы можете управлять инфраструктурой так же, как и приложениями. Используя преимущества методологии Docker для быстрой доставки, тестирования и развертывания кода, вы можете значительно сократить время между написанием кода и его запуском в производство.

Платформа Docker

Docker предоставляет возможность упаковывать и запускать приложения в слабо изолированной среде, называемой контейнером. Изоляция и безопасность позволяют запускать множество контейнеров одновременно на одном хосте. Контейнеры легковесны и содержат все необходимое для работы приложения, поэтому вам не нужно полагаться на то, что в данный момент установлено на хосте. Вы можете легко делиться контейнерами во время работы и быть уверенным, что все, с кем вы делитесь, получат тот же контейнер, который работает точно так же.

Docker предоставляет инструменты и платформу для управления жизненным циклом ваших контейнеров:

  • Разработайте свое приложение и его вспомогательные компоненты с помощью контейнеров.

  • Контейнер становится единицей для распространения и тестирования вашего приложения.

  • Когда вы будете готовы, разверните приложение в производственной среде в виде контейнера или оркестрованной службы. Это работает одинаково независимо от того, является ли ваша производственная среда локальным центром обработки данных, облачным провайдером или гибридом этих двух систем.

Для чего можно использовать Docker?

Быстрая, последовательная доставка ваших приложений

Docker оптимизирует жизненный цикл разработки, позволяя разработчикам работать в стандартизированных средах с использованием локальных контейнеров, которые предоставляют ваши приложения и сервисы. Контейнеры отлично подходят для рабочих процессов непрерывной интеграции и непрерывной доставки (CI/CD).

Рассмотрим следующий пример сценария:

  • Ваши разработчики пишут код локально и делятся своей работой с коллегами с помощью контейнеров Docker.

  • Они используют Docker для переноса приложений в тестовую среду и выполнения автоматизированных и ручных тестов.

  • Когда разработчики находят ошибки, они могут исправить их в среде разработки и перенести в тестовую среду для тестирования и проверки.

  • Когда тестирование завершено, донести исправление до клиента так же просто, как отправить обновленный образ в производственную среду.

Реагирующее развертывание и масштабирование

Платформа Docker на основе контейнеров обеспечивает высокую переносимость рабочих нагрузок. Контейнеры Docker могут работать на локальном ноутбуке разработчика, на физических или виртуальных машинах в центре обработки данных, на облачных провайдерах или в смешанных средах.

Переносимость и легкость Docker также позволяют легко динамически управлять рабочими нагрузками, наращивая или сворачивая приложения и сервисы в зависимости от потребностей бизнеса практически в режиме реального времени.

Выполнение большего количества рабочих нагрузок на том же оборудовании

Docker - легкий и быстрый. Он представляет собой жизнеспособную, экономически эффективную альтернативу виртуальным машинам на базе гипервизора, что позволяет использовать больше серверных мощностей для достижения бизнес-целей. Docker идеально подходит для сред высокой плотности, а также для малых и средних развертываний, где вам нужно сделать больше при меньших ресурсах.

Архитектура Docker

Docker использует архитектуру клиент-сервер. Docker клиент общается с Docker демоном, который выполняет тяжелую работу по созданию, запуску и распространению ваших контейнеров Docker. Клиент и демон Docker могут работать на одной системе, или вы можете подключить клиента Docker к удаленному демону Docker. Клиент Docker и демон взаимодействуют с помощью REST API, через сокеты UNIX или сетевой интерфейс. Еще один клиент Docker - Docker Compose, который позволяет работать с приложениями, состоящими из набора контейнеров.

Docker Architecture Diagram

Демон Docker

Демон Docker (dockerd) прослушивает запросы API Docker и управляет объектами Docker, такими как образы, контейнеры, сети и тома. Демон также может взаимодействовать с другими демонами для управления службами Docker.

Клиент Docker

Клиент Docker (docker) - это основной способ взаимодействия многих пользователей Docker с Docker. Когда вы используете такие команды, как docker run, клиент отправляет эти команды в dockerd, который их выполняет. Команда docker использует API Docker. Клиент Docker может взаимодействовать с несколькими демонами.

Docker Desktop

Docker Desktop - это простое в установке приложение для среды Mac, Windows или Linux, которое позволяет создавать и совместно использовать контейнеризированные приложения и микросервисы. Docker Desktop включает в себя демон Docker (dockerd), клиент Docker (docker), Docker Compose, Docker Content Trust, Kubernetes и Credential Helper. Для получения дополнительной информации смотрите Docker Desktop.

Реестры Docker

В реестре Docker хранятся образы Docker. Docker Hub - это публичный реестр, который может использовать любой желающий, а Docker по умолчанию настроен на поиск образов на Docker Hub. Вы даже можете запустить свой собственный частный реестр.

Когда вы используете команды docker pull или docker run, необходимые образы извлекаются из настроенного реестра. Когда вы используете команду docker push, ваш образ выталкивается в настроенный реестр.

Объекты Docker

Когда вы используете Docker, вы создаете и используете образы, контейнеры, сети, тома, плагины и другие объекты. Этот раздел представляет собой краткий обзор некоторых из этих объектов.

Образы

Образ - это шаблон, доступный только для чтения, с инструкциями по созданию контейнера Docker. Часто образ основан на другом образе с некоторыми дополнительными настройками. Например, вы можете создать образ, основанный на образе ubuntu, но устанавливающий веб-сервер Apache и ваше приложение, а также детали конфигурации, необходимые для работы вашего приложения.

Вы можете создавать собственные образы или использовать только те, которые созданы другими и опубликованы в реестре. Чтобы создать собственный образ, вы создаете Dockerfile с простым синтаксисом для определения шагов, необходимых для создания образа и его запуска. Каждая инструкция в Dockerfile создает слой в образе. Когда вы изменяете Dockerfile и перестраиваете образ, перестраиваются только те слои, которые изменились. Это часть того, что делает образы такими легкими, маленькими и быстрыми по сравнению с другими технологиями виртуализации.

Контейнеры

Контейнер - это запускаемый экземпляр образа. Вы можете создать, запустить, остановить, переместить или удалить контейнер с помощью Docker API или CLI. Вы можете подключить контейнер к одной или нескольким сетям, присоединить к нему хранилище или даже создать новый образ на основе его текущего состояния.

По умолчанию контейнер относительно хорошо изолирован от других контейнеров и хост-машины. Вы можете управлять тем, насколько изолированы сеть, хранилище или другие базовые подсистемы контейнера от других контейнеров или хост-машины.

Контейнер определяется его образом, а также любыми параметрами конфигурации, которые вы предоставляете ему при создании или запуске. Когда контейнер удаляется, все изменения его состояния, не сохраненные в постоянном хранилище, исчезают.

Пример команды docker run

Следующая команда запускает контейнер ubuntu, подключается интерактивно к вашей локальной сессии командной строки и запускает /bin/bash.

$ docker run -i -t ubuntu /bin/bash

При выполнении этой команды произойдет следующее (при условии, что вы используете конфигурацию реестра по умолчанию):

  1. Если у вас нет локального образа ubuntu, Docker извлекает его из настроенного реестра, как если бы вы запустили docker pull ubuntu вручную.

  2. Docker создает новый контейнер, как если бы вы выполнили команду docker container create вручную.

  3. Docker выделяет контейнеру файловую систему с возможностью чтения и записи в качестве последнего уровня. Это позволяет запущенному контейнеру создавать или изменять файлы и каталоги в своей локальной файловой системе.

  4. Docker создает сетевой интерфейс для подключения контейнера к сети по умолчанию, поскольку вы не указали никаких сетевых опций. Это включает в себя назначение IP-адреса контейнеру. По умолчанию контейнеры могут подключаться к внешним сетям, используя сетевое подключение хост-машины.

  5. Docker запускает контейнер и выполняет команду /bin/bash. Поскольку контейнер работает в интерактивном режиме и подключен к вашему терминалу (благодаря флагам -i и -t), вы можете вводить данные с клавиатуры, а вывод записывается в журнал вашего терминала.

  6. Когда вы вводите exit для завершения команды /bin/bash, контейнер останавливается, но не удаляется. Вы можете запустить его снова или удалить.

Базовая технология

Docker написан на языке программирования Go и использует несколько возможностей ядра Linux для обеспечения своей функциональности. Docker использует технологию под названием пространства имен для обеспечения изолированного рабочего пространства, называемого контейнером. Когда вы запускаете контейнер, Docker создает набор пространств имен для этого контейнера.

Эти пространства имен обеспечивают уровень изоляции. Каждый аспект контейнера работает в отдельном пространстве имен, и доступ к нему ограничен этим пространством имен.

Следующие шаги