Dockerを使用してRailsアプリケーションをデプロイする

はじめに



この投稿では、Ruby On RailsアプリケーションをDigitalOceanサーバーにデプロイして、別のDockerコンテナーで動作させる方法について説明します。 簡単にするために、Dockerコンテナー内にRailsアプリケーションをデプロイするプロセスを詳細に説明します。

この投稿では:



サーバーにインストールすることから始めましょう。



サーバーにDockerをインストールする



最初に、DigitalUceanに新しいUbuntu 14.04をダウンロードし、Dockerをインストールしました。

workstation $ ssh root@178.62.232.206 server $ apt-get install docker.io server $ docker -v Docker version 1.0.1, build 990021a
      
      





Dockerfileおよびnginx.conf



次に、RailsアプリケーションからDockerイメージをアセンブルする必要があります。 Jeroen(Jeroen van Baarsen、およそTransl。)が先週、Railsアプリケーション用にDockerイメージをどのように組み立てたについて書いたことがありました 。 私は彼の投稿をさらなるステップの基礎として使用します。

アプリケーションを後でホストするのと同じサーバーでイメージを収集します。 アプリケーションをパブリックドメインに入れたくないので、これを行うことにしました。そのため、パブリックDockerリポジトリはこのための悪い選択肢です。 自分用にプライベートリポジトリを設定することもできますが、それをサポートする必要がありますが、現時点ではそれを行いたくありません。 この投稿では、Dockerを使用してアプリケーションをホストする最も簡単な方法について説明します。

次のDockerfileおよびnginx.conf構成ファイルをintercity-websiteプロジェクトに追加しました。



Dockerfile


 FROM phusion/passenger-ruby21 MAINTAINER Firmhouse "hello@firmhouse.com" ENV HOME /root ENV RAILS_ENV production CMD ["/sbin/my_init"] RUN rm -f /etc/service/nginx/down RUN rm /etc/nginx/sites-enabled/default ADD nginx.conf /etc/nginx/sites-enabled/intercity_website.conf ADD . /home/app/intercity_website WORKDIR /home/app/intercity_website RUN chown -R app:app /home/app/intercity_website RUN sudo -u app bundle install --deployment RUN sudo -u app RAILS_ENV=production rake assets:precompile RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
      
      





ご覧のとおり、Dockerfileはベースのphusion / passenger-ruby21イメージを使用します。 Nginx構成、アプリケーションコードを追加し、バンドラーを実行してgemをインストールし、アセットをプリコンパイルします。



nginx.conf


 # This is the server block that serves our application. server { server_name intercityup.com; root /home/app/intercity_website/public; passenger_enabled on; passenger_user app; passenger_ruby /usr/bin/ruby2.1; } # This is the server block that redirects www to non-www. server { server_name www.intercityup.com; return 301 $scheme://intercityup.com$request_uri; }
      
      





アプリケーションコンテナーのイメージの構築



これらのファイルをリポジトリに追加しました。 これをサーバーにアップロードして、コンテナーを組み立てます。

 my_workstation $ git archive -o app.tar.gz --prefix=app/ master my_workstation $ scp app.tar.gz root@178.62.232.206: my_workstation $ ssh root@ 178.62.232.206 server $ tar zxvf app.tar.gz server $ docker build --tag="intercity-website" app/
      
      





このコマンドは多くの結果を出力し、多くのことを行います。 最初にdocker buildを開始したとき、数分かかりました。 これは、Dockerが基本のphusion / passenger-ruby21イメージをダウンロードする必要があるためです。 これは一度だけ行われます。 ベースイメージをロードした後、プロセスはDockerfileに従って続行されます。



今、docker imagesコマンドは私の画像を表示します:

 server $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE intercity-website latest 629f05f42915 3 minutes ago 1.011 GB
      
      





初めてのコンテナの起動



アプリケーションを起動します。

 server $ docker run --rm -p 80:80 intercity-website
      
      





このコマンドは、コンテナを起動し、いくつかのデータを表示し、最終的に次の行を表示します。

 [ 2014-09-23 11:23:11.9005 113/7fb22942b780 agents/Watchdog/Main.cpp:728 ]: All Phusion Passenger agents started!
      
      





次に、アプリケーションが正常に動作するかどうかを見てみましょう。 curlを使用してクエリを実行します。

 server $ curl -H "Host: intercityup.com" http://localhost/ <!DOCTYPE html> <html> <head> <title>We`re sorry, but something went wrong (500)</title> ...
      
      





エラーが発生しました。 コンテナ内のログから判断すると(Phusionのdocker-bashを使用したアクセス用)、データベースを作成するのを忘れていました。 それでは、サーバーにMySQLをインストールします。



データベースのインストール



Ubuntu 14.04で利用可能な標準のMySQLサーバーを使用します。

 server $ apt-get install mysql-server
      
      





インストール後、管理者パスワードを設定したら、アプリケーションのデータベースを作成できます。

 server $ mysql -u root -p mysql> create database intercity_website_production; Query OK, 1 row affected (0.00 sec) mysql> grant all on intercity_website_production.* to 'intercity' identified by 'rwztBtRW6cFx9C'; Query OK, 0 rows affected (0.00 sec)
      
      





