【AWS】Amazon ECR ~ Dockerイメージを Pull & Push ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/05/22/165711
https://dk521123.hatenablog.com/entry/2020/05/26/142645

の続き。

今回は、Dockerイメージを Pull & Pushをメモ。

目次

【1】リポジトリ作成
【2】環境構築を行う
 1)EC2 の Role にECRを実行できる権限を付与
 2)aws-cli を最新にする
 3)docker のインストール
 4)docker を sudo なしで実行できるように設定する
【3】Dockerファイルを作成する
【4】ECRにDockerイメージを登録する
 1)push commandsを参照する
 2)ECRにログインする
 3)作成したDockerfileをビルドする
 4)タグづけする
 5)ECRにプッシュする
 6)動作確認
【5】その他Tips
 1)ローカル上のイメージを全て消す
 2)イメージ名・タグの変更
 3)AWS ECRをDockerfileから使う
 4)ECRレポジトリのイメージを別環境にPushするには

【1】リポジトリ作成

* AWS-CLIでもできるらしいが、今回は、
 AWSマネージメントコンソールから作成
⇒ ちなみに「ECR」って検索すると、
 候補の一番上は「Secrets Manager」がくる。
 「Elastic Container Registry」を選ぶ。
⇒ 今回は、リポジトリ名を「hello-world-ecr」とする

* Terraformでの構築は、以下の関連記事を参照のこと

Terraform ~ AWS ECR ~
https://dk521123.hatenablog.com/entry/2023/05/23/002314

【2】環境構築を行う

EC2(今回は、Amazon Linux2) を立ち上げて以下を行う

1)EC2 の Role にECRを実行できる権限を付与
2)aws-cli を最新にする(※1)
3)docker のインストール
4)docker を sudo なしで実行できるように設定する

※1

デフォルトEC2だと「aws ecr get-login-password」がなかったので

1)EC2 の Role にECRを実行できる権限を付与

今回は、「AmazonEC2ContainerRegistryFullAccess」を付与。

権限付与を行わないと、以下のサイトのように
ECRのGetAuthorizationToken操作権限がないっと怒られる。

https://blogenist.jp/2018/03/22/3048/

2)aws-cli を最新にする

# 古いとコマンドが対応していなくてエラーになったので。
# aws-cli 1.16.300, Python2.7.16 => aws-cli 1.18.65, Python3.7.6

sudo yum install python3 -y
sudo pip3 install awscli --upgrade
/usr/local/bin/aws --version

https://dev.classmethod.jp/articles/latest-version-awscli-al2/

3)docker のインストール

sudo yum install -y docker
sudo service docker start
sudo service docker status

Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030

4)docker を sudo なしで実行できるように設定する

Docker ~ docker を sudo なしで実行する ~
https://dk521123.hatenablog.com/entry/2023/11/22/000000

# 自分のユーザを調べる(今回は「ssm-user」)
whoami

sudo gpasswd -a ssm-user docker
sudo service docker restart
exit
# 再度、入りなおす(これ、必要!)

【3】Dockerファイルを作成する

vi Dockerfile
# 修正内容は以下の通り。

Dockerfile

# 今回は、CentOS7/Python3.6を入れる
FROM centos:centos7

# Install dependencies
RUN yum -y update
RUN yum -y install \
            git \
            zlib \
            tk-devel \
            tcl-devel \
            ncurses-devel \
            gdbm-devel \
            db4-devel \
            readline-devel \
            zlib-devel \
            bzip2-devel \
            sqlite-devel \
            openssl-devel \
            libXext.x86_64 \
            libSM.x86_64 \
            libXrender.x86_64 \
            gcc \
            gcc-c++ \
            libffi-devel \
            python-devel \
            patch \
            bzip2 \
            jq \
            make

ENV ROOT_PATH /root
ENV PY_VERSION 3.6.10

# Download Python3.6.10
WORKDIR $ROOT_PATH
RUN curl -O https://www.python.org/ftp/python/$PY_VERSION/Python-$PY_VERSION.tgz
RUN tar xzvf Python-$PY_VERSION.tgz

# Install Python3.6.10
WORKDIR $ROOT_PATH/Python-$PY_VERSION
RUN ./configure --with-threads
RUN make install

# Install pip
WORKDIR $ROOT_PATH
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py

WORKDIR /root
CMD ["/bin/bash"]

【4】ECRにDockerイメージを登録する

結構、他のサイトだとごちゃごちゃ書いているが、
非常に簡単にできた。

1)push commandsを参照する

[1] AWSマネージメントコンソール「Elastic Container Registry」で
  作成したリポジトリを選択。
