Docker для разработчиков Rails

Роб Айзенберг

 Состав исполнителей

Издания на английском языке
Автор
Роб Айзенберг
Издатель
Энди Хант
Вице- президент по производственной деятельности
Джэйнет Фарлоу
Старший редактор
Сьюзан Коунант
Редактор- консультант по аудитории
Ааоуби Оуби Талтон
Литературный редактор
Николь Абрамовиц
Составитель индекса
Potomac Indexing, LLC
Макет
Gilson Graphics

 Первые похвалы нашей книге

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

Найгелю Лоури

Директор компании и главный консультант, Lemmata

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

Крис Джонсон

Руководитель работ, healthfinch

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

Ирин Дис

Ведущий программный инженер, New Relic

Эта книга намного больше чем просто инструкции с наилучшими техническими текстами, которые я когда либо видел. Отличное руководство Айзенберга даёт чёткие и понятные пояснения относительно того как решать специфичные для Rails задачи в DevOps Docker. Именно такую вещь я давно хотел бы видеть опубликованной Docker.

Дэйвид Л. Бин, доктор философии

Директор по науке о данных, PayClip, Inc.

Docker for Rails Developers это намного больше чем просто фантастический ресурс для разработчиков Ruby и Rails, стремящихся освоить Docker. Это отличное, простое руководство о том как применять данную технологию в практических ситуациях реального мира, и я без колебаний рекомендую её даже разработчикам Python или Node. Начиная с 2014 я жду в свои руки какую- нибудь компетентную книгу для тех кто интересуется Docker и она именно то что нужно.

Александер Линхэм

Владелец, envoys.io

 Благодарности

Спасибо Адаоби, моему редактору из Pragmatic Bookshelf за её постоянный позитив и поддержку, а также за отличные редакционные отзывы по этой книге, которые способствовали её созданию настолько хорошей, насколько это только возможно. Я буду скучать по нашим обновлениям и общению обусловленных нашей общей страстью к Гордону Рамзи.

Я очень благодарен всем ниже перечисленным, которые уделили своё драгоценное время чтению и предоставлению отзывов о книге (тысяча извинений если кого-то упустил):

  • Джон Поль Ашенфилтер

  • Дэйвид Л. Бин

  • Ирин Дис

  • Крис Джонсон

  • Дэйвид Ландри

  • Найгель Лоури

  • Алекс Линхэм

  • Роури МакКюн

  • Ноэль Раппин

  • Крис Тёрн

  • Джон Итис

Книга стала несоизмеримо лучше благодаря их усилиям.

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

Наконец, я выражаю гигантскую благодарность всей команде Pragmatic Bookshelf за тот труд, который они взвалили на себя своей участью.

 Введение

Если вы влюблены в Ruby on Rails, вы способны полюбить и Docker. Это родственные души, рождённые схожими идеалами.

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

Docker выполняет для DevOps то, что Rails сделал для веб разработки. Он также содержит Великие идеи: некое целостное представление о вашем приложении (подскажем: ваше приложение это нечто большее чем просто ваш код Rails), контейнеризацию (более простую и более эффективную чем у виртуальных машин), далеко не отстойную доставку программного обеспечения (к примеру, Ruby устанавливается при самом первом запуске сценария Ruby), отказоустойчивую кластеризацию и масштабирование сразу после приобретения (ускоренная разработка кластеров промышленного уровня на вашем локальном компьютере), встроенные функции безопасности уровня эксперта (например, автоматическая ротация ключа). Этот перечень можно продолжить.

Docker снижает порог на вступление, придавая в ваши руки те задачи DevOps, которые ранее были бы немыслимы. Это снабжает нас неким новым набором суперспособностей.

Тем не менее, Docker не панацея и не серебряная пуля для решения всех ваших проблем DevOps. Как и во всех технологиях, здесь существуют компромиссы (я постараюсь указывать на них по ходу дела). Однако, несмотря на все компромиссы, как вы выясните из данной книги, есть смысл приспособиться к Docker.

 Что такое Docker?

Docker, как технология, это некий набор инструментов выстраиваемых вокруг основной идеи упаковки и запуска программного обеспечения в небольшой среде песочницы, именуемой контейнерами (мы доберёмся до их мелочей в Что такое контейнер?)

