■ はじめに
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 ...
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 ~ 別アカウントのECRにPull/Push ~
https://dk521123.hatenablog.com/entry/2024/05/14/232934
Amazon ECR ~ 別アカウントからInspector2を操作するには ~
https://dk521123.hatenablog.com/entry/2024/05/16/212100
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