Сборка, 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
, которая может обрабатывать фоновые задания, такие как отправка электронных писем с подтверждением новым зарегистрированным пользователям.