Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

告白の時間。私の開発環境は、Honeybadgerに取り組んできた4年間あまり変わっていません。しかし、その間、Honeybadgerは、機能する約10のサービスに応じて、はるかに洗練されたものになりました。

そのため、ローカル開発のためにDockerに移行しています。すべての開発者がPostgres、Cassandra、Memcachedなどをセットアップする代わりに、docker-composeを使用して事前に作成された環境を起動できます。素晴らしいです。

当然、Docker化されたアプリケーションをデプロイするのはどれほど簡単かと思い始めました。

Dockerを使用したデプロイ

Dockerには、デプロイを簡単にするためのdocker-machineやdocker-swarmなどのユーティリティが付属しています。これまでのところ、彼らはその約束を果たしていません。彼らの欠陥についてすべて読みたい場合は、この最近のハッカーニュース投稿をチェックしてください。

そのため、AmazonのECS(EC2 Container Service)に焦点を当てることにしました。

ECSとは何ですか?

ECSは、docker-composeとdocker-swarmの成長した本番環境対応のマッシュアップのようなものです。

ECSを使用すると、「Webアプリのコピーを3つ実行する」と言うことができ、EC2インスタンスのクラスター内の適切なDockerコンテナーをインテリジェントに起動します。

コンテナ間でリクエストの負荷を分散し、負荷に応じてクラスタをスケールアップまたはスケールダウンできます。

DockerizedSinatraアプリの作成

これがシンプルなSinatraアプリです。現在の時刻が出力されるため、キャッシュされたバージョンが表示されるかどうかがわかります。また、アプリを実行しているコンピューターの名前も出力します。後で、このアプリを実行し、ロードバランサーを使用してリクエストをルーティングする複数のサーバーを起動します。ホスト名を返すことで、どのサーバーが特定のリクエストを処理したかを知ることができます。

アプリ

これから紹介するDockerizedSinatraアプリは、大幅に書き直されたバージョンのtcnksm-sample/docker-sinatraです。

require 'sinatra'
require 'sinatra/base'

class App < Sinatra::Base
  get '/' do
    "Hello from sinatra! The time is #{ Time.now.to_i } on #{ `hostname` }!"
  end
end

これがGemfileです :

# Gemfile
source 'https://rubygems.org'
gem 'sinatra'
gem 'thin'

...これがconfig.ruです ファイル:

$:.unshift(File.dirname(__FILE__))
require 'app'
run App

Dockerfile

このアプリのDockerイメージを作成するには、Dockerfileが必要です。アプリのディレクトリを作成し、ファイルをコピーして、ポート80でウェブサーバーを実行します。

FROM ruby:2.3.1-slim
RUN apt-get update -qq && apt-get install -y build-essential

ENV APP_ROOT /var/www/docker-sinatra
RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT
ADD Gemfile* $APP_ROOT/
RUN bundle install
ADD . $APP_ROOT

EXPOSE 80
CMD ["bundle", "exec", "rackup", "config.ru", "-p", "80", "-s", "thin", "-o", "0.0.0.0"]
イメージの構築と実行

まず、現在のディレクトリにあるDockerファイルからイメージをビルドするようにDockerに指示します。次に、それを実行して、コンテナのポート80をlocalhost:4000にマッピングします。

docker build -t docker-sinatra .
docker run -p 4000:80 docker-sinatra

動作するかどうかを確認するには、Webブラウザでlocalhost:4000を開きます。次のように表示されます:

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

ECSへの展開

それでは、ECSにデプロイしましょう。セットアップウィザードを使用します。それはごまかしていますか?私は気にしない。 :)では、ECSコントロールパネルに進んでください。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

「はじめに」をクリックします。次に、次の画面で[続行]をクリックします。」

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

Dockerレジストリの作成

通常、開発環境から本番サーバーにDockerイメージをアップロードすることはありません。代わりに、イメージをDockerレジストリ(dockerhubなど)に送信すると、サーバーはデプロイ時にイメージをプルします。 AmazonはプライベートDockerレジストリを提供しています。使用する必要はありませんが、とりあえず使用します。

