【Docker】【AWS】ECRへpushするまでの作業
<大まかな手順>
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