На самом верхнем уровне Docker предоставляет пять возможностей:

  • Упаковку. Способность паковать программное обеспечение в повторно используемом, совместно применяемом формате, именуемым образами.

  • Распространение. Возможность простого разделения упакованного программного обеспечения (образов) с прочими людьми и развёртывания в различных машинах.

  • Возможности времени исполнения. Способность запуска, приостановки, перезапуска или останова упакованного программного обеспечения надёжным и повторяемым образом.

  • Создание инфраструктуры. Создание виртуальных машин готовых к запуску наших контейнеров Docker/

  • Оркестрация и масштабирование. Управление вашим изданием программного обеспечения в отдельном узле Docker или же в рамках целого кластера.

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

 Зачем нам Docker?

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

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

  • Целостного взгляда на ваше приложение. Прикладная программа Rails требует базы днных и прочих внешних зависимостец подобных Redis и Elasticsearch. С помощью Docker эти зависимости больше не являются чем- то запоздалым или "дополнительным", как в Heroku; они определяются и управляются как основополагающая часть вашего прикладного приложения.

  • Установка и настройка приложений единственной командой. Вы когда- нибудь устанавливали приложение Rails на своей машине и тратили при этом слишком много времени устанавливая особые версии его программных зависимостей? Встроенный механизм Docker доставки означает, что новые участники команды могут поднять с нуля некое исполняемое приложение за минуты. Никаких трудоёмких, подверженных ошибкам, выполняемым вручную щагов по установке в этом случае.

  • Простое управление версиями зависимостей. Желаете быть уверенным что всё работает прежде чем переключиться на некую новую версию Ruby или обновить свою базу данных? Нет проблем: запуск контейнеров чрезвычайно экономичен. Просто измените версию своего образа и всё готово.

  • Гигантская экосистема Docker. Зачастую нам требуется объединяться с прочими технологиями как частью своего прикладного приложения Rails: NGINX, Redis, Postgres, MySQL, Memcached, Elasticsearch, HAProxy, RabbitMQ, Node и так далее. Всё это и даже ещё больше уже упаковано для того чтобы идти вместе с Docker.

  • Локальная имитация сред подобных промышленным. Нам известно, что то как наши приложения выполняются при разработке, это не то же самое в точности что поисходит при промышленной эксплуатации. С применением Docker вы способны эмулировать промышленные сценарии запуская свои прикладные приложения в подобных промышленным средам со множеством узлов в своей локальной машине.

Docker также может помочь когда вы выходите за рамки разработки. Он предоставляет некий согласованный интерфейс где бы вы не осуществляли выполнение локально, в сервере непрерывной интеграции (CI, continuous integration) или при развёртывании в промышленное применение. Будучи построенным единожды, один и тот же образ исполняется на всех стадиях вашего конвейера непрерывной интеграции/ доставки, снабжая нас уверенностью в том, чтоо наше проверенное приложение будет исполняться тем же самым образом во всех средах.

Если вам требуется управлять вашей собственной промышленной инфраструктурой и развёртывать её, имеются и дополнительные преимущества:

  • Стандартное развёртывание. Docker предоставляет некий стандартный способ упаковки и доставки приложений: все части вашего прикладного приложения являются неким контейнером и всякое прикладное приложение является некой коллекцией контейнеров. С точки зрения DevOps, одно прикладное приложение Docker развёртывается и управляется тем же самым способом что и всякое иное.

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

  • Снижение стоимостей инфраструктуры, в особенности в масштабе. Контейнеры обладают гораздо меньшим весом нежели виртуальные машины (ВМ), позволяя более действенно использовать ресурсы. Они также допускают выполнять вертикальное масштабирование большого числа контейнеров в каком-то отдельном хосте вместо того чтобы раскручивать целиком некий новый экземпляр.

  • Место для роста. Если ваше прикладное приложение является (или начинает становиться) широко успешным, приятно сознавать, что Docker прошёл масштабные боевые испытания. К примеру, Google Compute Engine построен на контейнерах Docker с применением инструмента оркестврации с открытым исходным кодом Google, Kubernetes.

 Для кого эта книга?

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

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

Если вам интересно изучить как Docker может соответствовать вашим повседневным рабочим потокам для разработки Rails, вы попали в правильное место.

 Что охватывает эта книга?

