Разработка современных приложений сильно отличается от программирования в прошлом. Раньше большинство инструментов и технологий не использовались при создании разнообразных виртуальных проектов. Сейчас разработчики нередко задействуют в процессе своей работы так называемые контейнеры. Так называются своеобразные системные образы, позволяющие запускать программный код в заранее сформированной и предсказуемой среде.
В качестве основного стандарта для формирования, запуска, а также обслуживания контейнеров выступает платформа Docker. Далее с ней предстоит познакомиться поближе. Необходимо выяснить, что это программное обеспечение собой представляет, какие особенности предусматривает. Также предстоит ознакомиться с азами работы с Docker, сервисами для работы с контейнерами и устройством Docker-образа. Эта информация пригодится как начинающим разработчикам, так и уже более опытным программистам.
История появления и развития
Docker – проект, который был начат в 2008 году. Он появился в качестве собственной внутренней разработки компании dotCloud во главе с Соломоном Хайксом. Целью данного проекта стало формирование публичной PaaS-платформы, которая поддерживала бы различные языки программирования. Вместе с Хайксом в первоначальной разработке Докеров значительный вклад внесли инженеры dotCloud Андреа Лудзарди, а также Франсуа-Ксавье Бурле.
К марту 2013 года Докер был опубликован под лицензией Apache 2.0, а в октябре компания dotCloud была переименована в Docker. Это связано с тем, что основной деятельностью организации стала работа над приложением для контейнеров.
В октябре 2013 года состоялся релиз Havana тиражируемой IaaS-платформы OpenStack которая стала поддерживать Докер (в качестве драйвера для OpenStack Nova). С ноября этого же года рассматриваемое приложение стало частично поддерживаться Linux (в сборке Red Hat Enterprise). Его полная версия появилась в 20-ой версии Fedora. В декабре развертка Docker-контейнеров стала возможна в среде Google Compute Engine.
С 2014 года производятся работы, связанные с внедрением Докера в среду управления фреймворка распределенных приложений Hadoop. А с 2017-го года выпускается редакция изучаемого продукта для компаний. Это – платная версия Docker, которая обойдется в сумму до 2000 долларов. Стоимость дистрибутива зависит от доступных в приложении функций.
На данный момент контейнер функционирует на системах Linux, в которых поддерживается изоляция именного пространства, а также crgroups, но это не мешает устанавливать инструмент на других ОС. Для этого придется воспользоваться специализированным программным обеспечением вроде Kinematic или Docker Machine.
Контейнеры – это…
Чтобы понять, для чего нужен Docker, требуется знать его определение. А еще – разобраться с термином «контейнер».
Контейнеры – это некий способ стандартизации развертки приложения и его отделения от общей инфраструктуры. Так можно охарактеризовать изолирование программного обеспечения для безопасного функционирования и тестирования. Экземпляр приложения запустится в изолированной среде, которая никак не отражается на функционировании основной операционной системе.
Разработчики за счет контейнеров могут не задумываться над:
- окружением, в котором будет работать программное обеспечение;
- наличием необходимого спектра настроек и параметров;
- зависимостями.
Достаточно просто создать приложение, упаковать все зависимости и настройки в единый образ и запустить его. Получившийся элемент может быть успешно запущен на других системах. Беспокоиться за работоспособность исходного приложения не придется.
Размышляя над тем, что такое докер-контейнер, можно столкнуться с несколькими определениями термина:
- Докер – это программное обеспечение для автоматизации развертки и управления программами в средах с поддержкой контейнеризации. Можно назвать эту технологию контейнеризатором приложений.
- Docker – платформа и технология, используемая для контейнеризации. С ее помощью получится создавать контейнеры, а затем управлять ими для развертывания и доставки исходного кода (программы) на сервер.
- Docker – платформа, используемая для разработки, доставки и запуска контейнеров программного обеспечения.
Все это – правильные определения. С помощью Докера можно создавать контейнеры, автоматизировать их развертку и запуск, а также управлять жизненным циклом. При помощи рассматриваемой технологии получится запустить огромное количество контейнеров в пределах одной и той же хост-машины.
Контейнеризация напоминает виртуализацию, но отличается от нее. Виртуализация будет отвечать за запуск полноценного хоста на гипервизоре со своим собственным виртуальным оборудованием, а также операционной системой. Также допускается запуск одной ОС внутри другой. При контейнеризации процессы запускаются из ядра основной операционной системы, виртуализация оборудования здесь отсутствует. Это значит, что проект, который был контейнеризирован, работает только в той же системе, что и основная. Контейнеры избегают виртуализации оборудования, за счет чего осуществляется меньшее потребление ими ресурсов хост-машины.
Ключевые особенности контейнеров
Изучаемая технология предусматривает ряд ключевых особенностей. Знать о них необходимо всем, кто планирует заниматься контейнеризацией. Это связано с тем, что существуют разнообразные приложения для создания контейнеров, но многие разработчики предпочитают Docker. Но и контейнеризация предусматривает определенные нюансы. Она не всегда целесообразна, поэтому рекомендуется запомнить следующие особенности контейнеров:
- Относительно небольшой жизненный цикл. Любо контейнер может быть остановлен, уничтожен, перезапущен – все по желанию пользователя или по мере необходимости. Данные, содержащиеся в контейнере, тоже пропадут. Это повлекло за собой формирование одного важного правила проектирования программ – не хранить в контейнерах важную информацию. Соответствующий подход называется Stateless.
- Объем контейнеров измеряется в мегабайтах, потому что в них упаковывают лишь те процессы и зависимости, которые нужны для реализации программы. Это позволяет значительно экономить дисковое пространство.
- Один контейнер – это один запущенный процесс. Если отключить отдельный такой элемент для отладки или обновления, приложение все равно будет исправно функционировать.
- За счет контейнеризации удается автоматизировать развертку приложений на разных хост-устройствах.
- Контейнеризация – это операция, обеспечивающая надежную изоляцию процессов и повышающая уровень безопасности систем. У программ, работающих внутри «изолированной среды», нет доступа к основной ОС. Оказывать на нее влияние такое программное обеспечение не сможет.
Чтобы понять, как работать с Docker, требуется помнить не только об особенностях контейнеров, но о преимуществах/недостатках рассматриваемой технологии.
Плюсы и минусы Докера
Docker – инструмент, который приносит разработчикам и организациям множество «плюсов». К его основным преимущества можно отнести:
- Адаптивность и гибкость. За счет Docker получится с легкостью запустить контейнер в облаке и на любом локальном устройстве. Допускается создание базовых контейнерных шаблонов с целью их дальнейшего бесконечного использования. Бесшовная переносимость и простая развертка – одни из главных преимуществ технологии.
- Снижение количества ошибок и несовпадений окружений. Docker содержит в себе все необходимое для запуска программного обеспечения. Благодаря соответству��щей особенности перенос приложения с одной среды в другую не доставит хлопот. Устраняется проблема, при которой у разработчиков все работает «как надо», а на обычном «боевом» сервере – нет.
- Скорость развертывания.
- Рост универсальности. Docker дает возможность использования любых языков разработки, а также стек технологий на сервере. Все это помогает избавиться от несовместимости библиотек и применяемых концепций.
- Поддержку и сообщество. У Docker поддерживается множество контейнеров с открытым исходным кодом. В любой момент пользователь может скачать нужный ему образ. А для решения возникающих проблем/вопросов предлагается обратиться к большому сообществу разработчиков, использующих изучаемую технологию.
- Непрерывную работу.
- Простое администрирование. При помощи Docker намного проще перенести контейнеры с хоста на хост, а также обновить их группы, запустить сразу несколько образов или осуществить откат до более старых версий.
- Безопасность. Докеры предлагают частичную изоляцию контейнеров друг от друга на уровне процессов и операционной системы. Это значит, что запуск контейнеров в большом количестве на одной и той же машине не несет никаких рисков.
- Экономическую эффективность. Контейнеры мало весят и являются производительными, а Docker дает возможность эффективно управлять имеющимися ресурсами. Данная особенность положительно сказывается на экономике компании, сокращая затраты.
Docker – это еще и современные подходы к выполнению своих задач. Технология предусматривает отказ от монолитной архитектуры в пользу микросервисной. Это положительно сказывается на гибкости развития продуктов, добавлении новых функций.
Основные компоненты
Что за технология и программа Docker, понятно. В ней выделяется ряд основных элементов. Среди ключевых компонентов:
- Клиент. Это сам инструмент. В него поступают команды.
- Демон – фоновый процесс управления контейнеризацией. Он принимает команды от клиента и реализовывает их. А еще – следит за контейнерами и знает их состояние.
- Хост. Так называется сервер, на котором развернут Docker. На нем в фоне будет функционировать демон, а также именно тут поднимаются контейнеры.
- Реестр. Представлен хранилищем образов. Из них демон организовывает контейнеризацию.
Также стоит запомнить следующие составляющие перечисленных ранее «блоков»:
- DockerFile – текстовый документ с инструкциями по созданию образов Docker. Файл формируется по принципу «одна строка – одна команда».
- Docker Daemon – фоновая служба на стороне хоста, отвечающая за создание, запуск и уничтожение контейнеров.
- Docker Image – образ. Представляет собой неизменяемый файл. Из него можно бесконечно разворачивать контейнеры.
- Client. Утилита командной строки в Docker, используемая для управления демоном.
- Container. Так называется запущенное приложение, развернутое из образа.
- Registry. Docker-служба, выполняющая роль репозитория (хранилища). Дает возможность отслеживать версии образов, а также создавать приватные репозитории.
- Docker Hub – публичный репозиторий с высоким рейтингом. Используется в Docker по умолчанию. С его помощью удается обеспечить интеграцию с GitHub и BitBucket.
- Docker Desktop. Приложение, предназначенное для Windows и macOS. Дает возможность локально собирать, тестировать и выполнять контейнеры.
- Docker Volumes. Тома, используемые для постоянного хранения данных. По умолчанию папки хранилищ в Docker создаются на хост-устройстве, но предусматривается возможность подключения удаленных хранилищ. За счет томов получается добиться лучшей настройки хранения информации.
Уже понятно, зачем требуется Docker и что он собой представляет. Теперь можно устанавливать соответствующую программу и начинать работать с ней.
Инициализация
Графический интерфейс для установки рассматриваемого программного интерфейса в Windows и macOS поддерживается, но он почти не используется. В основном разработчики стараются пользоваться консолью. Далее будет представлен процесс инициализации Docker на примере Ubuntu.
Для установки Докера потребуется:
- Синхронизировать пакетную базу apt и установить необходимые зависимости: .
- Импортировать GPG-ключ для репозитория: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg.
- Добавить новый репозиторий в список apt^ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null//
- Использовать две команды для установки Докера:
По умолчанию доступ к Docker Daemon поддерживается только для root-пользователей. Для того, чтобы с соответствующим элементом смогли работать остальные клиенты, их требуется добавить в специальную группу. Из состояния обычного пользователя надо выполнить команду:
sudo usermod -aG docker $USER
После этого потребуется перезайти в профиль. Так внесенные изменения вступят в силу.
Запуск контейнера
Теперь можно посмотреть, как работать в Docker. Начать стоит с контейнерного запуска. Сначала требуется выполнить команду:
docker run ubuntu echo 'hello from ubuntu'
Здесь Docker run используется для создания и запуска образа из контейнера. В примере «изолированным хранилищем» выступает образ Ubuntu. Далее выполняется команда echo. Из-за того, что была произведена чистая установка Докера без скачивания образов, система сначала отыщет соответствующий образ в публичном репозитории Docker Hub, загрузит и только потом сформирует контейнер.
Как только команда пройдет этап обработки, в терминале появится строчка «hello from Ubuntu». После этого контейнер сразу остановится. Можно воспользоваться командой:
docker run -it ubuntu
Она запустит контейнер в интерактивной форме: запустится оболочка (bash), а разработчик сможет внутри соответствующего «изолированного хранилища» выполнять разнообразные операции. Выход осуществляется через команду exit.
Создание образа
Создать образ в Docker можно через DockerFile или через интерактивную форму. При первом варианте предстоит указать в DockerFile необходимые команды, исключить в .dockerignore все документы, не используемые в сборке. После этого предстоит создать образ через команду docker image build, присвоив ему имя и тег.
Второй случай более простой. Здесь разработчику предстоит самостоятельно изменять среду окружения во время запуска контейнера. После открытия Docker в сессии терминала необходимо запустить контейнерную оболочку (bash) при помощи команды docker run имя_образа: тег. Имя тега допустимо не указывать тогда, когда используется текущая версия образа.
Сервисы для работы с контейнерами
Контейнеризация – процесс, который дает возможность организовывать сложные архитектуры в приложениях. Чем сложнее проект, тем труднее им управлять. Существует ряд сервисов, помогающих упростить работу с Docker. Далее будут представлены самые популярные приложения для этого.
Yandex Container Registry
Сервис для распространения и хранения Docker-образов. Он автоматически реплицирует всю информацию, а также упрощает переход на микросервисную архитектуру и интеграцию с облачными сервисами. Поддерживает управление при помощи консоли, командной строки (CLI) и командной строки Docker на основе Docker Registry HTTP API V2, работу через API.
Docker Compose
Для чего нужен Docker, ясно. В его состав входит инструмент Docker Compose. Он дает возможность централизованного запуска большого количества сервисов. Документирование и конфигурирование сервисов программы осуществляется через текстовый YAML-файл. Команда docker-compose up отвечает за развертывание сервисов приложений и создание из образа новых контейнеров, а также сетей, тонов и всех настроек, написанных в Docker Compose.
Теперь понятно, для чего нужен Docker. Лучше эту технологию помогут узнать дистанционные компьютерные курсы. Обучение организовано в режиме онлайн и сопряжено с богатым практическим опытом. По завершении курса пользователь получит электронный сертификат установленного образца.
Интересует DevOps? Добро пожаловать на курс в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Docker от А до Я OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Разработка современных приложений сильно отличается от программирования в прошлом. Раньше большинство инструментов и технологий не использовались при создании разнообразных виртуальных проектов. Сейчас разработчики нередко задействуют в процессе своей работы так называемые контейнеры. Так называются своеобразные системные образы, позволяющие запускать программный код в заранее сформированной и предсказуемой среде. В качестве основного стандарта для формирования, запуска, а" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/docker-ot-a-do-ya/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#article","name":"Docker \u043e\u0442 \u0410 \u0434\u043e \u042f OTUS","headline":"Docker \u043e\u0442 \u0410 \u0434\u043e \u042f","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-35.jpg","width":2245,"height":1587},"datePublished":"2024-02-20T18:35:49+00:00","dateModified":"2024-02-20T18:37:22+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, devops, Docker"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#listItem","position":2,"name":"Docker \u043e\u0442 \u0410 \u0434\u043e \u042f","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#webpage","url":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/","name":"Docker \u043e\u0442 \u0410 \u0434\u043e \u042f OTUS","description":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c. \u0420\u0430\u043d\u044c\u0448\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b. \u0422\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0430","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-35.jpg","@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/docker-ot-a-do-ya\/#mainImage"},"datePublished":"2024-02-20T18:35:49+00:00","dateModified":"2024-02-20T18:37:22+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/9261" /><link rel='shortlink' href='https://otus.ru/journal/?p=9261' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-9261 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-9261" class="the-post post-9261 post type-post status-publish format-standard has-post-thumbnail category-polza tag-devops tag-docker">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Docker от А до Я
</h1>
<a href="https://otus.ru/journal/docker-ot-a-do-ya/" class="date-link" data-wpel-link="internal"><time class="post-date">20 февраля, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Docker от А до Я" title="Docker от А до Я" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D1%8F" title="История появления и развития">История появления и развития</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6" title="Контейнеры – это…">Контейнеры – это…</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#Docker_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6" title="Docker – это…">Docker – это…</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BE%D0%B2" title="Ключевые особенности контейнеров">Ключевые особенности контейнеров</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9F%D0%BB%D1%8E%D1%81%D1%8B_%D0%B8_%D0%BC%D0%B8%D0%BD%D1%83%D1%81%D1%8B_%D0%94%D0%BE%D0%BA%D0%B5%D1%80%D0%B0" title="Плюсы и минусы Докера">Плюсы и минусы Докера</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B" title="Основные компоненты">Основные компоненты</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F" title="Инициализация">Инициализация</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0" title="Запуск контейнера">Запуск контейнера</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0" title="Создание образа">Создание образа</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0%D0%BC%D0%B8" title="Сервисы для работы с контейнерами">Сервисы для работы с контейнерами</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#Yandex_Container_Registry" title="Yandex Container Registry">Yandex Container Registry</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#Docker_Compose" title="Docker Compose">Docker Compose</a></li></ul></li></ul></nav></div>
<p>Разработка современных приложений сильно отличается от программирования в прошлом. Раньше большинство инструментов и технологий не использовались при создании разнообразных виртуальных проектов. Сейчас разработчики нередко задействуют в процессе своей работы так называемые контейнеры. Так называются своеобразные системные образы, позволяющие запускать программный код в заранее сформированной и предсказуемой среде.</p>
<p>В качестве основного стандарта для формирования, запуска, а также обслуживания контейнеров выступает платформа Docker. Далее с ней предстоит познакомиться поближе. Необходимо выяснить, что это программное обеспечение собой представляет, какие особенности предусматривает. Также предстоит ознакомиться с азами работы с Docker, сервисами для работы с контейнерами и устройством Docker-образа. Эта информация пригодится как начинающим разработчикам, так и уже более опытным программистам.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%BF%D0%BE%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D1%8F"></span>История появления и развития<span class="ez-toc-section-end"></span></h2>
<p>Docker – проект, который был начат в 2008 году. Он появился в качестве собственной внутренней разработки компании dotCloud во главе с Соломоном Хайксом. Целью данного проекта стало формирование публичной PaaS-платформы, которая поддерживала бы различные языки программирования. Вместе с Хайксом в первоначальной разработке Докеров значительный вклад внесли инженеры dotCloud Андреа Лудзарди, а также Франсуа-Ксавье Бурле.</p>
<p>К марту 2013 года Докер был опубликован под лицензией Apache 2.0, а в октябре компания dotCloud была переименована в Docker. Это связано с тем, что основной деятельностью организации стала работа над приложением для контейнеров.</p>
<p>В октябре 2013 года состоялся релиз Havana тиражируемой IaaS-платформы OpenStack которая стала поддерживать Докер (в качестве драйвера для OpenStack Nova). С ноября этого же года рассматриваемое приложение стало частично поддерживаться Linux (в сборке Red Hat Enterprise). Его полная версия появилась в 20-ой версии Fedora. В декабре развертка Docker-контейнеров стала возможна в среде Google Compute Engine.</p>
<p>С 2014 года производятся работы, связанные с внедрением Докера в среду управления фреймворка распределенных приложений Hadoop. А с 2017-го года выпускается редакция изучаемого продукта для компаний. Это – платная версия Docker, которая обойдется в сумму до 2000 долларов. Стоимость дистрибутива зависит от доступных в приложении функций.</p>
<p>На данный момент контейнер функционирует на системах Linux, в которых поддерживается изоляция именного пространства, а также crgroups, но это не мешает устанавливать инструмент на других ОС. Для этого придется воспользоваться специализированным программным обеспечением вроде Kinematic или Docker Machine.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6"></span>Контейнеры – это…<span class="ez-toc-section-end"></span></h2>
<p>Чтобы понять, для чего нужен Docker, требуется знать его определение. А еще – разобраться с термином «контейнер».</p>
<p>Контейнеры – это некий способ стандартизации развертки приложения и его отделения от общей инфраструктуры. Так можно охарактеризовать изолирование программного обеспечения для безопасного функционирования и тестирования. Экземпляр приложения запустится в изолированной среде, которая никак не отражается на функционировании основной операционной системе.</p>
<p>Разработчики за счет контейнеров могут не задумываться над:</p>
<ul>
<li>окружением, в котором будет работать программное обеспечение;</li>
<li>наличием необходимого спектра настроек и параметров;</li>
<li>зависимостями.</li>
</ul>
<p>Достаточно просто создать приложение, упаковать все зависимости и настройки в единый образ и запустить его. Получившийся элемент может быть успешно запущен на других системах. Беспокоиться за работоспособность исходного приложения не придется.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="Docker_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6"></span>Docker – это…<span class="ez-toc-section-end"></span></h2>
<p>Размышляя над тем, что такое докер-контейнер, можно столкнуться с несколькими определениями термина:</p>
<ol>
<li>Докер – это программное обеспечение для автоматизации развертки и управления программами в средах с поддержкой контейнеризации. Можно назвать эту технологию контейнеризатором приложений.</li>
<li>Docker – платформа и технология, используемая для контейнеризации. С ее помощью получится создавать контейнеры, а затем управлять ими для развертывания и доставки исходного кода (программы) на сервер.</li>
<li>Docker – платформа, используемая для разработки, доставки и запуска контейнеров программного обеспечения.</li>
</ol>
<p>Все это – правильные определения. С помощью Докера можно создавать контейнеры, автоматизировать их развертку и запуск, а также управлять жизненным циклом. При помощи рассматриваемой технологии получится запустить огромное количество контейнеров в пределах одной и той же хост-машины.</p>
<p>Контейнеризация напоминает виртуализацию, но отличается от нее. Виртуализация будет отвечать за запуск полноценного хоста на гипервизоре со своим собственным виртуальным оборудованием, а также операционной системой. Также допускается запуск одной ОС внутри другой. При контейнеризации процессы запускаются из ядра основной операционной системы, виртуализация оборудования здесь отсутствует. Это значит, что проект, который был контейнеризирован, работает только в той же системе, что и основная. Контейнеры избегают виртуализации оборудования, за счет чего осуществляется меньшее потребление ими ресурсов хост-машины.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BE%D0%B2"></span>Ключевые особенности контейнеров<span class="ez-toc-section-end"></span></h2>
<p>Изучаемая технология предусматривает ряд ключевых особенностей. Знать о них необходимо всем, кто планирует заниматься контейнеризацией. Это связано с тем, что существуют разнообразные приложения для создания контейнеров, но многие разработчики предпочитают Docker. Но и контейнеризация предусматривает определенные нюансы. Она не всегда целесообразна, поэтому рекомендуется запомнить следующие особенности контейнеров:</p>
<ol>
<li>Относительно небольшой жизненный цикл. Любо контейнер может быть остановлен, уничтожен, перезапущен – все по желанию пользователя или по мере необходимости. Данные, содержащиеся в контейнере, тоже пропадут. Это повлекло за собой формирование одного важного правила проектирования программ – не хранить в контейнерах важную информацию. Соответствующий подход называется Stateless.</li>
<li>Объем контейнеров измеряется в мегабайтах, потому что в них упаковывают лишь те процессы и зависимости, которые нужны для реализации программы. Это позволяет значительно экономить дисковое пространство.</li>
<li>Один контейнер – это один запущенный процесс. Если отключить отдельный такой элемент для отладки или обновления, приложение все равно будет исправно функционировать.</li>
<li>За счет контейнеризации удается автоматизировать развертку приложений на разных хост-устройствах.</li>
<li>Контейнеризация – это операция, обеспечивающая надежную изоляцию процессов и повышающая уровень безопасности систем. У программ, работающих внутри «изолированной среды», нет доступа к основной ОС. Оказывать на нее влияние такое программное обеспечение не сможет.</li>
</ol>
<p>Чтобы понять, как работать с Docker, требуется помнить не только об особенностях контейнеров, но о преимуществах/недостатках рассматриваемой технологии.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BB%D1%8E%D1%81%D1%8B_%D0%B8_%D0%BC%D0%B8%D0%BD%D1%83%D1%81%D1%8B_%D0%94%D0%BE%D0%BA%D0%B5%D1%80%D0%B0"></span>Плюсы и минусы Докера<span class="ez-toc-section-end"></span></h2>
<p>Docker – инструмент, который приносит разработчикам и организациям множество «плюсов». К его основным преимущества можно отнести:</p>
<ol>
<li>Адаптивность и гибкость. За счет Docker получится с легкостью запустить контейнер в облаке и на любом локальном устройстве. Допускается создание базовых контейнерных шаблонов с целью их дальнейшего бесконечного использования. Бесшовная переносимость и простая развертка – одни из главных преимуществ технологии.</li>
<li>Снижение количества ошибок и несовпадений окружений. Docker содержит в себе все необходимое для запуска программного обеспечения. Благодаря соответствующей особенности перенос приложения с одной среды в другую не доставит хлопот. Устраняется проблема, при которой у разработчиков все работает «как надо», а на обычном «боевом» сервере – нет.</li>
<li>Скорость развертывания.</li>
<li>Рост универсальности. Docker дает возможность использования любых языков разработки, а также стек технологий на сервере. Все это помогает избавиться от несовместимости библиотек и применяемых концепций.</li>
<li>Поддержку и сообщество. У Docker поддерживается множество контейнеров с открытым исходным кодом. В любой момент пользователь может скачать нужный ему образ. А для решения возникающих проблем/вопросов предлагается обратиться к большому сообществу разработчиков, использующих изучаемую технологию.</li>
<li>Непрерывную работу.</li>
<li>Простое администрирование. При помощи Docker намного проще перенести контейнеры с хоста на хост, а также обновить их группы, запустить сразу несколько образов или осуществить откат до более старых версий.</li>
<li>Безопасность. Докеры предлагают частичную изоляцию контейнеров друг от друга на уровне процессов и операционной системы. Это значит, что запуск контейнеров в большом количестве на одной и той же машине не несет никаких рисков.</li>
<li>Экономическую эффективность. Контейнеры мало весят и являются производительными, а Docker дает возможность эффективно управлять имеющимися ресурсами. Данная особенность положительно сказывается на экономике компании, сокращая затраты.</li>
</ol>
<p>Docker – это еще и современные подходы к выполнению своих задач. Технология предусматривает отказ от монолитной архитектуры в пользу микросервисной. Это положительно сказывается на гибкости развития продуктов, добавлении новых функций.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B"></span>Основные компоненты<span class="ez-toc-section-end"></span></h2>
<p>Что за технология и программа Docker, понятно. В ней выделяется ряд основных элементов. Среди ключевых компонентов:</p>
<ol>
<li>Клиент. Это сам инструмент. В него поступают команды.</li>
<li>Демон – фоновый процесс управления контейнеризацией. Он принимает команды от клиента и реализовывает их. А еще – следит за контейнерами и знает их состояние.</li>
<li>Хост. Так называется сервер, на котором развернут Docker. На нем в фоне будет функционировать демон, а также именно тут поднимаются контейнеры.</li>
<li>Реестр. Представлен хранилищем образов. Из них демон организовывает контейнеризацию.</li>
</ol>
<p>Также стоит запомнить следующие составляющие перечисленных ранее «блоков»:</p>
<ol>
<li>DockerFile – текстовый документ с инструкциями по созданию образов Docker. Файл формируется по принципу «одна строка – одна команда».</li>
<li>Docker Daemon – фоновая служба на стороне хоста, отвечающая за создание, запуск и уничтожение контейнеров.</li>
<li>Docker Image – образ. Представляет собой неизменяемый файл. Из него можно бесконечно разворачивать контейнеры.</li>
<li>Client. Утилита командной строки в Docker, используемая для управления демоном.</li>
<li>Container. Так называется запущенное приложение, развернутое из образа.</li>
<li>Registry. Docker-служба, выполняющая роль репозитория (хранилища). Дает возможность отслеживать версии образов, а также создавать приватные репозитории.</li>
<li>Docker Hub – публичный репозиторий с высоким рейтингом. Используется в Docker по умолчанию. С его помощью удается обеспечить интеграцию с GitHub и BitBucket.</li>
<li>Docker Desktop. Приложение, предназначенное для Windows и macOS. Дает возможность локально собирать, тестировать и выполнять контейнеры.</li>
<li>Docker Volumes. Тома, используемые для постоянного хранения данных. По умолчанию папки хранилищ в Docker создаются на хост-устройстве, но предусматривается возможность подключения удаленных хранилищ. За счет томов получается добиться лучшей настройки хранения информации.</li>
</ol>
<p>Уже понятно, зачем требуется Docker и что он собой представляет. Теперь можно устанавливать соответствующую программу и начинать работать с ней.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F"></span>Инициализация<span class="ez-toc-section-end"></span></h2>
<p>Графический интерфейс для установки рассматриваемого программного интерфейса в Windows и macOS поддерживается, но он почти не используется. В основном разработчики стараются пользоваться консолью. Далее будет представлен процесс инициализации Docker на примере Ubuntu.</p>
<p>Для установки Докера потребуется:</p>
<ol>
<li>Синхронизировать пакетную базу apt и установить необходимые зависимости: <img alt="Docker от А до Я" decoding="async" src="https://lh7-us.googleusercontent.com/y-zH4NGM-6dyVdtavSw9MDwmHEnD-LcngW_OSbqg6_GFZLwazdQ81SllVONFaRQ9BKHLLrfBfRcqPqL5ip-UyheJllbx0OmEDTKqNMBmkelVGkCtcj6-yA0g_wg-FQyjAaZn0d_Gmpfm0B85UE-XOA" width="259" height="54"><img alt="Docker от А до Я" decoding="async" src="https://lh7-us.googleusercontent.com/39SjrQUCcw0FN6o3cSdz_xmbrgcO3hmMBnLxQE3iVuJn5_QATHLWOZRIh2vy2NK4uyhBdZMxupfRLdYgF_QxTv-ccsI2KQ4JNR1ljYtBYmAxKn5dIFDs4L0Wh71U4mZo4iz0CvOmmshGN66jDagz1Q" width="281" height="173">.</li>
<li>Импортировать GPG-ключ для репозитория: curl -fsSL <code>https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg.</code></li>
<li>Добавить новый репозиторий в список apt^ echo \</li>
</ol>
<p><code>"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null//</code></p>
<ol start="4">
<li>Использовать две команды для установки Докера: <img alt="Docker от А до Я" loading="lazy" decoding="async" src="https://lh7-us.googleusercontent.com/oym3NKHJcuRXq0-9BEug9zsWOODAfp9bTjh1xFtqd7ujlFaWkG1skblhD2lOAW4_69GsPtSRe6Bc8_dP_xf0DCXPPd6_ZH4FjjxbbSlwufuekGV7NbOKreTybraDDjANSUMqD7OtoBQ6WuEGfGuflw" width="403" height="106"><img alt="Docker от А до Я" loading="lazy" decoding="async" src="https://lh7-us.googleusercontent.com/tW-AuJHB0BBnX8KZqZ-3_Yv5ilKGHTaPEcPUyAzYkUv17SThxAud3CpCxUC6ENYFUWdAxSk06cX_4Js2r7764M8fQi4mLpmuiSUV9gZx2wOG0e2yNCPxc4RI5LyKensIxto8FPGDB0Fo4U61nAH3zA" width="623" height="64"></li>
</ol>
<p>По умолчанию доступ к Docker Daemon поддерживается только для root-пользователей. Для того, чтобы с соответствующим элементом смогли работать остальные клиенты, их требуется добавить в специальную группу. Из состояния обычного пользователя надо выполнить команду:</p>
<p><code>sudo usermod -aG docker $USER</code></p>
<p>После этого потребуется перезайти в профиль. Так внесенные изменения вступят в силу.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0"></span>Запуск контейнера<span class="ez-toc-section-end"></span></h2>
<p>Теперь можно посмотреть, как работать в Docker. Начать стоит с контейнерного запуска. Сначала требуется выполнить команду:</p>
<p><code>docker run ubuntu echo 'hello from ubuntu'</code></p>
<p>Здесь Docker run используется для создания и запуска образа из контейнера. В примере «изолированным хранилищем» выступает образ Ubuntu. Далее выполняется команда echo. Из-за того, что была произведена чистая установка Докера без скачивания образов, система сначала отыщет соответствующий образ в публичном репозитории Docker Hub, загрузит и только потом сформирует контейнер.</p>
<p>Как только команда пройдет этап обработки, в терминале появится строчка «hello from Ubuntu». После этого контейнер сразу остановится. Можно воспользоваться командой:</p>
<p><code>docker run -it ubuntu</code></p>
<p>Она запустит контейнер в интерактивной форме: запустится оболочка (bash), а разработчик сможет внутри соответствующего «изолированного хранилища» выполнять разнообразные операции. Выход осуществляется через команду exit.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0"></span>Создание образа<span class="ez-toc-section-end"></span></h2>
<p>Создать образ в Docker можно через DockerFile или через интерактивную форму. При первом варианте предстоит указать в DockerFile необходимые команды, исключить в .dockerignore все документы, не используемые в сборке. После этого предстоит создать образ через команду docker image build, присвоив ему имя и тег.</p>
<p>Второй случай более простой. Здесь разработчику предстоит самостоятельно изменять среду окружения во время запуска контейнера. После открытия Docker в сессии терминала необходимо запустить контейнерную оболочку (bash) при помощи команды docker run имя_образа: тег. Имя тега допустимо не указывать тогда, когда используется текущая версия образа.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0%D0%BC%D0%B8"></span>Сервисы для работы с контейнерами<span class="ez-toc-section-end"></span></h2>
<p>Контейнеризация – процесс, который дает возможность организовывать сложные архитектуры в приложениях. Чем сложнее проект, тем труднее им управлять. Существует ряд сервисов, помогающих упростить работу с Docker. Далее будут представлены самые популярные приложения для этого.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Yandex_Container_Registry"></span>Yandex Container Registry<span class="ez-toc-section-end"></span></h3>
<p>Сервис для распространения и хранения Docker-образов. Он автоматически реплицирует всю информацию, а также упрощает переход на микросервисную архитектуру и интеграцию с облачными сервисами. Поддерживает управление при помощи консоли, командной строки (CLI) и командной строки Docker на основе Docker Registry HTTP API V2, работу через API.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Docker_Compose"></span>Docker Compose<span class="ez-toc-section-end"></span></h3>
<p>Для чего нужен Docker, ясно. В его состав входит инструмент Docker Compose. Он дает возможность централизованного запуска большого количества сервисов. Документирование и конфигурирование сервисов программы осуществляется через текстовый YAML-файл. Команда docker-compose up отвечает за развертывание сервисов приложений и создание из образа новых контейнеров, а также сетей, тонов и всех настроек, написанных в Docker Compose.</p>
<p>Теперь понятно, для чего нужен Docker. Лучше эту технологию помогут узнать дистанционные компьютерные курсы. Обучение организовано в режиме онлайн и сопряжено с богатым практическим опытом. По завершении курса пользователь получит электронный сертификат установленного образца.</p>
<p>Интересует <a href="https://otus.ru/lessons/devops-praktiki-i-instrumenty/?utm_source=oj&utm_medium=affilate&utm_campaign=devops" title="" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">DevOps? Добро пожаловать<span class="wpel-icon wpel-image wpel-icon-6"></span></a> на курс в Otus!</p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/devops/" rel="tag" data-wpel-link="internal">devops</a><a href="https://otus.ru/journal/tag/docker/" rel="tag" data-wpel-link="internal">Docker</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F&text=Docker%20%D0%BE%D1%82%20%D0%90%20%D0%B4%D0%BE%20%D0%AF" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fdocker-ot-a-do-ya%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F02%2Foj-1080x720-35.jpg&description=Docker%20%D0%BE%D1%82%20%D0%90%20%D0%B4%D0%BE%20%D0%AF" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/rabota-s-git-komanda-commit/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/rabota-s-git-komanda-commit/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Работа с Git. Команда Commit" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Работа с Git. Команда Commit" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/rabota-s-git-komanda-commit/" data-wpel-link="internal">Работа с Git. Команда Commit</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/rabota-s-git-komanda-commit/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-20T17:42:14+00:00">20 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">12 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/tablicy-v-html/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/tablicy-v-html/" class="image-link" rel="next" data-wpel-link="internal">
</a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/tablicy-v-html/" data-wpel-link="internal">Таблицы в HTML</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/tablicy-v-html/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-20T18:59:31+00:00">20 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/docker-ot-a-do-ya\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 22:30:23 GMT -->