Что такое docker и зачем он нужен

Что такое docker и зачем он нужен

Docker
Тип Виртуализация на уровне операционной системы
Автор
Разработчик Docker, Inc.[d]
Написана на Go[1]
Операционная система Linux[2] , Microsoft Windows[3] и macOS[4]
Первый выпуск 13 марта2013[5]
Аппаратная платформа x86-64
Последняя версия
  • 19.03.5 ( 14 ноября2019 ) [6]
Состояние Активная разработка
Лицензия Apache License 2.0[7][8] и проприетарная лицензия[d]
Сайт docker.com​ (англ.)
Медиафайлы на Викискладе

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами. Изначально использовал возможности LXC, с 2015 года применял собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением ​Open Container Initiative начался переход от монолитной к модульной архитектуре.

Разрабатывается и поддерживается одноимённой компанией-стартапом, распространяется в двух редакциях — общественной ( Community Edition ) по лицензии Apache 2.0 и для организаций ( Enterprise Edition ) по проприетарной лицензии [9] . Написан на языке Go.

Содержание

История [ править | править код ]

Проект начат как внутренняя собственническая разработка компании dotCloud, основанной Соломоном Хайксом (Solomon Hykes) в 2008 году с целью построения публичной PaaS-платформы с поддержкой различных языков программирования. Наряду с Хайксом в первоначальной разработке значительное участие приняли инженеры dotCloud Андреа Лудзарди (Andrea Luzzardi) и Франсуа-Ксавье Бурле (François-Xavier Bourlet).

В марте 2013 года код Docker был опубликован под лицензией Apache 2.0 [10] . В июне 2013 года генеральным директором в dotCloud приглашён Бен Голуб (англ. Ben Golub ), ранее руководивший фирмой Gluster [en] (разрабатывавшей технологию распределённого хранения GlusterFS и поглощённой за $136 млн Red Hat в 2011 году) [11] . В октябре 2013 года, подчёркивая смещение фокуса к новой ключевой технологии, dotCloud переименована в Docker (при этом PaaS-платформа сохранена под прежним названием — dotCloud).

В октябре 2013 года выпущен релиз Havana тиражируемой IaaS-платформы OpenStack, в котором реализована поддержка Docker (как драйвер для OpenStack Nova). С ноября 2013 года частичная поддержка Docker включена в дистрибутив Red Hat Enterprise Linux версии 6.5 [12] и полная — в 20-ю версию дистрибутива Fedora, ранее было достигнуто соглашение с Red Hat о включении с 2014 года Docker в тиражируемую PaaS-платформу OpenShift [en] [13] . В декабре 2013 года объявлено о поддержке развёртывания Docker-контейнеров в среде Google Compute Engine [en] [14] .

С 2014 года ведутся работы по включению поддержки Docker в среду управления фреймворка распределённых приложений Hadoop; по результатам тестирования вариантов платформы виртуализации для Hadoop, проведённом в мае 2014 года, Docker показал на основных операциях (по массовому созданию, перезапуску и уничтожению виртуальных узлов) существенно более высокую производительность, нежели KVM, в частности, на тесте массового создания виртуальных вычислительных узлов прирост потребления процессорных ресурсов в Docker зафиксирован в 26 раз ниже, чем в KVM, а прирост потребления ресурсов оперативной памяти — втрое ниже [15] .

С 2017 года вдобавок к свободно распространяемой под лицензией Apache 2.0 редакции продукта выпускается редакция для организаций, продаваемая по ценам от $750 до $2 тыс. в год на узел в зависимости от доступных функций [9] .

Применение [ править | править код ]

Программное обеспечение функционирует в среде Linux с ядром, поддерживающим cgroups и изоляцию пространств имён (namespaces); существуют сборки только для платформ x86-64 и ARM [17] . Начиная с версии 1.6 возможно использование в ОС Windows [18] .

Для экономии дискового пространства проект использует файловую систему Aufs с поддержкой технологии каскадно-объединённого монтирования: контейнеры используют образ базовой операционной системы, а изменения записываются в отдельную область. Также поддерживается размещение контейнеров в файловой системе Btrfs с включённым режимом копирования при записи.

В состав программных средств входит демон — сервер контейнеров (запускается командой docker -d), клиентские средства, позволяющие из интерфейса командной строки управлять образами и контейнерами, а также API, позволяющий в стиле REST управлять контейнерами программно.

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

