Docker Compose: From Local to Amazon ECS

クラウドプラットフォームを使用することで、さまざまなリソース構成とコンピューティング容量を利用できます。 ただし、コンテナ化されたアプリケーションをクラウドプラットフォームにデプロイすることは、特にそのプラットフォームの使用方法に関する専門知識がない新規ユーザーにとっては非常に困難であることが証明されています。 各プラットフォームは特定の API を提供する場合があるため、コンテナー化されたアプリケーションのデプロイを調整するのは面倒な場合があります。

Docker Composeは、Docker ホストにデプロイされたコンテナ化されたアプリケーションを管理するために使用される非常に人気のあるツールです。その人気は、おそらく、Composeファイルでアプリケーションとそのコンポーネントを定義する方法の単純さと、その展開を管理するためのコンパクトなコマンドによるものです。

コンテナ用のクラウドプラットフォームが登場して以来、それらにComposeアプリケーションをデプロイできることは、ローカル開発にDocker Composeを使用する多くの開発者にとって最も求められている機能です。

このブログ投稿では、Docker Compose を使用してコンテナ化されたアプリケーションを Amazon ECS にデプロイする方法について説明します。 ローカルの Docker 環境へのデプロイから Amazon ECS へのデプロイへの移行がいかに簡単で、両方の環境で同じ方法でアプリケーションが管理されるかを示すことを目的としています。

必要条件

このブログ投稿の例を実行するには、次のツールをローカルにインストールする必要があります。

作成ファイルを Amazon ECS にデプロイするには、Docker CLI バイナリに埋め込まれた新しい Docker 作成実装に依存しています。 したがって、ドッカー作成コマンドの代わりにドッカー作成コマンドを実行します。 ローカルデプロイの場合、Docker Composeの両方の実装が機能するはずです。 使用している不足している機能を見つけた場合は、 課題トラッカーで報告してください。

このブログ投稿では、次の方法について説明します。

  1. 作成アプリケーションをビルドして出荷します。 Composeファイルで定義されたアプリケーションをローカルで実行する方法と、そのイメージをビルドしてDocker Hubに送信し、どこからでもアクセスできるようにする方法について説明します。
  2. Amazon ECS をターゲットとする ECS コンテキストを作成します。   
  3. Amazon ECS で作成アプリケーションを実行します。 
  1. 作成アプリケーションのビルドと出荷

次の構造のアプリケーション例を見てみましょう。

$ツリーマイプロジェクト/
マイプロジェクト/
├──バックエンド
│ ├── ドッカーファイル
│ ├── main.py
│ └── 要件.txt
├── 作曲.yaml
└── フロントエンド
    ├── ドッカーファイル
    └── nginx.conf

2 ディレクトリ, 6 ファイル

ファイルの内容は ここにあります。 Compose ファイルでは、次のように 2 つのサービスのみを定義します。

$ cat compose.yaml
サービス:
フロントエンド:
  ビルド:フロントエンド
  ポート:
    - 80:80
  depends_on:
    - バックエンド
バックエンド:
  ビルド: バックエンド

このファイルを Docker エンジンにローカルにデプロイするのは非常に簡単です。

$ docker compose up -d
[+]ランニング 3/3
⠿ネットワーク「myproject_default」は0.5秒を作成しました
⠿ コンテナmyproject_backend_1開始 0.7秒
⠿コンテナmyproject_frontend_1開始1.4秒

アプリケーションがローカルで実行されていることを確認します。

$ ドッカー ps
コンテナー ID イメージ コマンド 作成済みステータス ポート名
eec2dd88fd67 myproject_frontend "/docker-entrypoint...." 4 秒前 アップ 3 秒 0.0.0.0:80->80/tcp myproject_frontend_1
2c64e62b933b myproject_backend "python3 /app/main.py" 4秒前 上へ 3秒 myproject_backend_1

フロントエンドを照会します。

$カールローカルホスト:80

          ##         .
    ## ## ##        ==
