DEV Community

kaede
kaede

Posted on • Updated on

AWS 基礎 Part 2 -- ECR に ngnix の Docker イメージを push する。

Elastic Container Registory とは

伸縮性のある(AWS の特徴)
Docker コンテナを置いておくところ。

他のサービスから呼び出すときに必要。

今回では Elastic Contaner Service で呼び出す nginx コンテナを作る。


そもそもレジストリとは?

https://learn.microsoft.com/ja-jp/dotnet/architecture/containerized-lifecycle/docker-containers-images-and-registries

Docker レジストリのこと。

Docker レジストリとは Docker イメージを置く場所。


Elastic コンテナ レジストリの役割

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html

EC2 ( Elastic Computer Cloud ) がビルドして実行するための、 Docker イメージを置いておく場所と解釈した。

AWS 上だから、他のレジストリサービスよりも連携が楽だと予想する。

https://youtu.be/2_FxLp9xgmo?t=406

クラインさんの動画ではレジストリのことをレポジトリと言っているが、
同一のものだと解釈した。


nginx で html がサーブされる Docker ファイルを作る

FROM nginx:latest

COPY ./src/ usr/share/nginx/html
Enter fullscreen mode Exit fullscreen mode

nginx を DL

.src/ 下にあるファイルを
usr/share/nginx/html

にコピーしておいてもらうようにする。

すると、nginx でサーバーを建てたときにここに繋がると解釈する。


Docker ファイルから呼ばれる html を書く

Dockerfile と並列に src/index.html を作成

<h1>hello-nginx</h1>
Enter fullscreen mode Exit fullscreen mode

これにアクセスされることをゴールとする。


Docker でイメージをビルドする

イメージ名は ECR のレポジトリ名と同一にする。

https://qiita.com/OmeletteCurry19/items/fd057a7448aa3072fd1e

OmeletteCurry19 さんの記事を参考にすると、

作成時に Linux での起動を指定しないと ECS でエラーになるので注意。

Mac の場合、先に Docker for Mac の GUI アプリを起動しておくのが必要。

docker build . -t hello-nginx --platform linux/amd64

 => [internal] load build definition from Dockerfile                                                  0.0s

[+] Building 6.2s (8/8) FINISHED 
Enter fullscreen mode Exit fullscreen mode

現在地の . にある Dockerfile から
hello-nginx と言うタグをつけて
Docker イメージをビルドしてもらうコマンドになる。

 => [1/2] FROM docker.io/library/nginx:latest@sha256:b8f2383a95879e1ae064940d9a200f67a6c79e710ed82ac  2.8s

 => [2/2] COPY ./src/ usr/share/nginx/html 
Enter fullscreen mode Exit fullscreen mode

nginx の latest が DL されて
./src の中身が usr/share/nginx/html にコピーされる

docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
hello-nginx         latest    1c935d449f84   3 minutes ago   135MB
rest0406_web        latest    3a021a73f359   9 months ago    921MB
Enter fullscreen mode Exit fullscreen mode

ファイル上ではビルドしても変化がないが、
Docker 空間のイメージ上には hello-nginx と言うイメージ(リポジトリとも言うのか?)が作成されているのが確認できた。


ビルドした hello-nginx のイメージをローカルで動かす

kaede0902@rooter nginx-docker % docker run --rm -p 8080:80 hello-nginx

172.17.0.1 - - [13/Jan/2023:07:51:07 +0000] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" "-"
Enter fullscreen mode Exit fullscreen mode

建てられた。
ブラウザでアクセスすると、GET のログが流れた。

Image description

もちろんブラウザにも表示された。

これで Docker イメージがちゃんとできているのがわかった。


Elastic Container Registory に hello-nginx リポジトリを作成

https://youtu.be/2_FxLp9xgmo?t=1193

引き続きクラインさんの動画を参考にする。

Image description

ECR のリポジトリ一覧を開く。

Create repository をクリック

Image description

private で hello-nginx の名前でリポジトリを作成する

Image description

これで hello-nginx のレポジトリができた。

Image description

現在このリポジトリには何もイメージが入っていない。


hello-ngnix イメージにワークスペースのタグをつける

GitHub と同じ感覚で、GUI で作ったリポジトリに
push していくらしい。


push するために必要な aws cli コマンドを確認

View Push Commands のボタンを押すと

Image description

  • AWS ECR へのターミナルでのログイン
  • 専用の管理タグ付与
  • このリポジトリへのプッシュ

これらのコマンドを案内される。


AWC ECR にログイン

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com
Enter fullscreen mode Exit fullscreen mode

これでログイン

Login Succeeded
Enter fullscreen mode Exit fullscreen mode

username と password は置き換えなくてもいけた。


hello-nginx イメージの latest にワークスペースのタグをつける

docker tag hello-nginx:latest YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx:latest
Enter fullscreen mode Exit fullscreen mode

これでタグをつける。

docker images

YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx   latest    1c935d449f84   46 minutes ago   135MB
Enter fullscreen mode Exit fullscreen mode

実行した後にイメージリストを見ると
ECS リポジトリ/hello-nginx でイメージができている。

タグをつけるコマンドではなく、既存のイメージを使って push 用のタグのついたイメージを作成するコマンドだと解釈した。


hello-ngnix リポジトリに タグ付けしたイメージを push する

docker push YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx:latest
Enter fullscreen mode Exit fullscreen mode

そしてこれで docker push する。
git push みたいだ。push 先は毎回必要の様だが。

docker push YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx:latest
The push refers to repository [YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx]
83194315832f: Pushed 
ebb3e792ec5a: Pushed 
65812db0d576: Pushed 
683e7a9d8422: Pushed 
e0bf0268ba6a: Pushed 
c7999db6d07b: Pushed 
afd7e44a4e08: Pushed 
latest: digest: sha256:86b6b52c49dfb874d02c43845df2f676e8f6b42c7e1f31f5f08c426ef48cf506 size: 1777
Enter fullscreen mode Exit fullscreen mode

ターミナルでは成功したように見える。

Image description

ECR で見てみると、ちゃんと入っている。

これで AWS の Docker リポジトリである ECR に
hello-nginx のイメージを用意できた。


イメージを更新して追加する

Docker イメージを修正して、先ほどの手順で push する。

Image description

すると latest に新しいイメージが入る。

これで latest を使うことによって、更新された新しいイメージが使える。


今後

これでレジストリに ngnix の Docker イメージが置けた。

次はこの Docker イメージを ECR のクラスタのタスクにセットして動かし、インターネットからアクセスできる様にする。

Top comments (0)