Rails: DockerでHeroku的なデプロイソリューションを構築する: 前編(翻訳)

概要 原著者の許諾を得て、CC BY-NC-SAライセンスに基づき翻訳・公開いたします。 英語記事: Creating a Heroku-like Deployment Solution with Docker 原文公開日: 2017/06/07 著者: Pedro Cavalheiro サイト: Semaphoreci.com 記事のボリュームが大きいので前編/後編に分割しました。後編は来週公開予定です。 Rails: DockerでHeroku的なデプロイソリューションを構築する: 前編(翻訳) Herokuライクなデプロイソリューションの構築方法を解説します。 特定のクラウドプロバイダや、Dockerと無関係なツールを必要としません。 はじめに 本チュートリアルでは、Herokuにデプロイする感覚でソフトウェアをシンプルに自動デプロイするツールの作成方法をご紹介します。デプロイごとのバージョン管理にはDockerを使い、アップグレードやロールバックをやりやすくします。また、アプリの継続的デプロイ(CD)に弊社のSemaphoreも使います。 コンテナは任意のDocker Registryにホスティングできます。アプリの実行に必要なのはDockerがインストールされているホストだけです。 チュートリアルを終えると、サンプルアプリをリモートホストにHerokuと同じようにデプロイできるシンプルなRuby CLIスクリプトが使えるようになります。直前のバージョンへのロールバック、ログの追加、実行中のアプリのバージョントラッキングを行えるコマンドもあります。 本チュートリアルはデプロイ手順を中心に据えていますので、用途に応じて環境を調整すれば任意のアプリで使えます。ここではシンプルなHello WorldをRuby on Railsでblogフォルダに構築します。Railsアプリ構築の初歩については、RailsガイドのRails をはじめようの手順1〜4をご覧ください。 必要なもの Docker: ホストと、アプリをデプロイするすべてのマシンにDockerがインストールされ、動作している必要があります。 Docker Registryのアカウント(Docker Hubなど) SSHアクセスが可能でDockerがインストールされているクラウドプロバイダ(AWS EC2など) Ruby 2.3: アプリをデプロイするすべてのマシンにインストールされている必要があります。 デプロイの手順 デプロイの手順は次の5つで構成されます。 ビルド: いつでも変更可能なビルド手順を備えた独自のコンテナをアプリごとにビルドします。 アップロード: アプリのコンテナのビルドが終わったらDocker Registryに送信する必要があります。初回はコンテナ全体のアップロードが必要なので多少時間がかかりますが、次回からはDockerのレイヤシステムでサイズや帯域を節約できるので速くなります。 接続: Docker Registryにコンテナを送信したら、次の手順を行うためにホストに接続します。 ダウンロード: ホストに接続したら、コンテナをダウンロードします。 再起動: 最後の手順では、アプリを停止し、続いて停止時と同じ設定(ポート、ログ、環境変数など)で新しいコンテナを起動します。 手順の概要を把握できたので、作業を開始しましょう。 1. コンテナのビルド この例では、アプリを実行するコンテナを1つ使います(Rubyはコンパイル言語ではないのでいわゆるビルドは不要です)。この場合のDockerファイルは次のとおりです。 FROM ruby:2.3.1-slim COPY Gemfile* /tmp/ WORKDIR /tmp RUN gem install bundler &&\ apt-get update &&\ apt-get install -y build-essential libsqlite3-dev rsync nodejs &&\ bundle install –path vendor/bundle RUN mkdir -p /app/vendor/bundle WORKDIR /app RUN cp -R /tmp/vendor/bundle vendor COPY application.tar.gz /tmp CMD cd /tmp &&\ tar -xzf application.tar.gz &&\ rsync -a blog/ /app/ &&\ cd /app &&\ RAILS_ENV=production bundle exec rake db:migrate &&\ RAILS_ENV=production bundle exec rails s -b 0.0.0.0 -p 3000 スクリプトを整理するために、Dockerfileはアプリの1つ上のフォルダ階層に置きます。次のような構成になります。 . ├── Dockerfile ├── blog │   ├── app │   ├── bin … (アプリのファイルやフォルダ) Dockerfileの各行について解説します。 FROM ruby:2.3.1-slim これはコンテナのビルドに使うベースイメージです。Rubyがインストールされている必要があるので、自分で全部インストールするよりもプレインストール済みのコンテナを使う方が楽です。 COPY Gemfile* /tmp/ WORKDIR /tmp ここでは、GemfileとGemfile.lockをコンテナの/tmpディレクトリにコピーし、次のコマンドを実行する/tmpに移動しています。 RUN gem install bundler &&\ apt-get update &&\ apt-get install -y build-essential libsqlite3-dev rsync nodejs &&\ bundle install –path vendor/bundle このRubyイメージのbundlerは古いので、warning表示を避けるためにアップデートしています。本チュートリアルで使われているのとは別のアプリで作業する場合は、他にもいくつかのパッケージ(多くはコンパイラ)が必要になるでしょう。最後にGemfileのgemをすべてインストールします。 Dockerの各コマンドは(layerなど)、コマンドの結果が同じ場合に再実行を避けるためにキャッシュされます。これで多少時間を節約できます。–pathフラグは、すべてのgemをローカルの定義済みパス(vendor/bundle)にインストールするよう指示します。 RUN mkdir -p /app/vendor/bundle … Continue reading Rails: DockerでHeroku的なデプロイソリューションを構築する: 前編(翻訳)