## ## ## ## ##    ===
/"""""""""""""""""\___/ ===
{                       /  ===-
\______ O __/
\    \         __/
  \____\_______/

ドッカーからこんにちは!

アプリケーションを削除するには:

$ ドッカー 作曲 ダウン
[+]ランニング 3/3
⠿コンテナmyproject_frontend_1 0.5秒を削除
⠿コンテナmyproject_backend_1 10.3秒を削除
⠿ネットワーク「myproject_default」は0.4秒を削除しました

このアプリケーションを ECS にデプロイするには、アプリケーションのフロントエンドとバックエンドのイメージを Docker Hub などのパブリック イメージ レジストリに格納する必要があります。 これにより、どこからでも画像をプルできます。

イメージを Docker Hub にアップロードするには、次のように作成ファイルにイメージ名を設定します。

$ cat compose.yamlservices:
フロントエンド:
  画像:マイハブユーザー/スターターフロント
  ビルド:フロントエンド
  ポート:
    - 80:80
  depends_on:
    - バックエンド
バックエンド:
  画像:マイハブユーザー/スターターバック
  ビルド: バックエンド

Docker Compose を使用してイメージをビルドします。

$ ドッカー作成ビルド
[+]ビル 1.2s (16/16) 終了しました                                                                                                                                 
=> [myhubuser/starter-front internal] Dockerfile 0.0s からビルド定義をロードする
=> => ドッカーファイルの転送:31B 0.0秒
=> [myhubuser/スターターバック内部] Dockerfile 0.0s からビルド定義をロードする
...

ビルド出力では、Composeファイルの画像フィールドに従って画像に名前が付けられ、タグ付けされていることがわかります。

イメージを Docker Hub にプッシュする前に、ログインしていることを確認してください。

$ ドッカーログイン
...
ログインに成功しました

画像をプッシュします。

$ docker compose push
[+]ランニング 0/16
⠧ プッシュ プッシュ フロントエンド: f009a503aca1 プッシュ [===========================================================================================================================================================================================                                       2.7秒
...

これで、イメージが Docker Hub に格納されます。

  1. ECS ドッカーコンテキストを作成する

Docker Compose を Amazon ECS プラットフォームをターゲットにするには、まず ECS タイプの Docker コンテキスト を作成する必要があります。Docker コンテキストは、コマンドをさまざまな Docker ホストまたはクラウド プラットフォームにリダイレクトできるようにするメカニズムです。 

この時点で、ECS プラットフォームで認証するためにローカル環境に AWS 認証情報が設定されていることを前提としています。 

ECS コンテキストを作成するには、次のコマンドを実行します。

$ docker context create ecs myecscontext
? 次を使用して Docker コンテキストを作成します: [矢印を使用して移動し、入力してフィルター処理]
  既存の AWS プロファイル
  AWS シークレットとトークンの認証情報
AWS 環境変数>

AWS 認証情報のセットアップと AWS ツールの使用に関する知識に基づいて、3 つのコンテキスト設定から選択するよう求められます。 AWS 認証情報の設定の詳細をスキップするには、環境変数を使用するオプションを選択します。

$ docker context create ecs myecscontext
? 以下を使用して Docker コンテキストを作成します。 AWS 環境変数
ecs コンテキスト "myecscontext" が正常に作成されました

これには、Amazon ECS をターゲットとする Docker コマンドを実行するときに、ローカル環境で AWS_ACCESS_KEYAWS_SECRET_KEY を設定する必要があります。

現在使用中のコンテキストは、コンテキストリストの出力で*でマークされます。

$ ドッカーコンテキスト ls名前 タイプ 説明 ドッカーエンドポイント デフォルト * moby 現在のDOCKER_HOSTベースの構成 unix:///var/run/docker.sockmyecscontext 環境から読み取られた ECS 認証情報                                                           

後続のすべてのコマンドが Amazon ECS をターゲットにするには、次のコマンドを実行して、新しく作成した ECS コンテキストを使用中のコンテキストにします。

$ docker context use myecscontext
MyecsContext


$ ドッカーコンテキストls
名前の種類の説明 ドッカー エンドポイント              
デフォルトのモビー 現在のDOCKER_HOSTベースの構成 unix:///var/run/docker.sock
myecscontext * 環境から読み取られた ECS 資格情報                                                             
  1.  Amazon ECS で作成アプリケーションを実行する

これをコンテキストとして使用する代わりに、ECS を対象とするすべてのコマンドにコンテキスト フラグを設定することもできます。

警告: ECS展開で発生する可能性のあるコストを事前に確認してください 2つのECSサービス、負荷分散(ALB)、クラウドマップ(DNS解決)など。 

次のコマンドでは、ECS コンテキストを現在のコンテキストとして使用します。 ECS でコマンドを実行する前に、 ドキュメントで説明されているように、Amazon アカウントの認証情報でアプリケーションのリソースを管理するためのアクセス権が付与されていることを確認してください。

 これで、コマンドを実行して、ECSに正常にアクセスできることを確認できます。

$ AWS_ACCESS_KEY="*****" AWS_SECRET_KEY="******" docker compose ls
名前の状態               

AWS 認証情報をエクスポートして、すべてのコマンドに設定しないようにします。

$ エクスポート AWS_ACCESS_KEY="*****"
$ エクスポート AWS_SECRET_KEY="******"

サンプルアプリケーションをECSにデプロイすると、ローカルデプロイと同じコマンドを実行できます。

$ ドッカー 構成する
警告サービス.ビルド: サポートされていない属性       
警告サービス.ビルド: サポートされていない属性       
[+]ランニング18/18
⠿ マイプロジェクト クリエイトコンプリート 206.0秒
⠿ フロントエンドTCP80ターゲットグループ作成完了 0.0s
⠿クラウドマップ作成完了46.0秒
⠿ フロントエンドタスク実行ロール作成完了 19.0s
⠿クラスター作成完了5.0秒
⠿デフォルトネットワーク作成完了5.0秒
⠿ バックエンドタスク実行ロール作成完了 19.0s
⠿ ロググループ作成完了 1.0s
⠿ロードバランサー作成完了122.0秒
⠿デフォルト80イングレス作成完了1.0秒
⠿ デフォルトネットワーク入力作成完了 0.0s
⠿ バックエンドタスク定義作成完了2.0s
⠿ フロントエンドタスク定義作成完了 3.0s
⠿ フロントエンドサービスディスカバリーエントリ作成完了 1.0s
⠿ バックエンドサービスディスカバリーエントリ作成完了2.0s
⠿バックエンドサービス作成完了65.0秒
⠿ フロントエンドTCP80リスナー作成完了 3.0s
⠿ フロントエンドサービスクリエイトコンプリート 66.0s

Docker Compose は、Compose ファイルを、一連の AWS リソースを定義する CloudFormation テンプレートに変換します。 リソース マッピングの詳細については、 ドキュメントを参照してください。 生成された CloudFormation テンプレートを確認するには、次のコマンドを実行します。

$ ドッカー作成変換
警告サービス.ビルド: サポートされていない属性       
警告サービス.ビルド: サポートされていない属性       
AWSプレートフォーマットバージョン: 2010-09-09
リソース:
  バックエンドサービス:
    プロパティ:
      クラスター:
        Fn::GetAtt:
        -クラスター
        - アーン
      展開構成:
        最大パーセント: 200
        最小健康パーセント:100...

サービスの状態を確認するには、次のコマンドを実行します。

$ docker compose ps
ネームサービスステータスポート
タスク/マイプロジェクト/8c142dea1282499c83050b4d3e689566 バックエンド実行中            
タスク/マイプロジェクト/a608f6df616e4345b92a3d596991652d フロントエンド mypro-LoadB-1ROWIHLNOG5RZ-1172432386.eu-west-3.elb.amazonaws.com:80->80/http の実行

ローカル実行と同様に、アプリケーションのフロントエンドを照会できます。

$ カール mypro-LoadB-1ROWIHLNOG5RZ-1172432386.eu-west-3.elb.amazonaws.com:80

          ##         .
    ## ## ##        ==
## ## ## ## ##    ===
/"""""""""""""""""\___/ ===
{                       /  ===-
\______ O __/
\    \         __/
  \____\_______/

ドッカーからこんにちは!

ECS コンテナからログを取得するには、ログの作成コマンドを実行します。

$ ドッカー作成ログ
バックエンド | *サービングフラスコアプリ「メイン」(遅延読み込み)
バックエンド | * 環境: 生産
バックエンド |   警告: これは開発サーバーです。 運用環境のデプロイでは使用しないでください。
バックエンド |   代わりに本番環境のWSGIサーバーを使用してください。
...
フロントエンド |/docker-entrypoint.sh: /docker-entrypoint.d/20-envsubst-on-templates.sh の起動
フロントエンド |/docker-entrypoint.sh: /docker-entrypoint.d/30-tune-worker-processes.sh の起動
フロントエンド |/docker-entrypoint.sh: 構成が完了しました。起動準備完了
フロントエンド |172.31.22.98 - - [02/Mar/2021:08:35:27 +0000] "GET / HTTP/1.1" 200 212 "-" "ELB-ヘルスチェッカー/2.0" "-"
バックエンド |172.31.0.11 - - [2021年3月2日 08:35:27] "GET / HTTP/1.0" 200 -
バックエンド |172.31.0.11 - - [2021年3月2日 08:35:57] "GET / HTTP/1.0" 200 -
フロントエンド |172.31.22.98 - - [02/Mar/2021:08:35:57 +0000] "GET / HTTP/1.1" 200 212 "-" "curl/7.75.0" "94.239.119.152"
フロントエンド |172.31.22.98 - - [02/Mar/2021:08:35:57 +0000] "GET / HTTP/1.1" 200 212 "-" "ELB-ヘルスチェッカー/2.0" "-"

Compose アプリケーションを終了し、AWS リソースを解放するには、次のコマンドを実行します。

$ ドッカー 作曲 ダウン
[+]ランニング 2/4
⠴ マイプロジェクト DeleteInProgress User Startedated 8.5s
⠿ デフォルトネットワーク入力削除完了 1.0s
⠿ デフォルト80入力削除完了 1.0s
⠴ フロントエンドサービス削除進行中7.5秒...

Docker のドキュメントには、Compose ファイル の例 、サポートされている機能、ECS で実行されている Compose アプリケーションのデプロイ方法と 更新 方法の詳細などが記載されています。

次の機能について詳しく説明します。

概要

Compose アプリケーションのローカルデプロイから Amazon ECS でのデプロイへの移行について説明しました。 Docker Compose クラウド機能の使用方法を示すために、最小限の一般的な例を使用しました。 Compose ファイルを更新し、特定の AWS 機能を使用する方法をよりよく理解するために、ドキュメントにはさらに多くの詳細が記載されています。

リソース: