Docker — замечательный инструмент, и я думаю, он окажет большое влияние на нашу разработку. Но, если у вас не было большого опыта работы с контейнерами Linux (или виртуальными машинами), основные идеи Docker, а также его преимущества могут оказаться немного сложными для понимания.
В этой статье вы узнаете, что такое Docker, как он работает, и немного о том, как он связан с Ruby / Rails.
Виртуальные машины и контейнеры Linux
Скажем, мы хотим запустить дистрибутив Linux внутри машины с Windows 7 (или наоборот). Мы можем использовать виртуальную машину, чтобы сделать это.
По сути, виртуальные машины создают среду внутри операционной системы (в нашем примере Windows 7 — она называется хост-ОС), внутри которой может «жить» другая операционная система (в нашем примере — дистрибутив Linux, гостевая ОС). Однако полностью изолировать гостевую операционную систему непросто. На самом деле, это настолько сложная проблема, что долгое время ее считали невозможной. Однако теперь у нас есть несколько разных реализаций гипервизора виртуальных машин.
Существует две разные философии виртуализации: полная виртуализация и паравиртуализация .
Полная виртуализация — это когда гостевая операционная система не подозревает, что она работает в виртуализированной среде. Очевидным преимуществом этого является то, что операционная система не нуждается в модификации для ее виртуализации. Однако есть и существенные недостатки, одним из которых является то, что иногда гостевым операционным системам необходимо знать информацию о виртуализированном и реальном оборудовании.
Паравиртуализация, с другой стороны, требует небольших модификаций гостевых операционных систем в обмен на повышение эффективности и прозрачности. Паравиртуализация — это термин, впервые упомянутый в проекте виртуализации Denali, из которого возникла концепция. Сегодня существует множество различных вариантов виртуализации: Xen, VMWare и т. Д. Если вы хотите узнать больше о виртуальных машинах, ознакомьтесь с исследовательской статьей Xen , которая довольно доступна, если у вас есть немного знаний о дизайне операционной системы.
Виртуальные машины позволяют нам легко разделять ресурсы сервера. Amazon EC2 в основном управляется виртуальными машинами на базе мощных аппаратных серверов. Мы все знаем, что сделали провайдеры PaaS для того, что раньше было сложным и дорогим процессом развертывания. Но виртуальные машины несут много накладных расходов — у вас есть файловая система, периферийные устройства и т. Д.
Контейнеры (см. Следующий раздел) немного похожи на легкие виртуальные машины, потому что они используют одну и ту же базовую операционную систему. Однако процессы могут быть полностью изолированы от остальной части операционной системы.
Контейнеры, chroot и Docker
Основная идея контейнеров заключается в том, что процессы внутри контейнера выполняются в отдельной корневой файловой системе / каталоге. По сути, это означает, что процессы могут создавать свои собственные файлы / каталоги, полностью независимые от операционной системы хоста и других контейнеров в той же системе (если таковые имеются).
В nix-системах есть операция , называемая chroot, которая может это сделать. По сути, он позволяет запускать программу, но с другим корневым каталогом. Таким образом, вы можете запустить команду «useradd» с корневым каталогом «~ / any», и если вы попытаетесь запустить «ls», вы обнаружите, что bash попытается найти «ls» в «~ / everything / bin» / ls », а не« / bin / ls ».
Преимущество этого состоит в том, что вы можете разделить базовую файловую систему на множество различных корневых файловых систем, причем разные процессы выполняются в каждом фрагменте, так что процессы могут быть разделены. Однако это не решает всей проблемы; у вас все еще есть только один сетевой стек, и весь этот процесс невероятно утомителен и раздражает.
Контейнеры для Linux выросли из chroot и некоторых его недостатков. Но, как и многие вещи, связанные с Linux, контейнеры могут быть немного сложны для практического использования. Итак, пришел Docker и сделал Linux Containers удивительным и удобным для людей, которые не хотели тратить кучу времени на изучение тонкостей системы Linux Container. У Docker есть несколько замечательных функций, в том числе: изоляция файловой системы, сети и ресурсов, ведение журналов и (личный фаворит) интерактивная оболочка.
Docker позволяет вам создавать контейнеры, которые вы можете переносить с рабочей станции на сервер и ожидать, что он будет работать на сервере одинаково (потому что все изолировано).
Картинки
Очевидно, чтобы сделать что-нибудь полезное для контейнера (в отличие от нашего примера chroot выше), вам нужен базовый набор утилит, таких как «ls», «mkdir» и т. Д. Docker позволяет вам иметь изображения, которые предоставляют этот набор двоичных файлов. Затем вы можете использовать команду «docker run» или файл конфигурации Docker, чтобы подробно описать, что вы хотите, чтобы ваш контейнер делал (например, установить rvm, установить ruby, запустить ваш код и т. Д.).
Очевидно, что для написания всех этих конфигурационных файлов требуется много работы. Если подумать, то каждый, кто использует Rails, вероятно, использует примерно одинаковые макеты контейнеров. К счастью, кто-то уже решил эту проблему для нас.
Докку
Докку абсолютно фантастический. Это мини-Heroku длиной менее 100 строк кода Bash! Он использует докер под капотом для создания и управления контейнерами Linux. Вы можете установить его в стиле установщика «pipe to bash» (за что я выразил свое отвращение в прошлом; вы добавляете неизвестный код в приглашение оболочки, что тоже с правами пользователя root):
wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash
Вы можете развернуть приложение с помощью git, просто нажав:
git remote add dokku git@HOSTNAME:APPNAME
git push dokku master
Это решает действительно важную проблему (на мой взгляд) — вы можете получить простоту Heroku с одним экземпляром EC2 или DigitalOcean! Раньше это было довольно раздражающей процедурой для каждого нового приложения, которое вы хотели развернуть в EC2.
Завершение
Надеемся, что это прояснит несколько моментов о Linux-контейнерах, что такое Docker и какие преимущества он дает нам как веб-разработчикам. Я считаю, что сайт docker.io довольно кратко знакомит с этой концепцией — эта статья надеется восполнить пробел.