В I части вы изучите всё что вам требуется знать об использовании Docker для локальной разработки Docker, включая такие центральные понятия как контейнеры и образы. Вы шаг за шагом выстроите знания из реальной жизни посредством неких последовательностей практических задач. Мы начнём с основ - исполнения некого сценария Ruby и выработки некого нового проекта Rails - прежде чем изучать как запускать наше собственное прикладное приложение построением своего собственного индивидуального образа.

Мы быстро перейдём к Compose, некому инструменту Docker верхнего уровня для декларативного описания прикладного приложения целиком и того как всё это подгонять вместе. По мере дальнейшего изучения мы поступательно поднимаем уровень вверх до служб подобных базам данных и Redis. Мы обсудим как настраивать и запускать ваши проверки с тем чтобы вы были полным профессионалом в применении разработки Docker для Rails.

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

 Как читать книгу?

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

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

[Замечание]Идентификаторы Docker и следите за собой

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

 Какие операционные системы поддерживаются?

Хотя Docker и поддерживает все основные платформы (macOS, Windows и Linux) - и мы будем руководить вами на протяжении процесса установки его в них в Устанавливаем Docker - существуют некоторые незначительные различия между этими платформами, в особенности вокруг файловых полномочий и работы с сетями.

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

[Предостережение]Рекомендуюся некие знания Linux/ Unix

Даже при использовани Docker в Windows или Mac, несомненно необходимо понимать некие основы Linux. Docker развивается из свойств ядра Linux, поэтому пояснения и примеры зачастую полагаются на понятия и программы Linux. Я намерен полагаться на то, что у вас уже имеются эти знания. Если это не так, существует множество изобилие свободных интернет ресурсов, которые вы можете применять для дополнительного изучения или чтобы освежить в памяти.

 Интернет ресурсы

Вы можете найти полезные ресурсы, относящиеся к данной книге в интернете, включая:

  • Используемый на протяжении данной книги исходный код (вы свободно можете применять это любым способом как пожелаете)

  • Страница ошибок, которая перечисляет исправления для текущей редакции

Давайте приступим!

 Содержание