[2] 右側にある「View push commands」ボタンを押下。
[3] 使用しているOSのタブを選択
  (今回はEC2「Amazon Linux」なので「maxIS / Linux」)
 ⇒ ECRにDockerイメージを登録するまでの
  手順(4Step)・コマンドがのっているので、
  その通りに行うだけ。

2)ECRにログインする

# AWSマネージメントコンソールの手順 1(Retrieve an authentication taken...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker login [オプション] [サーバ]
# (--username:ユーザ名、--password-stdin:標準出力からパスワードを設定)
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin xxxx.xxx.ecr.us-west-2.amazonaws.com

3)作成したDockerfileをビルドする

# AWSマネージメントコンソールの手順 2(Build your Docker image...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# 新しいイメージを作成する
# docker build -t [【1】で作成したリポジトリ名]
docker build -t hello-world-ecr

4)タグづけする

# AWSマネージメントコンソールの手順 3(After the build completes,...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker tag [イメージID] [リポジトリ名]:[タグ]
docker tag hello-world-ecr:latest xxxx.xxx.ecr.us-west-2.amazonaws.com/hello-world-ecr:latest

5)ECRにプッシュする

# AWSマネージメントコンソールの手順 4(Run the following command...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker push [コンテナ名]
docker push xxxx.xxx.ecr.us-west-2.amazonaws.com/hello-world-ecr:latest

6)動作確認

AWSマネージメントコンソール「Elastic Container Registry」を再読み込みし、
対象のリポジトリ名の配下に作成したイメージがあればOK!

【5】その他Tips

1)ローカル上のイメージを全て消す

sudo docker ps -aq | sudo xargs docker rm -f

補足1:docker ps

* コンテナを一覧表示

--all , -a: 全てのコンテナを表示(デフォルトは実行中のコンテナだけ表示)
--quiet , -q: コンテナ ID のみ表示

https://docs.docker.jp/engine/reference/commandline/ps.html
補足2:xargs コマンド

* 標準入力やファイルからリストを読み込み、コマンドラインを作成して実行する

https://atmarkit.itmedia.co.jp/ait/articles/1801/19/news014.html
補足3:docker rm

* 1つまたは複数のコンテナを 削除remove 

* --force , -f: 実行中のコンテナを強制的に削除( SIGKILL を使用)

https://docs.docker.jp/engine/reference/commandline/rm.html

2)イメージ名・タグの変更

https://sleepless-se.net/2019/04/14/change-docker-image-and-tag-name/

dokcer tag IMAGE_ID IMAGE_NAME:TAG

3)AWS ECRをDockerfileから使う

* 普通に使える

Dockerfile

FROM xxxx.xxx.ecr.us-west-2.amazonaws.com/hello-world-ecr:latest
...

https://aws.amazon.com/jp/blogs/news/build-a-continuous-delivery-pipeline-for-your-container-images-with-amazon-ecr-as-source/

4)ECRレポジトリのイメージを別環境にPushするには

# Step1: Loginする
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin xxxx.xxx.ecr.us-west-2.amazonaws.com

# Step2: Docker Pullする
# 【構文】docker image pull [AWS ECR環境]/[ECR Repository name]:[Tag]
docker image pull xxxx.xxx.ecr.us-west-2.amazonaws.com/your-ecr-repository-name:latest

# Step3: 別環境にログインしなおす
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin yyyyy.yyy.ecr.us-west-2.amazonaws.com

# Step4: Tag付けする
# 【構文】docker image tag [DockerImage] [別環境のAWS ECR環境]/[別環境のECR Repository name]:[Tag]
docker image tag your-ecr-repository-name:latest yyyyy.yyy.ecr.us-west-2.amazonaws.com/other-ecr-repository-name:latest

# Step5: Docker Pullする
docker image pull yyyyy.yyy.ecr.us-west-2.amazonaws.com/other-ecr-repository-name:latest

関連記事

Amazon ECR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/22/165711
Amazon ECR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/26/142645
Amazon ECR ~ AWS CLI
https://dk521123.hatenablog.com/entry/2024/01/05/000000
Terraform ~ AWS ECR ~
https://dk521123.hatenablog.com/entry/2023/05/23/002314
Docker ~ docker を sudo なしで実行する ~
https://dk521123.hatenablog.com/entry/2023/11/22/000000
Docker ~ Docker Hub への登録 ~
https://dk521123.hatenablog.com/entry/2024/01/21/125706
脆弱性エラー対応時に役立ったDockerコマンド
https://dk521123.hatenablog.com/entry/2024/02/03/020736