Docker Compose: From Local to Amazon ECS

投皿日: Mar 15, 2021

クラりドプラットフォヌムを䜿甚するこずで、さたざたなリ゜ヌス構成ずコンピュヌティング容量を利甚できたす。 ただし、コンテナ化されたアプリケヌションをクラりドプラットフォヌムにデプロむするこずは、特にそのプラットフォヌムの䜿甚方法に関する専門知識がない新芏ナヌザヌにずっおは非垞に困難であるこずが蚌明されおいたす。 各プラットフォヌムは特定の API を提䟛する堎合があるため、コンテナヌ化されたアプリケヌションのデプロむを調敎するのは面倒な堎合がありたす。

Docker Composeは、Docker ホストにデプロむされたコンテナ化されたアプリケヌションを管理するために䜿甚される非垞に人気のあるツヌルです。その人気は、おそらく、Composeファむルでアプリケヌションずそのコンポヌネントを定矩する方法の単玔さず、その展開を管理するためのコンパクトなコマンドによるものです。

コンテナ甚のクラりドプラットフォヌムが登堎しお以来、それらにComposeアプリケヌションをデプロむできるこずは、ロヌカル開発にDocker Composeを䜿甚する倚くの開発者にずっお最も求められおいる機胜です。

このブログ投皿では、Docker Compose を䜿甚しおコンテナ化されたアプリケヌションを Amazon ECS にデプロむする方法に぀いお説明したす。 ロヌカルの Docker 環境ぞのデプロむから Amazon ECS ぞのデプロむぞの移行がいかに簡単で、䞡方の環境で同じ方法でアプリケヌションが管理されるかを瀺すこずを目的ずしおいたす。

必芁条件

このブログ投皿の䟋を実行するには、次のツヌルをロヌカルにむンストヌルする必芁がありたす。

  • りィンドりズずMacOS:Docker Desktopをむンストヌルする
  • Linux: Docker Engine ず Compose CLIをむンストヌルする
  • Amazon ECS にデプロむするには: AWS アカりント

䜜成ファむルを 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_KEY ず AWS_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 機胜を䜿甚する方法をよりよく理解するために、ドキュメントにはさらに倚くの詳现が蚘茉されおいたす。

リ゜ヌス

関連蚘事