💫

【Docker】【AWS】ECRへpushするまでの作業

2024/10/19に公開
                                 <大まかな手順>
1 EC2インスタンス上にdockerをインストール
    A dnf install docker
2 localで起動確認したDockerfileをdockerhubへpush
    A locakでDockerfileを起動確認
    B dockerhubへpush
3 dockerhubから1で作成したEC2インスタンスに2で作成したdockerimageをpullする作業
    A 1のEC2インスタンスへ入り、下記の作業
4 AWSのECSの画面から、ECRのプライベートリポジトリを作成
    A 1のEC2インスタンス内で、awsコマンドが意図したAWSアカウントに対し使えるかの確認及び設定(push時にawsコマンドを利用)
    B AWSのECSの画面からECRへ移動し、プライベートリポジトリを作成
    C dockerグループをssm-userに加え、sudoなしでdockerコマンドが扱えるように、権限の付与
    D 3AでEC2インスタンスへpullしたimageを、4Bで作成したECRのプライベートリポジトリにpush

1 EC2インスタンス上にdockerをインストール
A dnf install docker

linux2023にdnfでdockerをinstall
dnf repolist
dnf list | grep docker
dnf install docker

systemctl status docker.service
systemctl start docker.service
systemctl status docker.service

docker images
docker ps -a

systemctl enable docker.service

2 localで起動確認したDockerfileをdockerhubへpushする
A locakでDockerfileを起動確認(ローカル側の作業)
Dockerfileについて:https://zenn.dev/jun202407060017/articles/c21bd3a9be8cfb

docker がinstallされているか下記で確認
docker --version
ローカルから不要なimageを削除
docker images
docker rmi [image_id] [image_id] [image_id]
docker ps -a
docker images
imageの削除を確認
docker ps -a
containerがあれば削除
docker rm CONTAINER_ID

B dockerhubへpush
dockerhubへログインし、 ブラウザで作成したリポジトリへpush

docker login
docker images
imageIDを確認して、tag付け
docker tag [image_id] [dockerhub_username]/[dockerhub_repositoryname]:[tagname]
docker images
docker push hubusername/hubrepository:tag でpush
docker push [dockerhub_username]/[dockerhub_repositoryname]:[tagname]
docker images

3 dockerhubから1で作成したEC2インスタンスに2で作成したdockerimageをpullする作業
A 1のEC2インスタンスへ入り、下記の作業

sudo docker login
docker ps -a
docker pull [dockerhub_username]/[dockerhub_repositoryname]
docker images
docker run --name [dockerhub_repositoryname] [image_id]

Hello!docker!の表示を確認

・ミスした時の削除用作業
containerの削除
docker ps -a
docker rm [containerid]
docker ps -a
imageの削除
docker images
docker rmi [imageid]

4 AWSのECSの画面から、ECRのプライベートリポジトリを作成
A 1のEC2インスタンス内で、awsコマンドが意図したAWSアカウントに対し使えるかの確認及び設定(push時にawsコマンドを利用)

ssm接続したEC2インスタンス内で下記の作業

aws --version

で起動確認後、

aws configure

すると、アカウントIDを聞かれる。
今わからない場合、Enterを連打し、コマンドを終える。

アクセスキー
シークレットアクセスキー

が必要となるため、IAMでユーザー作成(権限はなるべく最小限がベスト)し、aws_cliの権限許可用のユーザー作成。

・1、2つ目の入力欄 → アクセスキー/シークレットアクセスキー
A IAM > ユーザー > username
でユーザー作成後、
B アクセスキーの作成
でアクセスキー/シークレットアクセスキーを取得。
・3つ目の入力欄 → ap-northeast-1
その後、regionをap-northeast-1(東京の場合)など、取得したregion名を入力する。AWSのURLからもコピペ可。
・4つ目の入力欄 → json
最後にjsonで出力するファイル形式を入力する。デフォルトですでにjsonとなっており、空白+EnterでもOK。(指定しておいた方が確実)

ssm接続などした状態でEC2インスタンス上で、再度

