AWSのECRとECSを使うとDockerをAWS上で運用することができる。
AWSのすべてのサービス一覧をみると、一番右端の隅にちょこんと記載されている。
Elastic Container RegistryがECR、Elastic Container ServiceがECS。
ECRとECSとは何か?
・ECRはDocker hubのAWSバージョン。レポジトリを作成しイメージをプッシュ・プルできる。
・ECSはDockerをAWSで起動させる場所**。ECRのイメージからコンテナを起動する。
Docker hubではなくAWS上にDockerイメージをプッシュしてチーム全体で共有したり(ECR)、AWS上でコンテナを起動して運用することができる(ECS)。
ECR
- Elastic Container Registryの略。
- Dockerのレジストリサービス。
- Docker hubのAWS版。
Elasticは弾性のある。ここでは要領変化への追従自由度が高いといった意味。
ContainerはDockerのコンテナ。Registryは保存場所。
まとめると、自由度の高いコンテナ保存場所といったニュアンス。
作成したイメージをECRにプッシュし、保存することができる。
ECRの詳細
ECRでできることは、
- レポジトリの作成
- イメージのプッシュ・プル
- イメージの詳細確認
PrivateとPublicを選択してレポジトリを作成することができる。
レポジトリ名をクリックすると作成されたイメージの一覧をみることができる。
イメージをクリックすると、その詳細が確認できる。
レポジトリの作成
画面右上のレポジトリの作成ボタンから作成画面に入れる。
作成は非常に簡単。基本的には、
- Private or Publicの選択
- リポジトリ名を入力
- リポジトリの作成
の3stepのみ。
レポジトリにイメージをプッシュする
レポジトリに入り右上のプッシュコマンドの表示をクリックすると、イメージをレポジトリ にプッシュするための手順が確認できる。
step1 Dockerレジストリサーバーにログイン
#AWSの認証トークンを取得し、dockerのレポジトリサーバーにログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [aws_account_id].dkr.ecr.[region].amazonaws.com
・aws ecr get-login-password --region ap-northeast-1
aws ecr
コマンドで指定リージョンのPW(トークン)を取得。
・コマンドA | コマンドB
コマンドを「|」パイプで繋ぐと、コマンドAで取得したデータをコマンドBに渡す処理になる。
・docker login [オプション] [サーバー]
--username AWS
:ユーザー名をAWSとしてログイン
--password-stdin
:パスワードは先ほど取得したトークンを標準入力(-stdin)
で渡す。
[aws_account_id].dkr.ecr.[region].amazonaws.com
サーバーにはawsのアカウントを指定。
サーバーの指定がない場合はDocker hubに接続する。
step2 Dockerファイルからイメージを作成
現在作業中のディレクトリにDockerfileがある場合に以下コマンドを実行する。
docker build -t [レポジトリ名] .
・docker build [オプション] [Dockerファイルのパス]
-t [イメージ名:タグ名]
:作成したイメージにタグを付与する。ここではレポジトリ名をタグとして指定している。
タグ名を指定しない場合はlatest
となる。
例えば、docker build -t test-repository .
の場合、
イメージ名はtest-repository:latest
となる。
・.
Dockerfileのあるディレクトリのパス。現在のディレクトリにあると指定。
step3 イメージにレポジトリ名を設定
docker tag [レポジトリ名]:latest [aws_account_id].dkr.ecr.[region].amazonaws.com/[レポジトリ名]:latest
イメージにリポジトリ名を設定する。
docker tag [イメージ名] [リポジトリ名:タグ名]
[イメージ名]はイメージIDでも、イメージ:タグのどちらでも指定可能。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[aws_account_id].dkr.ecr.[region].amazonaws.com/[AWS上のレポジトリ名] latest test-repository:latest 33 minutes ago 802MB
step4 イメージをECRにプッシュ
docker push [aws_account_id].dkr.ecr.[region].amazonaws.com/test-repository:latest
docker push [レポジトリ名:タグ名]
指定したレポジトリに該当するタグ名のイメージをプッシュする。
以上でイメージのpushが完了。
ECS
- Elastic Container Serviceの略
- Dockerコンテナの実行環境
(参考)Docker公式 概要説明
ECSの詳細
ECSではAWSにプッシュしたイメージからコンテナを起動できる。
処理には大きく(1)クラスターと(2)タスク定義の二つの項目がある。
簡単にいうと、クラスターはサイトやアプリケーション、タスク定義はコンテナ作成の設定
▼ECSオブジェクトの関係性
クラスターとは何か?
クラスターとはタスクリクエストを実行できる1つ以上のコンテナ
つまり、1つのアプリケーションのこと。例えば、ブログサイトとコーポレートサイトを別々のサーバーで運用している場合、クラスターはブログサイトとコーポレートサイトの2つになる。
ブログサイトの中には、 Ruby on RailsとPostgreSQLなどのDBなど複数コンテナが動いているといったイメージ。
クラスターの作成
step1 クラスターテンプレートの選択
クラスターを簡単に作成するためのテンプレートを選択。
AWS Fargateとは何か?
ファーゲートと読む。ECS(およびEKS)専用のサービスでEC2サーバーやクラスターの管理をすることなく、コンテナを実行できるサービス。
step2 クラスター名を指定して作成
VPCとは何か?
Amazon Virtual Private Cloud (Amazon VPC)の略で、コンテナを起動する専用スペースのこと。
Container Insightsとは何か?
AWSの運用状況監視サービスCloudWatchに特定のデータ追加で送信できるようになる。
送信できるデータはいくつかああるが例えば、CpuUtilized(使用中のCPUユニット数)など。
以上でクラスターの作成が完了。
タスク定義とは何か?
タスク定義は、コンテナを起動するためのイメージやCPUなどの基本設定の定義。
ECSでDockerコンテナを実行するには、タスク定義が必須。
▼タスク定義の内容
- タスク内の各コンテナーで使用するDockerイメージ
- 各タスクまたはタスク内の各コンテナで使用するCPUとメモリの量
- 使用する起動タイプ。タスクがホストされるインフラストラクチャを決定します。
- タスクのコンテナーに使用するDockerネットワークモード
- タスクに使用するログ構成
- コンテナが終了または失敗した場合にタスクを実行し続けるかどうか
- コンテナの起動時に実行する必要のあるコマンド
- タスクのコンテナで使用する必要のあるデータボリューム
- タスクが使用する必要があるIAMロール
タスクの作成方法
step1 起動タイプの選択
↓
step2 タスクとコンテナの定義の設定
タスク名やコンテナに割り当てるCPUやメモリ量、コンテナの名前などを設定する。
▼主な設定内容
コンテナを起動するイメージをECRから指定。