Читайте также:  Hansa 800 comfort ошибки

Набор клиентских средств позволяет запускать процессы в новых контейнерах (docker run), останавливать и запускать контейнеры (docker stop и docker start), приостанавливать и возобновлять процессы в контейнерах (docker pause и docker unpause). Серия команд позволяет осуществлять мониторинг запущенных процессов (docker ps по аналогии с ps в Unix-системах, docker top по аналогии с top и другие). Новые образы возможно создавать из специального сценарного файла (docker build, файл сценария носит название Dockerfile), возможно записать все изменения, сделанные в контейнере, в новый образ (docker commit). Все команды могут работать как с docker-демоном локальной системы, так и с любым сервером Docker, доступным по сети. Кроме того, в интерфейсе командной строки встроены возможности по взаимодействию с публичным репозиторием Docker Hub, в котором размещены предварительно собранные образы контейнеров, например, команда docker search позволяет осуществить поиск образов среди размещённых в нём [19] , образы можно скачивать в локальную систему (docker pull), возможно также отправить локально собранные образы в Docker Hub (docker push).

Также Docker имеет пакетный менеджер Docker Compose, позволяющий описывать и запускать многоконтейнерные приложения. Конфигурационные файлы Compose описываются на языке YAML [20] .

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

Это ПО с открытым кодом, принцип работы которого проще всего сравнить с транспортными контейнерами. Только подумайте, ведь когда-то транспортные компании сталкивались с похожими проблемами:

  1. Как перевозить разные (несовместимые) типы товаров вместе (например, продукты питания с химикатами или стекло с кирпичом)?
  2. Как обрабатывать пакеты разных размеров одним и тем же транспортным средством?

С введением контейнеров стало возможным перевозить вместе кирпичи и стекло, химикаты и еду, а также многое другое. Груз разного размера может быть распределен по стандартизированным контейнерам, которые загружаются/выгружаются одним и тем же транспортным средством.

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

Эта проблема решается через создание независимости ПО от системы.

Изначально виртуализация была призвана избавить от подобных проблем, но в ней есть существенные недостатки:

  • медленная загрузка;
  • возможная плата за предоставление дополнительного пространства;
  • не все виртуальные машины (VM) поддерживают совместимое использование;
  • поддерживающие VM часто требуют сложной настройки;
  • образ может быть слишком большим, так как «дополнительная ОС» добавляет гигабайт пространства в проект поверх операционной системы, а в большинстве случаев на сервер ставится несколько VM, которые занимают еще больше места.

Докер же просто разделяет ядро ОС на все контейнеры (Docker container), работающие как отдельные процессы. Это не единственная подобная платформа, но, бесспорно, одна из самых популярных и востребованных.

К его преимуществам относятся:

  1. Ускоренный процесс разработки. Нет необходимости устанавливать вспомогательные инструменты вроде PostgreSQL, Redis, Elasticsearch: их можно запускать в контейнерах.
  2. Удобная инкапсуляция приложений.
  3. Понятный мониторинг.
  4. Простое масштабирование.

Докер работает не только на его родной ОС, Linux, но также поддерживается Windows и macOS. Единственное отличие от взаимодействия с Linux в том, что на macOS и Windows платформа инкапсулируется в крошечную виртуальную машину. На данный момент Докер для macOS и Windows достиг значительного уровня удобства в использовании.

Кроме того, существует множество дополнительных приложений, таких как Kitematic или Docker Machine, которые помогают устанавливать и использовать Докер на платформах, отличных от Linux.

Здесь можно посмотреть подробную инструкцию по установке. Если вы работаете с Докером на ОС Linux, вам нужно выполнить несколько несложных действий и повторно войти в систему:

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

2. Образ – базовый элемент каждого контейнера. В зависимости от образа, может потребоваться некоторое время для его создания.

3. Порт – это порт TCP/UDP в своем первоначальном значении. Чтобы все было просто, предположим, что порты могут быть открыты во внешнем мире или подключены к контейнерам (доступны только из этих контейнеров и невидимы для внешнего мира).

Читайте также:  Сотовый телефон samsung раскладушка

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

