Введение в Docker
Docker открытая платформа для разработки, публикации, и запуска приложений. Docker дает возможность отделить ваши приложения от инфраструктуры чтобы вы могли быстро произвести развертывание. С Docker, вы можете управлять вашей инфраструктурой так же просто как и приложениями. Используя методологию докер для выгрузки, деплоя и тестирования вы можете существенно сократить время между написанием кода и его выкладкой в продакшн.
Что из себя представляет платформа Docker?
Докер обеспечивает возможность упаковки и запуска приложения в изолированной среде называемой контейнером. Изоляция и неоходимый уровень безопасности позволяют запускать множество контейнеров на заданном хосте. Из-за легкого характера контейнеров, которые работают без дополнительной нагрузки гипервизора, вы можете запустить больше контейнеров чем на виртуальной машине.
Докер предоставляет инструменты и платформу для управления жизненным циклом контейнеров:
Что такое Docker Engine?
Docker Engine клиент-серверное приложение с тремя главными компонентами:
Сервер работающий в фоновом режиме (демон).
REST API, который используют программы для взаимодействия с сервером.
Интерфейс командной строки (CLI) клиент.
CLI использует Docker REST API для управления или взаимодействия с демоном Докер с помощью сценариев или непосредственно команд CLI. Многие другие приложения Docker основаны на использовании API и CLI
Демон создает и управляет объектами Docker, такими как образы, контейнеры, сети и хранилища данных.
Примечание: Docker распространяется под лицензией с открытым исходным кодом по лицензии Apache 2.0.
Для чего Docker может быть использован?
Быстрая, последовательная доставка приложений
Докер может упростить жизненный цикл разработки, позволяя разработчикам работать в стандартных условиях с использованием местных контейнеров, которые предоставляют свои приложения и сервисы. Вы также можете интегрировать Docker в вашу систему интеграции и деплоя (CI / CD).
Рассмотрим следующий пример сценария. Ваши разработчики пишут код на местном уровне и делятся своей работой со своими коллегами с использованием контейнеров Докер. Они могут использовать Docker, чтобы развернуть их приложения в тестовой среде и выполнять автоматизированные и ручные тесты. Когда разработчики находят ошибки, они могут исправить их в среде разработки и перезалить образ в тестовую среду для тестирования. По окончании испытаний, получить исправление клиенту так же просто, как загрузить обновленный образ в продакшн.
Простое развертывание и масштабирование
Основанная на контейнерах платформа Докера крайне портативна. Docker контейнеры могут работать на локальном хосте разработчика, на физических или виртуальных машинах в дата центре, в облаке, или смешанной среде.
За счет портативности и легкости Docker позволяет динамически управлять рабочей нагрузкой и масштабированием приложений и сервисов так как того требует бизнес почти в реальном времени.
Выдерживает больше нагрузок на том же оборудовании
Докер легок и быстр. Он представляет реальную альтернативу hypervisor-based виртуальным машинам давая использовать больше вычислительных мощностей для достижения поставленных целей. Это полезно как для больших и сложных систем, так и для малых и средних, где вам нужно делать больше с меньшими ресурсами.
Архитектура Docker
Docker использует клиент-серверную архитектуру. Докер клиент обращается к демону, который создает, запускает и доставляет ваши контейнеры. Docker клиент и демон могут быть запущены в одной системе или клиент может подключиться к удаленному демону. Docker клиент и демон общаются через сокеты или REST API.
Демон
Демон Docker работает на хост-машине. Пользователь использует клиент Docker для взаимодействия с демоном.
Клиент
Устройство Docker
Что бы разобраться в устройстве Docker вам нужно ознакомиться с образами, реестром и контейнерами.
Образы
Образ в Докер является шаблоном только для чтения с набором инструкций для создания контейнера. К примеру, образ может состоять из операционной системы Ubuntu, веб-сервера Apache и вашего веб-приложения. Вы можете собрать образ с нуля, обновить или загрузить и использовать образы, созданные другими пользователями. Образ может быть самодостаточным или являться дополнением другого образа. Образ Docker описывается в специальном текстовом файле с именем Dockerfile, который имеет простой и понятный синтаксис. Для большей информации об образах, читайте Устройство Docker образа.
Образы в Docker являются компонентом сборщиком.
Контейнеры
Контейнер в Docker является исполняемым экземпляром образа. Вы можете создавать, запускать, останавливать, перемещать или удалять контейнер используя Docker API или консольные команды. Когда вы запускаете контейнер, вы обеспечиваете конфигурацию метаданных таких как сеть и переменные окружения. При запуске контейнера, вы можете предоставить метаданные конфигурации, такие как сетевые настройки или переменные окружения. Каждый контейнер является изолированной и безопасной платформой, но может получить доступ к ресурсам запущенным на других хостах или контейнерах, а также к хранилищам и базам данных. Больше информации о контейнерах вы найдете в разделе Как работают контейнеры?.
Контейнеры являются исполняемыми компонентами Docker.
Реестр
Реестр – это библиотека образов. Он может быть публичным или приватным и может располагаться на одном сервере с демоном, клиентом или на на отдельном сервере. Для большей информации о реестре, читайте Как работает реестр Docker?
Реестр – компонент дистрибуции Docker.
Сервисы
Docker сервис предоставляет режим swarm с помощью которого можете ограничивать количество экземпляров процессов образа. Вы можете указать количество параллельных задач реплик для запуска, и менеджер swarm гарантирует, что нагрузка распределяется равномерно между рабочими узлами. Docker Engine поддерживает режим swarm начиная с версии 1.12 выше.
Сервисы компонент масштабирования Docker.
Как работают образы Docker?
Образы являются шаблонами только для чтения, из которых Docker инициализирует контейнеры. Каждый образ состоит из ряда слоев. Докер использует UnionFS для комбинирования этих слоев в единый образ. Объединенная файловая система позволяет файлам и каталогам изолированных файловых систем, известных как ветви, прозрачно перекрываться, формируя единую связанную файловую систему.
Благодаря системе слоев Docker так легковесен. Когда вы изменяете образ, например при обновлении приложений на новою версию, новый слой заменяет только те слои которые затрагивают изменения. Другие слои остаются нетронутыми. Для того, чтобы распространять обновление, вам нужно только передать обновленный слой. Слоение ускоряет дистрибуцию образов. При запуске Docker определяет какие слои должны быть обновлены.
Образ определяется в файле Dockerfile. Каждый образ начинается с базового образа, такого как Ubuntu или Fedora. Вы можете также использовать собственные образы как базовые для создания новых, к примеру если вы имеете базовый образ Apache вы можете использовать его как базовый для вашего веб-приложения. Базовый образ задается командой FROM в dockerfile.
Примечание: Docker Hub публичный реестр образов.
Как работает реестр Docker?
Docker реестр хранит образы. После сборки образа вы можете добавить его в публичный реестр, например Docker Hub или приватный реестр работающий на ваших серверах. Вы также можете искать существующие образы и в реестре и использовать их по своему усмотрению.
Docker Hub публичный реестр с огромной коллекцией образов с возможностью добавить свой собственный. Для большей информации читайте Docker Registry и Docker Trusted Registry.
Docker store позволяет вам покупать и продавать образы. Вы можете купить Docker образ, содержащий приложение или услугу от поставщика программного обеспечения, а также использовать образ для развертывания приложения в тестовой среде, а также обновить приложение, залив новую версию образа и пересоздав контейнеры. Docker Store на данный момент находится в стадии закрытой беты.
Как работают контейнеры?
Контейнер использует Linux ядро хост-машины, и состоит из каких-либо дополнительных файлов, которые вы добавляете, когда создается образ, вместе с метаданными, ассоциируемыми с контейнером при его создании или запуске. Каждый контейнер построен из образа. Образ определяет содержимое контейнера, какие процессы запускать при старте контейнера и множество других деталей конфигурации. Образ доступен только для чтения. Когда Docker запускает контейнер из образа, он добавляет слой для чтения-записи поверх образа (это необходимо для UnionFS как мы увидим позднее) в котором выполняется ваше приложение.
Что происходит при запуске контейнера?
Когда вы выполняете эту команду происходит следующее:
Загрузка образа ubuntu: Docker Engine проверяет существование образа ubuntu. Если образ уже существует локально, Docker использует его для нового контейнера. В противном случае образ загружается с Docker Hub.
Создается новый контейнер: Докер использует образ для создания контейнера.
Размечается файловая система и слой для чтения-записи:Контейнер создан в файловой системе и слой чтения-записи добавлен к образу.
Создание сети / интерфейс моста: Создается сетевой интерфейс который позволяет контейнеру общаться с локальным хостом.
Выделение IP адреса: Поиск и присвоение доступного IP.
Захват ввода/вывода приложения: Подключение стандартного ввода/вывода и логирование ошибок что бы вы могли видеть как приложение работает, поскольку вы указали интерактивный режим.
Ваш контейнер в настоящее время работает. Вы можете управлять и взаимодействовать с ним, пользоваться сервисами и приложениями, которые он предоставляет или остановить и удалить его.
Базовая технология
Docker написан на Go и использует несколько особенностей ядра Linux.
Пространства имен
Докер использует технологию пространств имен, чтобы обеспечить изолированное рабочее пространство для контейнеров. При запуске контейнера, Docker создает набор пространств имен для этого контейнера.
Пространства имен обеспечивают изоляцию слоев. Каждый аспект контейнера выполняется в отдельном пространстве имен, и доступ к нему ограничен этим пространством имен.
Использование пространств имен на примере Linux:
Control groups
Docker Engine также использует в Linux другую технологию, называемую контрольными группами ( cgroups ). Cgroup ограничивает доступ приложения к определенным наборам ресурсов. Контрольные группы позволяют Docker Engine разделить имеющиеся аппаратные ресурсы для контейнеров и при необходимости устанавливать лимиты. К примеру, вы можете ограничить память, доступную для определенного контейнера.
Объединенные файловые системы
Объединенная файловая система или UnionFS, файловая система управляющая созданием слоев, делает их очень легкими и быстрыми. Докер использует UnionFS для обеспечения построения блоков для контейнеров. Docker может использовать множество UnionFS вариантов, таких как AUFS, btrfs, vfs и DeviceMapper.
Формат контейнеров
Понимая Docker
Уже несколько месяцев использую docker для структуризации процесса разработки/доставки веб-проектов. Предлагаю читателям «Хабрахабра» перевод вводной статьи о docker — «Understanding docker».
Что такое докер?
Докер — это открытая платформа для разработки, доставки и эксплуатации приложений. Docker разработан для более быстрого выкладывания ваших приложений. С помощью docker вы можете отделить ваше приложение от вашей инфраструктуры и обращаться с инфраструктурой как управляемым приложением. Docker помогает выкладывать ваш код быстрее, быстрее тестировать, быстрее выкладывать приложения и уменьшить время между написанием кода и запуска кода. Docker делает это с помощью легковесной платформы контейнерной виртуализации, используя процессы и утилиты, которые помогают управлять и выкладывать ваши приложения.
В своем ядре docker позволяет запускать практически любое приложение, безопасно изолированное в контейнере. Безопасная изоляция позволяет вам запускать на одном хосте много контейнеров одновременно. Легковесная природа контейнера, который запускается без дополнительной нагрузки гипервизора, позволяет вам добиваться больше от вашего железа.
Для чего я могу использовать docker?
Быстрое выкладывание ваших приложений
Docker прекрасно подходит для организации цикла разработки. Docker позволяет разработчикам использовать локальные контейнеры с приложениями и сервисами. Что в последствии позволяет интегрироваться с процессом постоянной интеграции и выкладывания (continuous integration and deployment workflow).
Например, ваши разработчики пишут код локально и делятся своим стеком разработки (набором docker образов) с коллегами. Когда они готовы, отравляют код и контейнеры на тестовую площадку и запускают любые необходимые тесты. С тестовой площадки они могут оправить код и образы на продакшен.
Более простое выкладывание и разворачивание
Основанная на контейнерах docker платформа позволят легко портировать вашу полезную нагрузку. Docker контейнеры могут работать на вашей локальной машине, как реальной так и на виртуальной машине в дата центре, так и в облаке.
Портируемость и легковесная природа docker позволяет легко динамически управлять вашей нагрузкой. Вы можете использовать docker, чтобы развернуть или погасить ваше приложение или сервисы. Скорость docker позволяет делать это почти в режиме реального времени.
Высокие нагрузки и больше полезных нагрузок
Docker легковесен и быстр. Он предоставляет устойчивую, рентабельную альтернативу виртуальным машинам на основе гипервизора. Он особенно полезен в условиях высоких нагрузок, например, при создания собственного облака или платформа-как-сервис (platform-as-service). Но он так же полезен для маленьких и средних приложений, когда вам хочется получать больше из имеющихся ресурсов.
Главные компоненты Docker
Архитектура Docker
Docker использует архитектуру клиент-сервер. Docker клиент общается с демоном Docker, который берет на себя тяжесть создания, запуска, распределения ваших контейнеров. Оба, клиент и сервер могут работать на одной системе, вы можете подключить клиент к удаленному демону docker. Клиент и сервер общаются через сокет или через RESTful API.
Docker-демон
Как показано на диаграмме, демон за пускается на хост-машине. Пользователь не взаимодействует с сервером на прямую, а использует для этого клиент.
Docker-клиент
Docker-клиент, программа docker — главный интерфейс к Docker. Она получает команды от пользователя и взаимодействует с docker-демоном.
Внутри docker-а
Образы
Docker-образ — это read-only шаблон. Например, образ может содержать операционку Ubuntu c Apache и приложением на ней. Образы используются для создания контейнеров. Docker позволяет легко создавать новые образы, обновлять существующие, или вы можете скачать образы созданные другими людьми. Образы — это компонента сборки docker-а.
Реестр
Docker-реестр хранит образы. Есть публичные и приватные реестры, из которых можно скачать либо загрузить образы. Публичный Docker-реестр — это Docker Hub. Там хранится огромная коллекция образов. Как вы знаете, образы могут быть созданы вами или вы можете использовать образы созданные другими. Реестры — это компонента распространения.
Контейнеры
Контейнеры похожи на директории. В контейнерах содержится все, что нужно для работы приложения. Каждый контейнер создается из образа. Контейнеры могут быть созданы, запущены, остановлены, перенесены или удалены. Каждый контейнер изолирован и является безопасной платформой для приложения. Контейнеры — это компонента работы.
Так как же работает Docker?
Как работает образ?
Мы уже знаем, что образ — это read-only шаблон, из которого создается контейнер. Каждый образ состоит из набора уровней. Docker использует union file system для сочетания этих уровней в один образ. Union file system позволяет файлам и директориями из разных файловых систем (разным ветвям) прозрачно накладываться, создавая когерентную файловую систему.
Одна из причин, по которой docker легковесен — это использование таких уровней. Когда вы изменяете образ, например, обновляете приложение, создается новый уровень. Так, без замены всего образа или его пересборки, как вам возможно придётся сделать с виртуальной машиной, только уровень добавляется или обновляется. И вам не нужно раздавать весь новый образ, раздается только обновление, что позволяет распространять образы проще и быстрее.
В основе каждого образа находится базовый образ. Например, ubuntu, базовый образ Ubuntu, или fedora, базовый образ дистрибутива Fedora. Так же вы можете использовать образы как базу для создания новых образов. Например, если у вас есть образ apache, вы можете использовать его как базовый образ для ваших веб-приложений.
Примечание! Docker обычно берет образы из реестра Docker Hub.
Docker образы могут создаться из этих базовых образов, шаги описания для создания этих образов мы называем инструкциями. Каждая инструкция создает новый образ или уровень. Инструкциями будут следующие действия:
Как работает docker реестр?
Реестр — это хранилище docker образов. После создания образа вы можете опубликовать его на публичном реестре Docker Hub или на вашем личном реестре.
С помощью docker клиента вы можете искать уже опубликованные образы и скачивать их на вашу машину с docker для создания контейнеров.
Docker Hub предоставляет публичные и приватные хранилища образов. Поиск и скачивание образов из публичных хранилищ доступно для всех. Содержимое приватных хранилищ не попадает в результат поиска. И только вы и ваши пользователи могут получать эти образы и создавать из них контейнеры.
Как работает контейнер?
Контейнер состоит из операционной системы, пользовательских файлов и метаданных. Как мы знаем, каждый контейнер создается из образа. Этот образ говорит docker-у, что находится в контейнере, какой процесс запустить, когда запускается контейнер и другие конфигурационные данные. Docker образ доступен только для чтения. Когда docker запускает контейнер, он создает уровень для чтения/записи сверху образа (используя union file system, как было указано раньше), в котором может быть запущено приложение.
Что происходит, когда запускается контейнер?
Что же происходит под капотом, когда мы запускаем эту команду?
Используемые технологии
Докер написан на Go и использует некоторые возможности ядра Linux, чтобы реализовать приведенный выше функционал.
Пространство имен(namespaces)
Docker использует технологию namespaces для организации изолированных рабочих пространств, которые мы называем контейнерами. Когда мы запускаем контейнер, docker создает набор пространств имен для данного контейнера.
Это создает изолированный уровень, каждый аспект контейнера запущен в своем простанстве имен, и не имеет доступ к внешней системе.
Control groups (контрольные группы)
Docker также использует технологию cgroups или контрольные группы. Ключ к работе приложения в изоляции, предоставление приложению только тех ресурсов, которые вы хотите предоставить. Это гарантирует, что контейнеры будут хорошими соседями. Контрольные группы позволяют разделять доступные ресурсы железа и если необходимо, устанавливать пределы и ограничения. Например, ограничить возможное количество памяти контейнеру.
Union File System
Union File Sysem или UnionFS — это файловая система, которая работает создавая уровни, делая ее очень легковесной и быстрой. Docker использует UnionFS для создания блоков, из которых строится контейнер. Docker может использовать несколько вариантов UnionFS включая: AUFS, btrfs, vfs и DeviceMapper.
Docker: введение
Docker – это открытая платформа, предназначенная для разработки, доставки и организации работы приложений.
Docker позволяет вам отделить ваши приложения от инфраструктуры так, чтобы вы могли доставлять ваше программное обеспечение максимально быстро. При помощи Docker вы можете управлять вашей инфраструктурой так же, как вы управляете вашими приложениями. Принимая все преимущества методологий Docker, направленных на доставку, тестирование и развертывание кода быстро, вы можете существенно сократить задержку между написанием кода и его работой на продуктиве.
Что такое платформа Docker?
Docker дает возможность упаковать и запустить приложение в слабо изолированном окружении, называемом контейнер. Изоляция и безопасность решения позволяют вам запускать множество контейнеров одновременно на нужном хосте. Благодаря легковесной природе контейнеров, без дополнительных затрат на гипервизор вы можете запускать больше контейнеров на доступном железе, чем если бы вы использовали виртуальные машины.
Docker предоставляет утилиты и платформу для управления жизненным циклом ваших контейнеров:
Что такое Docker Engine?
Docker Engine — это клиент-серверное приложение, содержащее следующие основные компоненты:
Консольный клиент использует Docker REST API для управления или взаимодействия с демоном Docker при помощи скриптов или непосредственных консольных команд.
Демон создает и управляет объектами Docker, такими как образы (images), контейнеры, сети и тома данных (data volumes)
На заметку: Docker распространяется под открытой Apache 2.0 лицензией.
Для чего я могу использовать Docker?
Быстрая, последовательная доставка ваших приложений
Docker может упростить жизненный цикл разработки, позволяя разработчикам работать в стандартизованных окружениях, используя локальные контейнеры, в которых может работать ваше приложение или сервисы. Вы также можете интегрировать Docker в ваши процессы непрерывной интеграции (continuous integration) и непрерывной доставки (continuous deployment).
Представьте следующий примерный сценарий. Ваши разработчики пишут код локально и делятся своей работой с коллегами при помощи контейнеров Docker. Они могут использовать Docker для помещения своих приложений в тестовые среды и запуска автоматических и ручных тестов. Когда разработчики находят проблему, они могут исправить ее в разработческом окружении и повторно поместить контейнеры в тестовое окружение. Когда же тестирование завершено, доставить исправление в ПО конечному заказчику становится также просто как положить новые контейнеры в продуктивное окружение.
Адаптивная доставка и масштабируемость
Использующая контейнеры платформа Docker позволяет хорошо переносить нагрузки. Контейнеры Docker могут работать на локальной машине разработчика, на физическом или виртуальном сервере в датацентре, в Облаке, или в смешанном окружении.
Переносимость и легковесная природа Docker также позволяют просто управлять нагрузкой, масштабировать приложения и сервисы вверх или вниз настолько быстро, насколько этого требует бизнес, почти в реальном времени.
Обслуживание больших нагрузок на том же самом железе
Docker легковесен и очень быстр. Он предоставляет жизнеспособную и экономически эффективную альтернативу виртуальным машинам, запускаемым в гипервизорах, позволяя вам использовать больше ваших вычислительных мощностей для достижения ваших бизнес целей. Это особенно важно при использовании его в очень уплотненных окружениях при доставке приложений малых или средних размеров там, где необходимо сделать больше меньшими усилиями.
Docker использует клиент-серверную архитектуру. Клиент Docker общается с Docker демоном, который обслуживает тяжеловесную сборку, работу, а также размещение ваших контейнеров. Демон и клиент Docker могут работать на одной системе или же клиент Docker может подключаться к удаленному Docker демону. Клиент и демон Docker взаимодействуют при помощи REST API, через UNIX сокеты или при помощи сетевого интерфейса.
Демон Docker работает на хостовом сервере. Пользователь использует клиент Docker для взаимодействия с демоном.
Клиент Docker в формате исполняемого файла docker — это основной пользовательский интерфейс для Docker. Он принимает команды и конфигурационные флаги от пользователя и взаимодействует с демоном Docker. Один клиент может взаимодействовать с множеством несвязанных демонов.
Для понимания внутренностей Docker вам необходимо знать про образы (images), реестры (registries) и контейнеры (containers).
Образ Docker — это шаблон в формате «только для чтения» с инструкциями для создания контейнера Docker. Например, образ может содержать в себе ОС Ubuntu с web-сервером Apache и вашим установленным внутрь web-приложением. Вы можете собрать или обновить образ с нуля, или загрузить и использовать образы, созданные другими людьми. Образ может быть основан или расширять один или более других образов. Образ Docker описан в текстовом файле Dockerfile, который имеет простой и вполне определенный синтаксис. Для получения большей информации о образах, смотрите «Как работают образы Docker?».
Образы Docker — это основной строительный компонент Docker.
Контейнер Docker — это запускаемый экземпляр Docker образа. Вы можете запустить, остановить, переместить или удалить контейнер, используя Docker API или консольный клиент. Когда вы запускаете контейнер, вы можете предоставить конфигурационные метаданные такие как сетевая информация или переменные окружения. Каждый контейнер — это изолированная и безопасная платформа для приложений, однако, ему может быть предоставлен доступ к ресурсам, работающим на другом хосте или контейнере, таким как постоянный сторадж (persistent storage) или база данных. Для получения большей информации о контейнерах, смотрите «Как работает контейнер?»
Контейнеры Docker — это рабочий компонент Docker.
Реестр Docker — это библиотека образов. Реестр может быть публичным, приватным, а также может быть установлен на том же сервере, что и демон или клиент Docker или же на совсем частном сервере. Для получения большей информации о реестре, смотрите Как работает реестр Docker?
Реестры Docker — это компонент распространения Docker.
Сервис Docker позволяет целому рою (swarm) Docker узлов работать одновременно, обслуживая определенное количество экземпляров реплицированной задачи (replica task), представляющей собой образ Docker. Вы можете определить количество одновременных запускаемых реплицированных задач и кластерный менеджер убедится, что нагрузка распределена You can specify the number of concurrent replica tasks to run, and the swarm manager ensures that the load is spread равномерно по рабочим узлам. Для конечного потребителя сервис Docker представляется как одно приложение. Docker Engine поддерживает режим работы swarm mode с Docker 1.12 и выше.
Сервисы Docker — это компоненты масштабирования Docker.
Как работают образы Docker?
Образы Docker — это шаблоны в формате «только чтение» из которых запускаются Docker контейнеры. Каждый образ состоит из последовательности слоев. Docker использует union file systems для объединения этих слоев в единый образ. Union FS позволяет файлам и директориям отдельных файловых систем известным как ветки (branches) быть прозрачно наложенными друг на друга, чтобы образовать единую связную файловую систему.
Эти слои одна из причин, почему Docker настолько легковесный. Когда вы изменяете образ Docker, например, в процессе обновления приложения на новую версию, собирается только новый слой, заменяет только тот слой, который обновляется. Остальные слои остаются нетронутыми. Для распространения обновления все, что вам нужно, это передать обновленный слой. Механизм работы со слоями увеличивает скорость распространения образов Docker. Docker сам определяет, какой слой должен быть обновлен в рантайме.
Образ определяется в Dockerfile. Каждый образ начинается с основного образа (base image), такого как ubuntu (основного образа ОС Ubuntu) или fedora (основного образа ОС Fedora). Вы можете также самостоятельно использовать доступные образы в качестве основы для новых, например, вам доступен базовый образ web-сервера Apache, и вы можете использовать его для всех образов ваших web-приложений. Базовый образ определяется при помощи ключевого слова FROM в Dockerfile.
Заметка: Docker Store — это публичный реестр и хранилище образов Docker
Образ Docker собирается на основе базового образа при помощи простого
The docker image is built from the base image using a simple, наглядного набора шагов, которые называются инструкциями, которые последовательно записаны в
Каждая инструкция создает новый слой внутри образа. Некоторые примеры инструкций Dockerfile:
Как работает реестр Docker?
Реестр Docker хранит Docker образы. После того как вы собрали Docker образ, вы можете отправить (push) его в публичный реестр, такой как Docker Store или приватный реестр, закрытый вашим межсетевым экраном. Вы можете также искать уже существующие образы и скачивать (pull) их из реестра на хост.
Docker Store позволяет вам не только хранить, но и покупать и продавать Docker образы. Например, вы можете купить образ Docker, содержащий приложение или сервис от какого-либо вендора программного обеспечения и использовать его в процессе разворачивания вашего приложения в тестовое, промежуточное или продуктивное окружение, а также обновлять его и ваше приложение просто скачивая (pull) новую версию доступных образов и переразворачивая ваши контейнеры.
Как работает контейнер?
В процессе своей работы контейнер использует Linux ядро хостовой машины, состоит из какого-то количества дополнительных файлов, которые были добавлены к нему в процессе его создания, а также метаданных, связываемых с контейнером в процессе его создания или когда контейнер уже запущен. Каждый контейнер собирается из образа. Образ определяет содержимое контейнера, какой процесс запустить, когда контейнер начинает работать, а также другие всевозможные подробности конфигурации. Образ Docker не изменяем. Когда Docker запускает контейнер из образа, он добавляет дополнительный слой поверх этого образа, который доступен для записи (при помощи UnionFS, как мы видели ранее).
Что происходит, когда вы запускаете контейнер?
Когда вы используете
консольную команду или эквивалентный API-вызов, клиент Docker Engine отдает задачу Docker демону на запуск контейнера. В этом примере клиент сообщает Docker демону инструкцию по запуску контейнера из образа Docker, используется, чтобы оставаться войти в контейнер в интерактивном режиме и запустить команду
Когда вы запускаете эту команду, Docker Engine выполняет следующие действия:
С текущего момента контейнер запущен. Вы можете управлять и взаимодействовать с ним, использовать сервисы и приложения, которые он предоставляет, а также при необходимости остановить и удалить его.
Docker написан на Go и использует несколько возможностей Linux ядра для реализации собственной функциональности.
Пространства имен (namespaces)
Docker использует технологию, называемую пространством имен (namespaces) для предоствления изолированного рабочего пространства, называемого контейнер. Когда вы запускаете контейнер, Docker создает набор пространств имен для этого контейнера.
Эти пространства имен организуют слой изоляции. Каждый аспект контейнера запускается в отдельном пространстве имен и его доступ ограничен этим пространством имен.
Docker Engine использует следующие пространства имен в Linux:
Группы управления (control groups)
Docker Engine в Linux также основывается на другой технологии, называемой группами управления
Каждая cgroup лимитирует приложение в доступе к определенному набору ресурсов. Группы управления позволяют Docker Engine разделять доступные аппаратные ресурсы между контейнерами и при необходимости применять лимиты и ограничения. Например, вы можете ограничить определенному контейнеру доступную оперативную память.
Файловая система Union или UnionFS — это файловая система, которая работает путем создания слоев, делая их оучень легковесными и быстрыми. Docker Engine использует UnionFS как «строительные блоки» для контейнеров. Docker Engine может использовать множество различных реализаций UnionFS, т.к. AUFS, btrfs, vfs, а также DeviceMapper.
Docker Engine объединяет пространства имен, группы управления и UnionFS в обертку (wrapper), называемую контейнерным форматом. Основной формат контейнеров — это
В будущем Docker возможно будет поддерживать другие форматы контейнеров, интегрируясь с такими технологиями как BSD Jails или Solaris Zones.




