開発環境の構築でコンテナを組み合わせて使うことが多いのですが、実際の確認環境にも使用してみようと考えてみました。
今回はAWSの環境にDockerでコンテナを管理する構成をしてみようと思います。
その際に、コンテナの管理をAmazon Elastic Container Registryで行いましたので、方法について記載します
目次
Amazon Elastic Container Registryとは?
Amazon Elastic Container Registry(以下、Amazon ECR)はコンテナイメージを管理するDocker用のコンテナレジストリで、コンテナイメージの保存、管理、サーバーへのデプロイを行うためのツールです。
例えば、docker-composeでプルするイメージをカスタマイズするために使います。
設定ファイルでservices
に登録する時image
に登録すると、up
する時に公式イメージをプルして来ます。
そのimage先を自作するために使えると言うわけです。
なぜ、Amazon Elastic Container Serviceを使うためにDockerイメージをリポジトリに保存する必要があるのか?
Amazon Elastic Container Service(以下、Amazon ECS)は、コンテナイメージをオーケストラしてサーバーを構築するサービスです。
タスクにもよりますが、Amazon EC2タスクの場合、compose用の設定ファイルを書いて組み合わせます。
一見、Amazon ECRにイメージを保存する必要が無いに思えます。
しかし、Amazon ECSはdocker-composeのbuild
パラメーターをサポートしていません。
重要
build ディレクティブは現在サポートされていません。
アプリケーションに合わせてコンテナを変更したい場合は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のダウンロードとユーザー設定はしておいてください。
公式のチュートリアルを参考にしながら、必要に応じて調整していきます。
手順の中で指定するオプションは次のようにします。
オプション | 設定値 | 概要 |
---|---|---|
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に追加します。
取得した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
を設定しない場合はデフォルトユーザーです。
以上です。
厳密には、ライフサイクルの指定や、パーミッションの設定も行うのですがそれはまた別の機会で説明します。