5. Реестр – это сервер, на котором хранятся образы. Сравним его с GitHub: вы можете вытащить образ из реестра, чтобы развернуть его локально, и так же локально можете вносить в реестр созданные образы.

6. Docker Hub – публичный репозиторий с интерфейсом, предоставляемый Докер Inc. Он хранит множество образов. Ресурс является источником «официальных» образов, сделанных командой Докер или созданных в сотрудничестве с разработчиком ПО. Для официальных образов перечислены их потенциальные уязвимости. Эта информация открыта для любого зарегистрированного пользователя. Доступны как бесплатные, так и платные аккаунты.

Пришло время запустить наш первый контейнер:

  • docker run – это команда запуска контейнера.
  • ubuntu – образ, который вы запускаете (например, образ операционной системы Ubuntu). Когда вы его указываете, Докер сначала анализирует элемент в разрезе хоста.
  • /bin/echo ‘Hello world’ – команда, которая будет запускаться внутри нового контейнера. Данный контейнер просто выводит «Hello world» и останавливает выполнение.

Теперь попробуем создать интерактивную оболочку внутри контейнера:

  • -t присваивает псевдо-tty или терминал внутри нового контейнера.
  • -i позволяет создавать интерактивное соединение, захватывая стандартный вход (STDIN) контейнера.
  • —rm требуется для автоматического удаления контейнера при выходе из процесса. По умолчанию контейнеры не удаляются.

Если вы хотите, чтобы контейнер работал после окончания сеанса, вам необходимо его «демонизировать»:

  • —name daemon назначает имя новому контейнеру. Если вы его не укажете, имя сгенерируется и назначится автоматически.
  • -d запускает контейнер в фоновом режиме («демонизирует» его).

Давайте посмотрим, какие контейнеры у нас есть на данный момент:

  • docker ps – команда для перечисления контейнеров.
  • -a показывает все контейнеры (без -a ps покажет только запущенные контейнеры).

ps показывает нам, что у нас есть два контейнера:

  • gifted_nobel (имя для этого контейнера генерировалось автоматически) – первый контейнер, который мы создали с набранным «Hello world».
  • daemon – третий контейнер, который мы создали и «демонизировали».

Примечание: второй контейнер (с интерактивной оболочкой) отсутствует, потому что мы устанавливаем параметр -rm, в результате чего этот контейнер автоматически удаляется после выполнения.

Давайте проверим журналы и посмотрим, что делает контейнер-демон прямо сейчас:

  • docker logs получают журналы контейнера.
  • -f следит за выходом журнала.

Теперь давайте остановим контейнер-демон:

Проверяем его остановку:

Контейнер остановлен. Давайте запустим его снова:

Убедимся, что он запущен:

Теперь остановим его и удалим все контейнеры вручную:

Чтобы удалить все контейнеры, мы можем использовать следующую команду:

  • docker rm – команда удаления контейнера.
  • -f (для rm) должен остановить контейнер, если он работает (принудительное удаление).
  • -q (для ps) – это вывод только идентификаторов контейнера.

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

Пришло время создать и запустить более важный контейнер, такой как Nginx.

Измените каталог на examples/nginx:

  • -p – отображение портов HOST PORT: CONTAINER PORT.
  • -v отвечает за HOST DIRECTORY:CONTAINER DIRECTORY.

Теперь проверьте этот URL-адрес в своем веб-браузере.

Еще мы можем попробовать изменить /example/nginx/index.html (который добавляется в каталог /usr/share/nginx/html внутри контейнера) и обновить страницу.

Получим информацию о контейнере test-nginx:

Эта команда отображает системную информацию об установке Докер. Она включает версию ядра, количество контейнеров и образов, открытые порты и т. д.

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

  • FROM – задать базовый образ
  • RUN – выполнить команду в контейнере
  • ENV – задать переменную среды
  • WORKDIR – установить рабочий каталог
  • VOLUME – создать точку монтирования для тома
  • CMD – установить исполняемый файл для контейнера

Более подробная информация здесь.

Давайте создадим образ, который получит содержимое сайта и сохранит его в текстовом файле. Нам нужно передать URL-адрес через переменную SITE_URL. Результирующий файл будет помещен в каталог, установленный как том:

Dockerfile готов, пришло время создать образ.

Создание образа