Предисловие
Что такое Docker?
Зачем нам Docker?
Для кого эта книга?
Что охватывает эта книга?
Как читать книгу?
Какие операционные системы поддерживаются?
Интернет ресурсы
Часть 1. Разработка
Глава 1. Новый мир храбрых
Устанавливаем Docker
macOS
Linux
Windows
Проверьте свою установку
Прежде чем вы начнёте
Что такое контейнер?
Что такое образ?
Исполнение некого сценария Rails без установленного Ruby
А что так долго?
Убираем за собой
Генерация нового прикладного приложения Rails без установленного Ruby
Беглый обзор
Глава 2. Исполнение прикладного приложения Rail в контейнере
Как нам исполнять своё прикладное приложение Rails?
Определение нашего первого пользовательского образа
Собираем всё воедино
Построение нашего образа
Запуск сервера Rails при помощи нашего образа
Добираемся до прикладного приложения: публикация портов
Связывание сервера Rails с IP адресом
Беглый обзор
Глава 3. Тонкая настройка нашего образа Rail
Именование и сопровождение версий для нашего образа
Команда по умолчанию
Игнорирование ненужных файлов
Кэширование собранного образа
Проблема кэширования 1: Обновление пакетов
Проблема кэширования 2: Ненужные установки Gem
Трюк с кэшированием Gemfile
Последний штрих
Беглый обзор
Глава 4. Декларативное описание нашего прикладного приложения с помощью Docker Compose
Приступая к работе с Compose
Запуск нашего прикладного приложения
Монтирование локального тома
Запуск и останов служб
Прочие общие задачи
Просмотр журналов контейнера
Исполнение одноразовых команд
Повторное построение наших образов
Убираем за собой
Беглый обзор
Глава 5. За рамками прикладного приложения: добавляем Redis
Запуск сервера Redis
Применение docker run
Подключение к серверу Redis вручную
Как контейнеры общаются друг с другом
Наше прикладное приложение Rails общается с Redis
Установка Gem Redis
Обновление нашего приложения Rails для использования Redis
Запуск всего прикладного приложения целиком при помощи Docker Compose
Беглый обзор
Глава 6. Добавляем базу данных: Postgres
Запуск сервера Postgres
Подключение к Postgres из отдельного контейнера
Подключение нашего прикладного приложения Rails к Postgres
Установка Gem Postgres
Создание базы данных нашего приложения
Перезапуск нашего сервера Rails
Практическое применение базы данных
Отделение данных от контейнера
Беглый обзор
Глава 7. Достойное выступление с JavaScript
Варианты интерфейса JavaScript
Интерфейс JavaScript Rails с помощью Webpacker
Компиляция ресурсов при помощи Webpacker
Прикладное приложение React Hello World
Беглый обзор
Глава 8. Проверка в среде Docker
Настройка RSpec
Наша первая проверка
Установка системы проверок Rails
Выполнение проверок, основанных на JavaScript
Настройка системных проверок RSpec
Просмотр исполнения проверок
Выхолощенный просмотр браузером
Отладка
Беглый обзор
Глава 9. Расширенное управление Gem
Тёмная сторона имеющегося у нас подхода
Применение тома кэширования Gem
Беглый обзор
Глава 10. Некое незначительное брюзжание
Rails tmp/pids/server.pid не очищается
Составляйте периодические прерывания при помощи Ctrl-C
Беглый обзор
Заключительные мысли относительно Docker в разработке
Часть 2. Вперёд в производство
Глава 11. Промышленный ландшафт
Те самые Ops из DevOps
Оркестрация контейнеров
Сказка о двух оркестрациях: Swarm и Kubernetes
Сопоставление IaaS и CaaS
Предоставление вашей инфраструктуры
Машина Docker
Chef, Puppet и Ansible
Terraform
Платформы CaaS
Amazon Elastic Container Service
Google Kubernetes Engine
Amazon ECS для Kubernetes
Azure Kubernetes Service
Выбор между этими платформами CaaS
Безсерверная работа с контейнерами
AWS Fargate
Microsoft Azure Container Instances
Как определять что правильно для меня?
Беглый обзор
Глава 12. Подготовка к промышленному применению
Настройка промышленной среды
Промышленный образ: предварительная компиляция активов
Разделяемые образы
Беглый обзор
Глава 13. Подобная промышленной площадка
Создание машин
Введение в Swarm Docker
Наш первый Swarm (в одном узле)
Определение нашего прикладного приложения в Swarm
Миграция имеющейся базы данных
Развёртывания нашего прикладного приложения в Swarm
Задачи и модель масштабирования Swarm
Расширение имеющейся службы
Беглый обзор
Глава 14. Развёртывание в облаке
Создание кластера DigitalOcean
Развёртывание нашего Swarm DigitalOcean
Визуализация контейнеров
Расширение веб службы
Развёртывание AWS вместо DigitalOcean
Беглый обзор
Глава 15. Заключительные мысли и последующие шаги
Что мне следует изучать далее?
Ограниченные ресурсы
Автоматическое масштабирование
Нулевое время простоя, сине- зелёные развёртывания
Безопасность
Более современные архитектурные возможности
Управление ключами безопасности
Перезапуск в случае отказа
Многоэтапные сборки
Статистические данные Docker
Совместное использование файлов настройки между файлами Compose
Устойчивость базы данных
Контейнеры в автопилоте
Репликация базы данных и высокая доступность
Дополнение A. Различия платформ
Владельцы файлов и полномочия
Дополнение B. Поиск образа для применения
Применение Docker Hub
Применение Docker CLI
Дополнение C. Как применять Django, PostgreSQL и Docker
Установка Docker
Проект Django
Docker (опять)
Образы и контейнеры
Обновление на PostgreSQL
Запуск Docker
Беглый обзор
Рекомендуемые ресурсы
Дополнение D. Как создать контейнер Docker с ускорением RDMA приложений поверх сетевой среды 100Gb InfiniBand
Ссылки
Обзор установки
Оборудование
Логическая архитектура сервера
Обвязка сервера
Настройка сетевой среды
Руководство по развёртыванию
Предварительные требования
Обновление программных пакетов Ubuntu
Включение диспетчера подсетей в коммутаторе IB
Установка Mellanox OFED для Ubuntu в качестве хоста
Выгрузка Mellanox OFED
Установка Mellanox OFED
Установка и настройка Docker
Деинсталяция старых версий
Установка Docker CE
Установка с применением репозитория
Настройка самого репозитория
Установка Docker CE
Персонализация моста docker0
Настройка взаимодействия с внешним миром
Добавление маршрута IP с определённой подсетью
Быстрая проверка
Создание или вытаскивание пула базового образа и запуск контейнера
Вариант 1
Вариант 2
Вариант 3
Эталонное тестирование
Указатель