##目標
AWS ECRを利用したDockerコンテナレジストリ上にDokcerイメージの保存及び取得を実施する。
##はじめに
以下Youtube動画(by くろかわこうへい氏)に沿ってハンズオンを実施した結果をアウトプットとして記載致しました。
AWS ECRに関する基本事項は以下のリンクより学習することが出来ます。
今から追いつくDocker講座!AWS ECSとFargateで目指せコンテナマスター!〜シリーズ3回目〜
##前提
・Dockerデーモンが起動しているEC2インスタンス(Amazon Linux2)が構築済みであること(※)。
※以下記事の手順1「Dockerデーモン起動」までを完了すれば前提は整います。
【Docker】dockerfileを利用してEC2にApacheコンテナを構築(Dockerデーモン起動)
##作業の流れ
項番 | タイトル |
---|---|
1 | ECRの構築 |
2 | ECRアクセス用IAMロールアタッチ |
3 | ECRにDockerイメージを保存する |
4 | ECRからDockerイメージを取得する |
##手順
###1.ECRの構築
ECRコンソールからレポジトリ作成を開始します。
レポジトリ名を入力し(本記事ではtestrepo
としました)、下段にあるレポジトリ作成実行ボタンをクリック
###2.ECRアクセス用IAMロールアタッチ
EC2からECRへアクセスするための権限を付与するため、IAMロールの作成、及び対象EC2インスタンスへのアタッチを実施します。
IAMロールコンソールからロールの作成をクリック
今回はIAMロールをEC2にアタッチするため、EC2を信頼されたエンティティとして設定します。
ECRへのフルアクセス権を付与するIAMポリシーAmazonEC2ContainerRegistryFullAccess
をIAMロールに埋め込みます。
IAMロール名を記載(本記事ではecr-access
と設定)しロールの作成を実行します。
作成したIAMロールを対象のEC2インスタンスへアタッチします。
###3.ECRにDockerイメージを保存する
対象のEC2インスタンスへOSログイン(ルートユーザ前提として記載します)し、dockerfile
の記載を行います。
サンプルとして、httpdをインストールし、コンテナ起動時にhttpdを自動起動するDockerイメージを作成するような処理を記述します。
FROM centos:centos7
RUN yum -y install httpd
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
次にECRコンソールに戻り、作成したECRレポジトリを選択しプッシュコマンドの表示
をクリックします。
すると対象のECRレポジトリにプッシュを行うために一連のコマンドが表示されます。
これらを順に実行していく流れとなります。
まずは上記プッシュコマンド群の1番目をコピーして実行します。
内容はECRレポジトリへのログインパスワードを取得し、そのパスワードを標準入力としてdocker login
を実行するという内容です。
Login Succeededと表示されればOKです。(IAMロールの設定等が誤っているとcredential系のエラーが表示されます)
[root@ip-172-31-35-94 ~]# aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2番目のコマンドは通常のdocker build
コマンドです。
docker build -t testrepo .
3番目のコマンドでECRレポジトリプッシュに必要なタグ付けをdocker tag
で実施します。
[root@ip-172-31-35-94 ~]# docker tag testrepo:latest 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
[root@ip-172-31-35-94 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo latest 306adf672fc7 10 minutes ago 330MB
testrepo latest 306adf672fc7 10 minutes ago 330MB
centos centos7 8652b9f0cb4c 2 months ago 204MB
4番目のコマンドで実際にdocker push
を実行します。
[root@ip-172-31-35-94 ~]# docker push 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
The push refers to repository [932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo]
9cdaef33df63: Pushed
174f56854903: Pushed
latest: digest: sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c size: 741
aws ecr describe-images --repository-name リポジトリ名 --region ap-northeast-1
を実行し、プッシュしたイメージが確認出来ればOKです。
[root@ip-172-31-35-94 ~]# aws ecr describe-images --repository-name testrepo --region ap-northeast-1
{
"imageDetails": [
{
"artifactMediaType": "application/vnd.docker.container.image.v1+json",
"imageSizeInBytes": 135861914,
"imageDigest": "sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c",
"imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
"imageTags": [
"latest"
],
"registryId": "932699493995",
"repositoryName": "testrepo",
"imagePushedAt": 1610607670.0
}
]
}
###4.ECRからDockerイメージを取得する
ECRコンソールから、ECR内に保存されているDockerイメージのURLをコピーします。
コピーしたURLをdocker pull
コマンドの引数として実行します。
[root@ip-172-31-35-94 ~]# docker pull 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
latest: Pulling from testrepo
Digest: sha256:33f3b20422ea489ca61be9a5b4334b0a68572989b4143bca3cb6d55825c2c07c
Status: Downloaded newer image for 932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest
932699493995.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:latest