📚

ECRにDockerコンテナイメージをpush、pullする

2022/01/10に公開

Amazon ECRとは?

  • Amazon Elastic Container Registryのことです
  • フルマネージドコンテナレジストリ(AWSが管理するコンテナの保存場所)
  • Dockerコンテナイメージを保存・管理ができます

本記事のゴール

  • ローカルで作成したDockerコンテナイメージをECRに保存(push)する
  • ECRにあるDockerコンテナイメージを取得(pull)する

事前準備

  • AWS CLIとDocker(バージョン1.7以上)をインストールしてください
  • AWSへサインアップし、アカウントを作成してください
  • ECRを利用するためのIAMユーザを作成してください
  • AWSアカウントの作成、IAMユーザの作成はこちらを参考にしてください

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html

コンソールでリポジトリ作成する

コンソールでAWS ECR > リポジトリを開いてください
https://console.aws.amazon.com/ecr/repositories

リポジトリを作成をクリックしてください。
今回はECRへイメージのpush、pullを経験するだけなので、以下のように設定してください。

  • 一般設定
    • 可視性設定はプライベート
    • リポジトリ名にhello_worldを入力
    • タグのイミュータビリティは無効
  • イメージスキャンの設定
    • プッシュ時にスキャンは無効
  • 暗号化設定
    • KMS暗号化は無効

ローカルでDockerfileを作成

Dockerfileというファイルを作成します。

$ touch Dockerfile

Dockerfileを以下のように編集します

Dockerfile
FROM nginx:mainline-alpine

COPY index.html /usr/share/nginx/html/

Dockerfileと同じ階層に以下のようなindex.htmlを追加します

index.html
HELLO WORLD

新しいイメージを構築する

DockerfileからDockerイメージを作成します
Dockerfileがある階層で以下のコマンドを実行します

$ docker build -t hello_world .

次に以下のコマンドを実行しhello_worldというイメージが作成されていることを確認してください

$ docker images
出力結果
REPOSITORY   IMAGE   ID            CREATED        SIZE
hello_world  latest  c5314e4cb254  2 seconds ago  22.1MB

イメージの実行

作ったイメージを実行します
以下のコマンドを実行してください

$ docker run -it --rm -p 80:80 hello_world

ローカルで動作確認をする

ブラウザで http://localhost/ にアクセスしてください
HELLO WORLDと表示されていればOKです

デフォルトレジストリに対して認証する

Docker CLIを認証することでAmazon ECRを使用してイメージをpush、pullできます

コンソールのプライベートリポジトリ一覧で先ほど作成したhello_worldというリポジトリを選択し、プッシュコマンドの表示というボタンをクリックしてください

そこに認証トークンを取得し、レジストリに対してDocker CLIを認証するためのコマンドが書かれています

$ aws ecr get-login-password --region xxxx | docker login --username AWS --password-stdin xxxx.dkr.ecr.xxxx.amazonaws.com

上記のコマンドを実行すると認証ができます
Login Succeededと表示されれば成功です

以下のようなエラーが発生した場合、ACCESS_KEYSECRET_KEYが一致しておりません。

エラー
An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
Error: Cannot perform an interactive login from a non TTY device

ACCESS_KEYSECRET_KEYを再設定するか、別のprofileを利用している場合はコマンドの --region [region]--profile [profile name]に変更してあげてください

参考記事
https://qiita.com/kaito_program/items/7b9ba489e44d2295cf6f
https://qiita.com/nomi3/items/970b340caab59e8afb2e

またprofileの設定については、こちらの記事が参考になります
https://dev.classmethod.jp/articles/lim-cli-profile/

docker pushしてコンソールで確認

コンソールのプライベートリポジトリ一覧で先ほど作成したhello_worldというリポジトリを選択し、プッシュコマンドの表示というボタンをクリックしてください

ローカルでの動作確認時にイメージを実行しているのでdocker build -t hello_world .というコマンドは不要です

リポジトリにイメージをプッシュできるように、イメージにタグを付けます

$ docker tag hello_world:latest xxxxx.dkr.ecr.xxxxx.amazonaws.com/hello_world:latest

次に以下のコマンドでイメージをプッシュします

$ docker push xxxxx.dkr.ecr.xxxxx.amazonaws.com/hello_world:latest

プッシュが完了したらコンソールでプライベートリポジトリ一覧でhello_worldをクリックし、latestというイメージタグで追加されていることを確認してください

ローカルのdocker imageを削除して、docker pullする

ローカルにあるdocker imageを確認します

$ docker images

ECRにプッシュする際、タグをつけたものと、hello_worldがあると思います

出力結果
REPOSITORY                                    IMAGE   ID            CREATED        SIZE
xxxx.dkr.ecr.xxxx.amazonaws.com/hello_world   latest  c5314e4cb254  2 days ago  22.1MB
hello_world                                   latest  c5314e4cb254  2 days ago  22.1MB

以下のコマンドを実行し、2つともローカルから削除します

$ docker rmi xxxx.dkr.ecr.xxxx.amazonaws.com/hello_world:latest
$ docker rmi hello_world:latest

再度、ローカルからイメージが消えていることを確認してください

$ docker images

次にECRにプッシュしたイメージをpullします
以下のコマンドを実行してください

{aws_account_id}, {region}となっている部分にはご利用されているAWSのアカウントidとリージョンを指定してください

$ docker pull {aws_account_id}.dkr.ecr.{region}.amazonaws.com/hello_world:latest

ローカルにあるdocker imageを確認し、イメージがあればOKです

$ docker images

イメージ、リポジトリをコンソールで削除する

最後にコンソールからイメージとリポジトリを削除しておきましょう

  • イメージをチェックし、削除ボタンをクリック
  • リポジトリをチェックし、削除ボタンをクリック

Discussion