Dockerイメージをレジストリに登録する（ECR含む）

Dockerイメージの登録についてまとめておきます。


## ローカルレジストリに登録

#### ローカルレジストリを作成

ローカル環境にdockerレジストリを作成します。
Docker Hubに公式イメージの「registry」が用意されていますので、今回はこちらを利用します。

以下コマンドで5000番ポートにレジストリを立ち上げます。

```console
$ docker image pull registry:latest
$ docker container run -t -p 5000:5000 registry:latest
```

#### 登録するDockerイメージを作成します。

今回はgo言語で`Hello World!!`を返却するWebアプリを作成してみます。
以下2つのファイルが今回利用するgoのWebアプリケーションとDockerfileになります。

```go:main.go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World!!")
    })

    http.ListenAndServe(":8080", nil)
}
```

```dockerfile:Dockerfile
FROM golang:latest

COPY main.go /go/src/
CMD ["go", "run", "/go/src/main.go"]
```

##### ビルドします

```console
$ docker image build -t example/go:latest .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM golang:latest
 ---> 9fe4cdc1f173
Step 2/3 : COPY main.go /go/src/
 ---> Using cache
 ---> 38b645fa14c8
Step 3/3 : CMD ["go", "run", "/go/src/main.go"]
 ---> Using cache
 ---> 273a059475c4
Successfully built 273a059475c4
Successfully tagged example/go:latest
```

##### タグをつけます
形式は`docker image tag [ローカルのイメージ名]:[タグ名] [リポジトリ名][イメージ名]:[タグ名]`になります。


```console
$ docker image tag example/go:latest localhost:5000/example/go:20190804
```


#### Dockerイメージを作成したレジストリに登録します。

以下コマンドでDockerイメージをレジストリに登録することが可能です。
`docker image push [リポジトリURL][作成したタグ名]`

```console
$ docker image push localhost:5000/example/go:20190804
```

作成されたことを以下のコマンドで確認可能です。

```console
$ curl http://localhost:5000/v2/_catalog
{"repositories":["example/go"]}
```

念のためレジストリからローカルにpullしてみます。

最初にローカルにあるタグを削除します。

```console
$docker image rm localhost:5000/example/go:20190804
$ docker image ls | grep example/go
example/go                                                       latest              e4a2773a9830        14 minutes ago      781MB
```

20190804のタグは削除されました。

pullします。

```console
$ docker pull localhost:5000/example/go:20190804
20190804: Pulling from example/go
Digest: XXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Status: Downloaded newer image for localhost:5000/example/go:20190804
localhost:5000/example/go:20190804
```

```console
$ docker image ls | grep example/go
example/go                                                       latest              e4a2773a9830        15 minutes ago      781MB
localhost:5000/example/go                                        20190804            e4a2773a9830        15 minutes ago      781MB
```

5000番ポートに作成したレジストリからpull出来ました。


## ECRに登録する

次にECRに登録してみます。
aws cliの設定は既に終わっている前提とします。

### ECRにリポジトリを作成

ECRの画面から`リポジトリの作成`を選択します。

<img width="1340" alt="スクリーンショット 2019-08-04 21.20.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406169/6b92a9e3-345d-af91-1d36-8bb720138416.png">

リポジトリ名を入力してリポジトリの作成をクリックします。
今回はexampleにしてみます。

<img width="867" alt="スクリーンショット 2019-08-04 21.21.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406169/e87f26f3-9356-c556-90df-e113e0287df4.png">

リポジトリが作成されました。

<img width="1058" alt="スクリーンショット 2019-08-04 21.25.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406169/da502b81-ea0d-0955-b9f5-5fb57c7d92fb.png">

### ECRにpushする

##### ECRにログイン
```sh
$(aws ecr get-login --no-include-email)
```

##### レジストリを確認します
```console
$ aws ecr describe-repositories

{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/example",
            "registryId": "XXXXXXXXXXXX",
            "repositoryName": "example",
            "repositoryUri": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/example",
            "createdAt": 1564921553.0
        }
    ]
}
```

##### pushします
push先のリポジトリはECRで作成したリポジトリになります。
ECRの画面にあるURIを指定します。

```console
$ docker image tag example/go:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/example:20190804
$ docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/example:20190804
```

ECRにタグが作成されました。

<img width="1031" alt="スクリーンショット 2019-08-04 21.37.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406169/bde55c6c-448e-a784-dd38-0b16b6a0bea7.png">

ちなみにAWS CLIでも確認可能です。

```console
$ aws ecr describe-images --repository-name example
{
    "imageDetails": [
        {
            "registryId": "XXXXXXXXXX",
            "repositoryName": "example",
            "imageTags": [
                "20190804"
            ],
            "imageSizeInBytes": 296164653,
            "imagePushedAt": 1564922252.0
        }
    ]
}
```

### 参考にしたもの
[Docker/Kubernetes 実践コンテナ開発入門](https://gihyo.jp/book/2018/978-4-297-10033-9)
大変分かりやすい本でした。ありがとうございました。