はじめに
この投稿では、Ruby On RailsアプリケーションをDigitalOceanサーバーにデプロイして、別のDockerコンテナーで動作させる方法について説明します。 簡単にするために、Dockerコンテナー内にRailsアプリケーションをデプロイするプロセスを詳細に説明します。
この投稿では:
- サーバーにDockerをインストールした方法
- RailsアプリケーションのDockerfile
- Gemfileのgemを使用してビルドする
- コンパイルされたアセットでビルドする
- Dockerでアプリケーションを実行する
- database.ymlのDocker環境変数
サーバーにインストールすることから始めましょう。
サーバーに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:
アプリケーションコンテナーのイメージの構築
これらのファイルをリポジトリに追加しました。 これをサーバーにアップロードして、コンテナーを組み立てます。
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
環境変数をサポートするイメージを構築する
リポジトリに新しい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アプリケーションが表示されます。また、アセットがコンパイルされ、すべてが機能していることがわかります。 勝利!
おわりに
これで、次のような投稿が終了します。
- サーバーにDockerをインストールしました
- dockerfileをセットアップし、コンテナーイメージを構築する
- 環境変数を使用してデータベースをセットアップする
次は?
まだ質問があります。 Intercityの私と他の開発者は、それらについて詳しく説明します。 対処する必要がある問題の一部を次に示します。
- 展開を自動化する方法は? 多分カピストラーノのようなものを使用しますか?
- ダウンタイムをゼロにするには何が必要ですか? 最初にコンテナを停止してから起動すると、アプリケーションの新しいバージョンを起動するために、接続がリセットされます。
- サーバーにデプロイする各アプリケーションの環境変数をどこに保存しますか?
- コンテナの構築を高速化するにはどうすればよいですか? bundlerおよびrakeアセットを実行する必要がありますか。すべてのデプロイメントで毎回プリコンパイルしますか?
この記事をお楽しみください。 私はアドバイスや質問を喜んでいます!
ご静聴ありがとうございました。