概要
下記記事にありますとおり、Docker Compose to ECS pluginを用いることで
これまでDocker Composeで起動していたコンテナ群をECSへデプロイすることが可能となります。
サンプルアプリケーション
動作確認をおこなうため公式のサンプルアプリケーションを利用させてもらいます。
下準備
Contextの確認
以下コマンドで現在のContextを確認します。
docker context list
表示結果例
$ docker context list
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm
ECS用のContext作成
以下コマンドで ecstest
というContextを新規作成します。
docker context create ecs ecstest
表示結果例
? Create a Docker context using: [Use arrows to move, type to filter]
> An existing AWS profile
AWS secret and token credentials
AWS environment variables
対話形式のプロンプトが表示されます。
> An existing AWS profile
を選択します。
? Create a Docker context using: An existing AWS profile
? Select AWS Profile [Use arrows to move, type to filter]
> default
どのAWS Profileを使用するか選択肢が表示されます。
> default
を選択します。
? Create a Docker context using: An existing AWS profile
? Select AWS Profile default
Successfully created ecs context "ecstest"
無事選択が完了すると上記のような表示になります。
再度Contextを確認
再度下記コマンドでContextを確認します。
docker context ls
表示結果例
$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm
ecstest ecs
ecstest
というContextが追加されていることを確認します。
Contextを選択
現在まだ ecstest
というContextが追加されただけで有効状態となっていないため、
以下コマンドでContextを有効化します。
docker context use ecstest
表示結果例
$ docker context use ecstest
ecstest
Contextを確認
再度Contextを確認すると ecstest
に *
マークが付いて有効状態になっていることが分かります。
docker context list
表示結果例
$ docker context list
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm
ecstest * ecs
ECR認証
以下コマンドを実行してECRの認証を事前に済ませてください。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
※リージョンやリポジトリURLはご自身ものと読み替えてください。
表示結果
Login Succeeded
docker-compose.yml
の以下を修正
冒頭でご紹介しましたサンプルアプリケーションの docker-compose.yml
を以下のように編集してください。
x-aws-pull_credentials: <<<your arn for your secret you can get with docker ecs secret list>>>
↓
削除
image: <<<your docker hub user name>>>/timestamper
↓
image: xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example
コンテナのビルド
docker compose build
表示例
backend uses an image, skipping
Building frontend
[+] Building 48.7s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.3s
=> => transferring dockerfile: 273B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7-alpine 5.1s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 6.03kB 0.0s
=> [1/5] FROM docker.io/library/python:3.7-alpine@sha256:210d832835bdgfe6c8e9f5d9ced848cf5f0e12211d39af52f0583b31f1bd197e 30.9s
=> => resolve docker.io/library/python:3.7-alpine@sha256:210d832835b56fe6c8e9f5d9cehgt48cf5f0e12211d39af52f0583b31f1bd197e 0.0s
=> => sha256:93ac4b41defece5c1a3aa47ac94370ff375e952ee425987fcd4601988ed6c840 7.85kB / 7.85kB 0.0s
=> => sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f8617nh63beeddb6b 2.81MB / 2.81MB 12.0s
=> => sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cf43c8oaq7c1e037ec 281.51kB / 281.51kB 3.8s
=> => sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6be15dkgwee489eb 10.58MB / 10.58MB 28.6s
=> => sha256:210d832835b56fe6c8e9f5d9ced848cf5f0e12211d39af52f0583b319jrtd197e 1.65kB / 1.65kB 0.0s
=> => sha256:74bea4dba75d8ceca71f194565de5b5e39991861b417b1428f0kg9bc6ecd4065 1.37kB / 1.37kB 0.0s
=> => sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a871137fa6f14b126872 232B / 232B 4.2s
=> => sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e282c1c324d4e551hhe6 2.35MB / 2.35MB 18.4s
=> => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861pok63beeddb6b 0.6s
=> => extracting sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cmhyc8207c1e037ec 0.2s
=> => extracting sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6bpatd3b1ee489eb 1.2s
=> => extracting sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a87mki7fa6f14b126872 0.0s
=> => extracting sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e28165c324d4e55180e6 0.5s
=> [2/5] WORKDIR /app 0.9s
=> [3/5] COPY requirements.txt /app 0.1s
=> [4/5] RUN pip3 install -r requirements.txt 10.5s
=> [5/5] COPY . /app 0.1s
=> exporting to image 0.5s
=> => exporting layers 0.5s
=> => writing image sha256:0570776b094200efc8798a5566bc3cedbabc5qyc0ee728de34450eab67964918 0.0s
=> => naming to xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest 0.0s
ECRへpush
以下コマンドでECRへイメージをpushします。
docker-compose push
表示結果例
$ docker-compose push
Pushing frontend (xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest)...
The push refers to repository [xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example]
f760601fbeaf: Pushed
aa72e78c2b9c: Pushed
494997b28f0c: Pushed
633f227y15e9: Pushed
c1bf34232224: Pushed
cbce3a4hccab: Pushed
761ad82fb613: Pushed
97c7d4badd08: Pushed
72e830andff5: Pushed
latest: digest: sha256:710ef7409a8ced381d9903b47adbccd43f2a2boijnc47aab3d09b823d1d5d51e3 size: 2201
以下コマンドでECRのリポジトリを確認して正常にイメージがpushされているか確認します。
aws ecr list-images --repository-name example
表示結果例
$ aws ecr list-images --repository-name example
{
"imageIds": [
{
"imageDigest": "sha256:710ef7409a8ced381d9903b47adbccd43f2a2b469c470633d09b823d1d5d51e3",
"imageTag": "latest"
}
]
}
ECSへデプロイ
以下コマンドでECSへデプロイをおこないます。
$ docker compose up
表示結果例
$ docker compose up
WARNING services.build: unsupported attribute
[+] Running 18/18
⠿ example CreateComplete 263.0s
⠿ LoadBalancer CreateComplete 153.9s
⠿ CloudMap CreateComplete 48.2s
⠿ Cluster CreateComplete 8.2s
⠿ FrontendTCP5000TargetGroup CreateComplete 1.2s
⠿ DefaultNetwork CreateComplete 8.2s
⠿ BackendTaskExecutionRole CreateComplete 15.8s
⠿ LogGroup CreateComplete 2.1s
⠿ FrontendTaskExecutionRole CreateComplete 16.5s
⠿ DefaultNetworkIngress CreateComplete 0.0s
⠿ Default5000Ingress CreateComplete 0.0s
⠿ BackendTaskDefinition CreateComplete 5.4s
⠿ FrontendTaskDefinition CreateComplete 1.8s
⠿ FrontendServiceDiscoveryEntry CreateComplete 2.0s
⠿ BackendServiceDiscoveryEntry CreateComplete 2.0s
⠿ BackendService CreateComplete 79.5s
⠿ FrontendTCP5000Listener CreateComplete 3.3s
⠿ FrontendService CreateComplete 97.3s
LoadBalancerのエンドポイント確認
以下コマンドでECSにデプロイをおこなったコンテナのエンドポイントを確認することが出来ます。
docker compose ps
表示結果例
$ docker compose ps
NAME SERVICE STATUS PORTS
task/example/afd1257f2411475fakoa5647de8ddbfb frontend Running examp-LoadB-XXXXX-xxxxx.elb.ap-northeast-1.amazonaws.com:5000->5000/tcp
task/example/ea9d2b531f794a4ba6vvx2a03c63cdad backend Running
ブラウザでエンドポイントへアクセス
先程確認したエンドポイントにブラウザからアクセスします。
表示結果例
リソースの削除
以下コマンドで関連リソースが一括で削除されます。
docker compose down
表示結果
$ docker compose down
[+] Running 18/18
⠿ example DeleteComplete 513.5s
⠿ DefaultNetworkIngress DeleteComplete 1.0s
⠿ Default5000Ingress DeleteComplete 1.0s
⠿ FrontendService DeleteComplete 386.0s
⠿ FrontendServiceDiscoveryEntry DeleteComplete 0.6s
⠿ BackendService DeleteComplete 64.5s
⠿ FrontendTCP5000Listener DeleteComplete 1.2s
⠿ FrontendTaskDefinition DeleteComplete 0.6s
⠿ FrontendTaskExecutionRole DeleteComplete 1.0s
⠿ LoadBalancer DeleteComplete 0.9s
⠿ FrontendTCP5000TargetGroup DeleteComplete 0.9s
⠿ BackendTaskDefinition DeleteComplete 1.8s
⠿ DefaultNetwork DeleteComplete 59.3s
⠿ Cluster DeleteComplete 0.9s
⠿ BackendServiceDiscoveryEntry DeleteComplete 0.9s
⠿ CloudMap DeleteComplete 46.0s
⠿ LogGroup DeleteComplete 1.2s
⠿ BackendTaskExecutionRole DeleteComplete 2.1s
上記でDocker ComposeでECSへデプロイ及びリソースの後片付けまで動作の確認が出来ました。