レジストリに「docker-sinatra」という名前を付けます:

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

画像をレジストリにプッシュする

次に、イメージをビルドしてレジストリにプッシュするために実行するコマンドのリストが表示されます。

これを初めて試したとき、ブラウザの広告ブロッカーによってコマンドが正しく表示されませんでした。奇妙な-わかっています。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

タスク定義の作成

AWSは、新しい、紛らわしい用語を作成するのが大好きです。 「タスク定義」は、一緒に実行する必要があるコンテナーのリストです。これは、Procfileやdocker-compose構成のようなものです。

したがって、アプリケーションにNginxを実行するコンテナが1つ、Unicornを実行するコンテナが1つ、Sidekiqを実行するコンテナが1つある場合、3つすべてが「タスク定義」に含まれる可能性があります。

私たちのアプリははるかに簡単です。コンテナは1つだけです。したがって、構成は最小限です。

  1. 正しい画像がレジストリから取得されることを確認します
  2. ポート80をコンテナからコンテナを実行しているEC2インスタンスのポート80にマッピングします。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

サービスの作成

もっと紛らわしい用語! 「サービス」構成では、実行する「タスク」(アプリのコピー)の数と、それらの負荷分散方法を指定できます。

ここでは、ポート80で負荷分散を行い、アプリのコピーを3つ実行する必要があります。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

クラスターのスピンアップ

クラスターは、AmazonのECSソフトウェアを実行している典型的なEC2インスタンスの集まりです。他のEC2インスタンスでできることなら何でもできます。この場合、3つのt2.microインスタンスが必要であると指定しました。

いくつかの確認手順と約5分の待機の後、すべての準備が整いました。

サービスが機能すると、次のような画面が表示されます。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

アプリのテスト

ロードバランサー名をクリックすると、その詳細が表示されます。そこに、そのパブリックドメイン名があります。それをブラウザに入れると、サンプルアプリが表示されます。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法

数回更新すると、ホスト名が変更されていることがわかります。これは、ロードバランサーが3つのホストすべてでリクエストのバランスを取っているためです。

クリーンアップ

ECSウィザードは、AWSアカウントに多くのリソースを作成しました。あなたはおそらくそれらをそこに残したくないでしょう。彼らは物事を乱雑にし、あなたにお金がかかるかもしれません。

幸い、ECSウィザードはCloudFormationを使用してすべてのリソースを作成します。つまり、CloudFormationスタックを削除するだけですべてを削除できます。

DockerでSinatraアプリをAmazonsEC2ContainerServiceにデプロイする方法


  1. Windows 10でアプリをミュートする方法

    Windows 10 では、すべてのオーディオ デバイスと、インストールした多くのアプリが優れたオーディオ コントロールを備えています。Windows 10 でアプリをミュートする方法を知りたいですか?次に、この記事が役に立ちます。ヘッドフォンのレベルを個別に選択できます。接続すると、Windows 10 によって自動的に変更されます。同様に、ボリューム ミキサーを使用して特定のアプリの音量を調整することもできます。 Windows 10 でアプリをミュートする方法 PCまたはラップトップで同時に実行されている多くのアプリの音量を調整する簡単な手法があります.音量ミキサーは、アプリごと

  2. VPN が合法かどうかを見分ける方法 |偽の VPN アプリを見抜くための 5 つのヒント (2022 年)

    バーチャル プライベート ネットワーク(VPN)の世界について )、何があなたを本当に安全に保つのかを特定するのは面倒かもしれません そして、完全にデマです。したがって、詐欺を見つけて、VPN アプリが偽物かどうかを判断することが重要です。本日の記事では、偽の VPN サービスを見つけるのに役立つ 5 つの効果的な戦術を紹介します. 「偽の VPN」サービスとは正確には何ですか? 偽の VPN ソリューションとは、主にユーザー データを盗み、知らないうちに同意なしにオンライン アクティビティを追跡するように設計されたプログラムです。正直なところ、VPN サービスが正規のものか偽物かを見分ける