Сборка, Dockerize и развертывание приложения Rails и PostgreSQL

Вы научитесь разрабатывать приложения внутри Docker и развертывать их в Heroku, создав простое приложение для заметок на Rails / PostgreSQL. Если вы скопируете и вставите данные из этой статьи, вам даже не потребуется знать Rails, чтобы сделать это.

Все здесь должно применяться к другим фреймворкам веб-разработки, таким как Django.

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

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

Введение в Docker

Что такое докер?

Docker - это виртуализация на уровне ОС, которая позволяет отделить приложения от среды с помощью контейнеризации.

Контейнеры поставляются с библиотеками и зависимостями, упакованными вместе и запускаемыми на любой другой машине Linux.

Если вы раньше использовали Vagrant, VirtualBox или VMWare, вы найдете Docker легче и быстрее.

Почему Docker меняет правила игры?

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

Создайте простое приложение с помощью Docker

Перейдите в каталог, в котором вы пишете код, и создайте новый каталог для этого проекта. Мы назовем нашу rails-on-docker.

mkdir rails-on-docker

cd в каталог проекта и откройте его в своем любимом редакторе кода. Как обычно, использую Атом.

cd rails-on-docker
atom .

Dockerfile

Dockerfile определяет зависимости и содержит команды, создающие образ. Контейнер - это экземпляр изображения. Запуск docker images в командной строке отобразит все локальные изображения.

Создайте Dockerfile.

touch Dockerfile

И вставьте следующее:

Gemfile

Gemfile описывает зависимости для программы Ruby. Создайте Gemfile.

touch Gemfile

И вставьте следующее:

source 'https://rubygems.org'
gem 'rails', '~>5'

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

Gemfile.lock

Создайте Gemfile.lock без ничего. В этом файле Bundler отмечает точные версии установленных библиотек Ruby. При разработке на Rails вы обычно никогда не касаетесь этого файла, но Docker требует этого.

touch Gemfile.lock

entrypoint.sh

Создайте entrypoint.sh. Это устраняет проблему Rails, которая препятствует перезапуску сервера, если существует server.pid.

touch entrypoint.sh

Вставьте следующее. Это удаляет server.pid процесс, если он существует; в противном случае сервер не сможет запуститься.

docker-compose.yml

docker-compose.yml описывает службы в вашем приложении, например web, db или redis, которые при сборке оказываются в отдельных контейнерах. Создайте этот файл.

touch docker-compose.yml

Вставьте следующее:

Создайте приложение

Запустите это, чтобы создать приложение. Это создает образ для Интернета, а затем запускает rails new внутри контейнера.

docker-compose run web rails new . --force --no-deps --database=postgresql

Обратите внимание, что вам нужно добавить к любой традиционной команде Rails, например, rake..., префикс docker-compose run web.

Теперь, когда у нас есть новый Gemfile, снова создайте образ.

docker-compose build

В приложении Rails обновите /config/database.yml, чтобы он выглядел, как показано ниже:

Обратите внимание, что url: <%= ENV[‘DATABASE_URL’] %> очень важен для производства, поскольку DATABASE_URL - это имя, которое Heroku дает URL-адресу базы данных после добавления надстройки Postgres.

Создайте базу данных.

docker-compose run web rake db:create

Запустите приложение.

docker-compose up

На этом этапе вы должны быть в состоянии перейти по адресу http: // localhost: 3000 в локальном браузере и увидеть, как работает приложение.

Чтобы остановить приложение, запустите docker-compose down или просто завершите запущенный процесс в терминале.

Разверните базовое приложение в Heroku

Для этого потребуется учетная запись Heroku.

Войдите в Heroku из командной строки. Затем войдите в реестр контейнеров Heroku.

heroku login
heroku container:login

Создайте приложение на Heroku для своего приложения. Обратите внимание на название приложения, которое оно дает вам, когда вы это делаете. Он понадобится вам позже, чтобы настроить правильное приложение в консоли Heroku. Имена обычно причудливые - мое serene-stream-37066.

heroku create

Создайте образ и поместите его в реестр контейнеров. Это может занять до десяти минут (если у вас такой же медленный домашний Интернет, как у меня) при первом запуске. Но последующие запуски занимают считанные секунды.

heroku container:push web

Предыдущая команда поместила изображение на Heroku. Теперь загрузите изображение в свое приложение на Heroku. Перенаправляйте на него трафик.

heroku container:release web

Откройте приложение в вашем браузере.

heroku open

О нет. Наше приложение работает на Heroku, но у нас возникла проблема. Это потому, что нам нужно сделать еще кое-что.

Добавьте надстройку Postgres в Heroku. Перейдите к Heroku и щелкните созданное вами приложение.

Щелкните Ресурсы.

В разделе "Ресурсы" выполните поиск "postgres" и щелкните Heroku Postgres.

Добавьте его в свое приложение. Щелкните Provision.

Помните, когда мы ранее устанавливали <%= ENV[‘DATABASE_URL’] %> в нашем приложении Rails? Heroku теперь установит URL-адрес этой базы данных как переменную среды с ключом DATABASE_URL.

Итак, мы можем обновить наше приложение, и вуаля!

Обновите приложение Rails

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

Как бы сильно я ни ненавидел строительные леса Rails (слишком бесполезно), используйте их для быстрого создания экземпляра модели, представлений и файла миграции для нашего приложения.

Обратите внимание, что перед этим стоит команда docker-compose run web.

docker-compose run web rails g scaffold Note header:string body:string

Теперь измените /config/routes.rb, чтобы он выглядел, как показано ниже. Это устанавливает для представления индекса Notes корневой URL-адрес приложения.

Rails.application.routes.draw do
  resources :notes
  root 'notes#index'
end

Теперь перестройте развертывание и укажите в производстве новый образ.

heroku container:push web
heroku container:release web

Перенести базу данных на Heroku. Это необходимо, потому что мы отправили файл миграции.

heroku run rake db:migrate

Если вы хотите выполнять миграции локально, вы должны сделать docker-compose run web rake db:migrate.

И просмотрите приложение на Heroku.

heroku open

Бум! Теперь создайте заметки, чтобы отпраздновать это (и убедиться, что это работает).

Заключение

Вы сделали это! Вы создали приложение Rails, поместили его в контейнер и развернули в Heroku. Хотя это очень простое приложение, теперь у вас есть структура для того, что делает Docker и как его использовать.

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