その後、/ etc / mysql / my.cnfとbind-addressを127.0.0.1から外部IPアドレス178.62.232.206に変更しました。 これにより、コンテナ内のRailsでMySQLを使用できるようになりました。 /etc/mysql/my.cnfで、bind-addressの行を次の行に置き換えました。

 bind-address = 178.62.232.206
      
      





MySQLを再起動しました:

 server $ /etc/init.d/mysql restart
      
      







環境変数を使用してデータベースを構成する



環境変数を使用して、コンテナがMySQLでの承認に使用できるようにします。 これを行うには、2つのことを行う必要があります。1)環境変数を使用するために、リポジトリにdatabase.ymlファイルを準備します。 2)これらの変数をパッセンジャープロセスに渡すようにNginxを構成します。



以下は、環境変数用に準備された新しいdatabase.ymlです。

 production: adapter: mysql2 host: <%= ENV['APP_DB_HOST'] %> port: <%= ENV['APP_DB_PORT'] || "3306" %> database: <%= ENV['APP_DB_DATABASE'] %> username: <%= ENV['APP_DB_USERNAME'] %> password: <%= ENV['APP_DB_PASSWORD'] %>
      
      





これらの環境変数をRailsアプリケーションで機能させるには、Nginxを構成する必要があります。 これは、Nginxが定義したものを除くすべての環境変数をリセットするためです。



rails-env.confファイルをRailsアプリケーションに追加しました。

 env APP_DB_HOST; env APP_DB_PORT; env APP_DB_DATABASE; env APP_DB_USERNAME; env APP_DB_PASSWORD;
      
      





また、コンテナを構築するときにrails_envファイルを追加するようにDockerfileを修正しました。

 FROM phusion/passenger-ruby21 MAINTAINER Firmhouse "hello@firmhouse.com" ENV HOME /root ENV RAILS_ENV production CMD ["/sbin/my_init"] RUN rm -f /etc/service/nginx/down RUN rm /etc/nginx/sites-enabled/default ADD nginx.conf /etc/nginx/sites-enabled/intercity_website.conf # Add the rails-env configuration file ADD rails-env.conf /etc/nginx/main.d/rails-env.conf ADD . /home/app/intercity_website WORKDIR /home/app/intercity_website RUN chown -R app:app /home/app/intercity_website RUN sudo -u app bundle install --deployment RUN sudo -u app RAILS_ENV=production rake assets:precompile RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* EXPOSE 80
      
      







環境変数をサポートするイメージを構築する



リポジトリに新しいNginx構成を追加しました。 次に、コンテナの新しいバージョンを再構築する予定です。

 workstation $ git archive -o app.tar.gz --prefix=app/ master workstation $ scp app.tar.gz root@178.62.232.206: workstation $ ssh root@178.62.232.206 server $ tar zxvf app.tar.gz server $ docker build --tag="intercity-website" app/
      
      





環境変数を使用してrakeを実行する



コンテナを構築したら、データベースを構成できます。 次のコマンドでは、環境変数を使用してデータベース接続情報を渡し、rake db:setupを実行します。 コマンドに-u app引数を追加したことに注意してください。 この引数は、rake db:setupがコンテナ内でアプリユーザーとして実行されることを確認するために必要です。

 server $ docker run --rm -e "RAILS_ENV=production" -e "APP_DB_HOST=178.62.232.206" -e "APP_DB_DATABASE=intercity_website_production" -e "APP_DB_USERNAME=intercity" -e "APP_DB_PASSWORD=rwztBtRW6cFx9C" -e "APP_DB_PORT=3306" -u app intercity-website rake db:setup intercity_website_production already exists -- create_table("invite_requests", {:force=>true}) -> 0.0438s -- initialize_schema_migrations_table() -> 0.1085s
      
      





わあ! うまくいきました!




環境変数を使用してアプリケーションを実行する



これで、同じ環境変数でコンテナを起動し、ブラウザからアクセスして、動作するかどうかを確認できます。

 server $ docker run --rm -p 80:80 -e "RAILS_ENV=production" -e "APP_DB_HOST=178.62.232.206" -e "APP_DB_DATABASE=intercity_website_production" -e "APP_DB_USERNAME=intercity" -e "APP_DB_PASSWORD=rwztBtRW6cFx9C" -e "APP_DB_PORT=3306" intercity-website
      
      





178.62.232.206を開くと、データベースに接続するRailsアプリケーションが表示されます。また、アセットがコンパイルされ、すべてが機能していることがわかります。 勝利!



おわりに



これで、次のような投稿が終了します。

  1. サーバーにDockerをインストールしました
  2. dockerfileをセットアップし、コンテナーイメージを構築する
  3. 環境変数を使用してデータベースをセットアップする


次は?



まだ質問があります。 Intercityの私と他の開発者は、それらについて詳しく説明します。 対処する必要がある問題の一部を次に示します。



この記事をお楽しみください。 私はアドバイスや質問を喜んでいます!



ご静聴ありがとうございました。



All Articles