Docker замечательно справляется с изолированием приложений и их окружений, облегчая распространение и репликацию состояний между различными средами (dev, test, beta, prod и т. д.). Его использование позволяет избавиться от проблемы «на моей машине все работает» и помогает с легкостью масштабировать приложение по мере его роста. Docker особенно хорош в том случае, когда у приложения много зависимостей или оно требует использования специфических версий библиотек и инструментов конфигурирования. В этой статье мы возьмем простое приложение на Rails и подготовим его для использования в Docker-контейнере («докеризуем»). Наше приложение будет написано под Rails 5; базу данных возьмем PostgreSQL. Если вы хотите подключить другую СУБД, то потребуется поправить несколько файлов. Вы можете воспользоваться заранее подготовленным шаблоном для создания приложения, которое сконфигурировано с помощью Dockerfile и config/database.yml: Для задания параметров базы данных мы воспользуемся переменными окружения. Они понадобятся позже для подключения к контейнеру с PostgreSQL. Отредактируйте файл конфигурации config/database.yml Если вы воспользовались приведенным выше шаблоном, то редактировать файл не нужно. Добавьте в config/database.yml переменные окружения: Наше приложение подготовлено, настало время для Docker. Начнем с создания Dockerfile. Это простой текстовый файл, в котором содержатся инструкции по созданию образа для приложения. Его используют для установки зависимостей, задания переменных окружения по умолчанию, копирования кода в контейнер и т. д. Для экономии дискового пространства я предпочитаю использовать базовый образ alpine-linux Ruby. Alpine linux — крошечный linux-дистрибутив, идеально подходящий для использования в контейнерах. В Docker доступен базовый образ ruby:alpine, которым мы и воспользуемся. Начнем с создания простого Dockerfile, который необходимо поместить в корневую директорию приложения. Если вы воспользовались приведенным выше шаблоном, то редактировать файл не нужно. А что если я не хочу использовать PostgreSQL? Если вы используете другую СУБД (например, MySQL), то для установки соответствующих пакетов потребуется внести изменения в Dockerfile. Произвести поиск необходимых пакетов можно с помощью следующей команды Docker: Поскольку Dockerfile уже готов, пора запустить сборку Docker-образа для нашего приложения: Собираем образ Образ готов, можно начинать! Запустите контейнер следующей командой: Мы передали команде docker run несколько аргументов: Хотя контейнер с приложением и запустился, попытка открыть ссылку localhost:3000, к сожалению, приведет к ошибке: У нас пока нет доступного приложению PostgreSQL-сервера. Сейчас мы это починим, запустив Docker-контейнер с PostgreSQL: Совет. Не забывайте, что в Docker один контейнер должен выполнять одну и только одну функцию. В нашем случае будет 2 контейнера: один для приложения и один для базы данных (PostgreSQL). Запуск нового контейнера с PostgreSQL Для остановки (и удаления) контейнера с приложением нажмите Ctrl+C, затем запустите новый контейнер с PostgreSQL: Флаг -d нужен для того, чтобы отсоединить контейнер от терминала, позволяя ему работать в фоновом режиме. Контейнер мы назовем mydbcontainer, это имя нам понадобится дальше. Использование однозадачных (Single–Task) контейнеров Docker-контейнеры предназначены для однократного употребления, а их однозадачная натура означает, что, как только они выполнили свою задачу, их останавливают и, может быть, удаляют. Они идеальны для разовых задач, таких как команды rails (например, bin/rails db:setup). Для настройки базы данных в mydbcontainer мы сейчас и выполним такую команду . Выполнение задачи rails db:migrate с использованием контейнера Для запуска копии контейнера с приложением выполните следующую команду. Затем запустите в контейнере bin/rails db:setup и выключите его. Обратите внимание: вам потребуется настроить переменные окружения для соединения с базой данных (они вставляются в config/database.yml, который вы ранее редактировали). Опция --link позволит подключиться к контейнеру с PostgreSQL (mydbcontainer), используя имя хоста db: Флаг --rm удалит контейнер после завершения его работы. После выполнения этой команды в контейнере mydbcontainer будет настроенная под нужны приложения база данных. Наконец-то мы сможем его запустить! Запуск приложения Давайте запустим еще один контейнер на основе образа нашего приложения. Обратите внимание на несколько дополнительных опций команды: Откройте в браузере страницу localhost:3000, где вы должны увидеть наше приложение, работающее полностью из-под Docker! Docker — это очень удобный инструмент разработчика. Со временем вы можете перенести в него все компоненты своего приложения (БД, redis, рабочие процессы sidekiq, cron и т. д.). Следующим шагом будет использование Docker Compose, предназначенного для описания контейнеров и способов их взаимодействия. Ссылки: CEO в Southbridge