【Amazon ECR】自作したコンテナイメージをAmazon Elastic Container Registryで管理する

開発環境の構築でコンテナを組み合わせて使うことが多いのですが、実際の確認環境にも使用してみようと考えてみました。
今回はAWSの環境にDockerでコンテナを管理する構成をしてみようと思います。

その際に、コンテナの管理をAmazon Elastic Container Registryで行いましたので、方法について記載します

Amazon Elastic Container Registryとは?

Amazon Elastic Container Registry(以下、Amazon ECR)はコンテナイメージを管理するDocker用のコンテナレジストリで、コンテナイメージの保存、管理、サーバーへのデプロイを行うためのツールです。

aws.amazon.com

例えば、docker-composeでプルするイメージをカスタマイズするために使います。
設定ファイルでservicesに登録する時imageに登録すると、upする時に公式イメージをプルして来ます。
そのimage先を自作するために使えると言うわけです。

なぜ、Amazon Elastic Container Serviceを使うためにDockerイメージをリポジトリに保存する必要があるのか?

Amazon Elastic Container Service(以下、Amazon ECS)は、コンテナイメージをオーケストラしてサーバーを構築するサービスです。

aws.amazon.com

タスクにもよりますが、Amazon EC2タスクの場合、compose用の設定ファイルを書いて組み合わせます。
一見、Amazon ECRにイメージを保存する必要が無いに思えます。

しかし、Amazon ECSはdocker-composeのbuildパラメーターをサポートしていません

重要

build ディレクティブは現在サポートされていません。


https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-cli-tutorial-ec2.html#ECS_CLI_tutorial_compose_createより引用

アプリケーションに合わせてコンテナを変更したい場合はAmazon ECRやDockerHubと組み合わせが必要になります。
また、他にも使えるパラメーターが限られているので注意が必要です。

環境について

イメージをアップロードする環境です。
MacPCから作業を行いますので次のような環境を考えています。

環境名 バージョン
OS macOS 10.14.4
docker 18.09.2
docker-compose 1.23.2

ファイル構成について

次のような構成です。
ローカル開発用に用意しているdocker-compose用に用意したDockerfileからイメージを作り、リモートリポジトリに保存します。
作成するイメージは、Nginxイメージを元にプロジェクト用に改修したWebサーバーです。

docker
└── web
    ├── Dockerfile
    └── nginx
        └── conf.d
            └── default.conf

手順

事前にAWS CLIのダウンロードとユーザー設定はしておいてください。

公式のチュートリアルを参考にしながら、必要に応じて調整していきます。

docs.aws.amazon.com

手順の中で指定するオプションは次のようにします。

オプション 設定値 概要
region ap-northeast-1 東京リージョン
acount id 00000000000 AWS CLIを使用するIAMのアカウントID

Amazon ECRにログインする

厳密にはDockerのログインなので、AWS CLIでDocker loginに必要な情報取得します。
get-loginコマンドを実行すると、docker loginのコマンドをレスポンスで返してきます。
そのコマンドをコピーしてそのまま実行すればDockerのログイン設定は完了です。

$ aws ecr get-login --region ap-northeast-1 --no-include-email
# Dockerのloginに必要なコマンドが出力されるのでコピー
docker login -u AWS -p ...
$ docker login -u AWS -p  ...

何故、Amazon ECRに直接ログインしないのか?

Docker CLIのログイン認証方式は、AWS CLIの認証方式に対応していないようです。

Docker CLI では標準の AWS 認証方法がサポートされていないため、Docker クライアントを別の方法で認証する必要があります。これにより、イメージのプッシュまたはプルをリクエストしているユーザーを Amazon ECR が認識することができます。


https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html#registry_auth:embedより引用

リポジトリを作る

イメージを保存するためのリポジトリを作成します。
記事内では、リポジトリ名をsample_webとしますが、必要に応じで変更してください。

オプション 設定値
repository-name sample_web
$ aws ecr create-repository --repository-name sample_web 

Dockerのイメージを作る

Dockerfileを元にイメージをビルドします。
イメージ名(-t)は先ほど保存したリポジトリ名と一緒にします。

$ cd ./docker/web
$ docker build -t sample_web .

タグをつける

イメージのバージョン管理を行うために、タグを追加します。
タグには、最新という意味がわかるようにlatestを指定します。

$ docker tag sample_web:latest 00000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sample_web:latest
$ docker images --filter reference=sample_web
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sample_web           latest              245df040921b        15 minutes ago      16.1MB

※もし、リージョンが違う場合は、00000000000.dkr.ecr.<別リージョン>.amazonaws.comにしてください。

イメージをPushする

リモートリポジトリに保存するために、作成したイメージをPushします。

$ docker push 00000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sample_web:latest

これで、リモートリポジトリへの保存は完了です。

docker-comopseのimageオプションに指定するURLを取得

AWSのコンソールの検索窓で、ECRと検索してAmazon ECRのコンソールを表示します。
リポジトリが一覧で表示されますので、先ほど作成したリポジトリ名のURIをコピーして、docker-compose.ymlのimageに追加します。

f:id:nakahashi_h:20190604224540p:plain

取得したURIは、servicesの該当するコンテナのimageに登録します。
この状態でdocker-compose upを行えばリポジトリからイメージを取得できるようになります。

version: '3'
services:
  web:
    image: 00000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sample_web:latest

これで、イメージの保存と呼び出しの設定は完了です。

Tips

プロフィールが紐づくアカウントIDを取得する方法

今、awsを利用しているアカウントIDは次のコマンドで確認することが出来ます。
UserIDとAccountが混在していて若干わかりずらいですが、本記事で使用する情報がはAcountの情報です

$ aws sts get-caller-identity --profile <aws configureで登録したプロフィール名>
{
    "UserId": "ユーザーID",
    "Account": "アカウント番号",
    "Arn": "Arn情報"
}

尚、--profileを設定しない場合はデフォルトユーザーです。

docs.aws.amazon.com



以上です。
厳密には、ライフサイクルの指定や、パーミッションの設定も行うのですがそれはまた別の機会で説明します。

©︎2017-2018 WebSandBag