AWS 基礎 Part 2 -- ECR に ngnix の Docker イメージを push する。
Tags: aws, ecr
Published: 2023-01-22 14:10:26


# 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 ファイルを作る

```dockerfile
FROM nginx:latest

COPY ./src/ usr/share/nginx/html
```

nginx を DL

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

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

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

---

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

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

```html
<h1>hello-nginx</h1>
```

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

---

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

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

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

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

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

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

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

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

[+] Building 6.2s (8/8) FINISHED 
```

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

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

 => [2/2] COPY ./src/ usr/share/nginx/html 
```

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

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

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

---

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

```php
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" "-"
```

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhi0920q37xfkx19xli8.png)

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

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

---

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

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

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


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pts3e2vxom9fp2kmjma8.png)



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

Create repository をクリック

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kogy8bjai3klkqmrf2gp.png)

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


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kwesrhtwqgkwj65ago1.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g3uv5pnnjlip5aeqbive.png)

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

---

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

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

---

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

View Push Commands のボタンを押すと

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfxsa1i69mgbcpo84xsa.png)

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

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

---

### AWC ECR にログイン

```php
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com
```

これでログイン

```php
Login Succeeded
```

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

---

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

```php
docker tag hello-nginx:latest YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx:latest
```

これでタグをつける。

```php
docker images

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

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

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

---

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

```php
docker push YourDomainId.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx:latest
```

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

```php
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
```

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t6ej70769k12da768m5n.png)

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

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

---

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

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63kh3etpzw3p13dmo1fl.png)

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

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

---

## 今後

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

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