Перейдите к examples/curl и выполните следующую команду:

  • docker build создает новый образ локально.
  • -t устанавливает в образе метку имени.
Читайте также:  При запуске steam синий экран

Теперь у нас есть новый образ, и мы можем его увидеть в списке существующих:

Мы можем создавать и запускать контейнер из образа. Давайте попробуем сделать это с параметрами по умолчанию:

Чтобы просмотреть результаты, сохраненные в файле:

Попробуем с facebook.com:

Чтобы просмотреть результаты, сохраненные в файле:

Рекомендации по созданию образов

  • Избегайте установки ненужных пакетов – они будут потреблять дополнительное дисковое пространство.
  • Используйте кэш.
  • Будьте осторожны с объемами. Вы должны помнить, какие данные в томах. Поскольку тома являются постоянными и не «умирают» с контейнерами – следующий контейнер будет использовать данные из тома, которые были созданы предыдущим контейнером.
  • Используйте переменные среды (в RUN, EXPOSE, VOLUME). Это сделает ваш Dockerfile более гибким.

Соединение между контейнерами

Docker compose — это единственный правильный способ подключения контейнеров друг к другу.

В этом примере мы подключим контейнеры Python и Redis.

Перейдем к examples/compose и выполним команду:

Текущий пример увеличит счетчик просмотров в Redis. Откройте ссылку и убедитесь в этом.

Использование docker-compose – это тема для целого учебника. Чтобы начать работу, вы можете поиграться с некоторыми образами из Docker Hub, а если хотите создать свои собственные – следуйте рекомендациям, перечисленным выше. Единственное, что можно добавить с точки зрения использования docker-compose – всегда давайте явные имена вашим томам. Это простое правило избавит вас от проблемы в будущем.

В этом случае redis_data будет именем внутри файла docker-compose.yml.

Смотрим выполнение тома:

Без явного имени тома будет UUID. И вот пример:

Докер стал одним из важнейших инструментов современного разработчика. Да, он имеет некоторые ограничения и требования в зависимости от архитектуры вашей системы, но немного усидчивости – и мир контейнеров обязательно будет приручен!

Очередь просмотра

Очередь

  • Удалить все
  • Отключить

Хотите сохраните это видео?

  • Пожаловаться

Пожаловаться на видео?

Выполните вход, чтобы сообщить о неприемлемом контенте.

Понравилось?

Не понравилось?

Текст видео

Docker — удобный программный продукт для работы с контейнерами. В этом видео мы узнаем основы docker и максимально подробно обсудим зачем нужен докер.

Мы познакомимся с понятиями docker container (докер контейнер), docker image, docker engine, dockerfile, узнаем зачем они нужны и какая между ними разница. В основном мы будем работать с docker контейнер и docker образ. В видео мы узнаем как установить docker и как работать в docker windows. Мы рассмотрим основы докер на русском с нуля и изучим основные команды docker, такие как docker ps, docker images, docker run и многие другие. Это не совсем docker уроки, а скорее быстрый обзор применения docker, плюсов и недостатков. Мы узнаем что такое docker hub и научимся с ним работать. Также естественно подробно обсудим зачем нужен docker, в каких случаях и для чего его нужно применять. Мы рассмотрим docker c нуля для начинающих.

Данное видео является ознакомительным и рассказывает основные возможности и способы работы с docker, поэтому будет интересно тем, кто только хочет познакомиться с данным инструментом.

Кстати, меня зовут Шванов Вадим, и я программист на языке C# уже больше 8 лет и автор этого канала CODE BLOG. Я рассказываю про IT технологии и веду этот курс по языку C# с нуля. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP .NET, Core, MVC, Unity, WCF, WPF, структуры данных и алгоритмы, паттерны проектирования, информатика, программное обеспечение и многое другое. Для меня важно не только показать практическое применение языка C#, но и объяснить основную идею и базовые понятия Computer Science. Мы изучим основы программирования на языке си шарп. В качестве основного инструмента разработки используется visual studio c# и проекты на visual c#. Программирование c# — не простая задача, но применив должное количество усилий и времени можно получить возможность называть себя c# разработчик. Разработка c# приложений достаточно удобный процесс, который будет понятен даже начинающему dotnet программисту. Мы разговариваем о том, как стать программистом и как научиться программировать.

Ссылка на основную публикацию
Adblock detector