aws configure

入力がうまくいき、情報が取得できるかの確認

aws ec2 describe-instances

vimやlessのようにjson形式のec2インスタンス情報が閲覧できたらOK。

B AWSのECSの画面からECRへ移動し、プライベートリポジトリを作成

AWSのUIに沿って、ECRのプライベートリポジトリを作成。

「ECR」の「pushコマンドを表示」から、下記を取得。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS[固定] --password-stdin [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com

build時に、ローカルリポジトリにtag付けできるオプション -t(今回はbuild作成済みなので不要)
docker build -t [dockerhubusername]/[dockerhubrepositryname]:[tagname] [Dockerfileのカレントディレクトリからの相対位置]

docker tag [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]
ECRは、ブラウザで(プライベート)リポジトリを作成後、localからpushする際に、ECR上のリポジトリにtag付けを行い、pushの流れがあります。dockerhubと同じように「tag付け」「push」の流れが
必要です。

docker push [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]

ここで、docker push をする際に、ssm-userをdockerグループに加えないと、ssm-userのままdocker pushが使えません。ということは、configureの時に入力した認証情報が、/home/ssm-user/.aws直下にconfig,credentialsが作成されていますが、sudoでしかdocker pushが利用できない場合、/root/.aws直下を参照するため、同ファイルの作成が必要となりますが、管理の面で不要な重複したファイルがrootとssm-userでできてしまうため、ssm-userをdockerグループに加えます。

C dockerグループをssm-userに加え、sudoなしでdockerコマンドが扱えるように、権限の付与

初期設定のssm-userだと、dockerコマンドが利用できないため、
docker images
では表示されず、管理者権限を付与したsudoを先頭につけ、
sudo docker images
で表示されます。
ssm-userをdockerグループに加えると、ssm-userで
docker images
が表示されるため、下記の手順で行います。

ここで、groupに追加されているusernameを下記で確認します。
cat /etc/group
最下部にdockerの文字が確認できます。下から2番目はssm-userです。
ssm-userでdockerを利用したいので、cat /etc/groupで確認したssm-userをdockerのグループへusermodします。
usermod -aG docker ssm-user
ここでec2インスタンスからログアウト、再ログインし設定反映させます。

再ログイン後、
whoami 
でssm-userを確認し、
docker images
でdockerを実行できているようになれば、dockerグループにssm-userを加えたため、sudo権限が不要で直接ssm-userでdockerコマンドが利用可能です。

D 3AでEC2インスタンスへpullしたimageを、4Bで作成したECRのプライベートリポジトリにpush

ECRで確認可能な「プッシュコマンドを表示」から、上から順番に実行。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS[固定] --password-stdin [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com
 → aws configure で設定済みであれば、自身のAWSアカウントからpull可能な状態になる。


build時に、ローカルリポジトリにtag付けできるオプション -t(今回はbuild作成済みなので不要)
docker build -t [dockerhubusername]/[dockerhubrepositryname]:[tagname] [Dockerfileのカレントディレクトリからの相対位置]
 → tag付けしておかないと、3番目をいきなり実行すると失敗する。ローカル側のimageにtag付け。

docker tag [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]
ECRは、ブラウザで(プライベート)リポジトリを作成後、localからpushする際に、ECR上のリポジトリにtag付けを行い、pushの流れがあります。dockerhubと同じように「tag付け」「push」の流れが
必要です。
 → AWS側のECR(プライベートリポジトリ)にtag付け。push先のpathを固定で命名のイメージ。

docker push [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]
 → 3番目のtag付けで、「[12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]」というdocker imageがEC2インスタンス上にできたので、localと同じ要領でpushを行う。

結果、下記の最後のコマンドを使用し、ECRの画面で、リポジトリがlatestタグで確認できれば、pushの成功が確認できました。

docker push [12桁のAWSアカウントのID(数値)].dkr.ecr.ap-northeast-1.amazonaws.com/[dockerhubusername]/[dockerhubrepositryname]:[tagname]

Discussion