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


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

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

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

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

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

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

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

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

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
FROM golang:latest

COPY main.go /go/src/
CMD ["go", "run", "/go/src/main.go"]
ビルドします
$ 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 [ローカルのイメージ名]:[タグ名] [リポジトリ名][イメージ名]:[タグ名]になります。

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

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

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

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

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

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

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

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

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

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

pullします。

$ 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
$ 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の画面からリポジトリの作成を選択します。

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

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

ECRにpushする

ECRにログイン
$(aws ecr get-login --no-include-email)
レジストリを確認します
$ 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を指定します。

$ 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にタグが作成されました。

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

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

参考にしたもの

Docker/Kubernetes 実践コンテナ開発入門
大変分かりやすい本でした。ありがとうございました。