Dockerレジストリサーバーの構築

Docker ComposeではDockerfileのpathだけ指定すればImageをビルドしてくれるので非常に簡単でしたが、k8sクラスタで自分でビルドしたImageを使用するには一工夫必要なようです。
方法の1つは、k8sが内包しているDockerを使ってImageを予めビルドしておけばそのイメージを使える。ようなんですが、うまくImageを参照できなかったケースがありました。
これの原因はまだ解決しておらず試行錯誤中ですが、代替案として自前のImageを自前のレジストリに登録してそこからpullするようにすればいいんじゃないかと思い試した次第。

DockerらしくレジストリサーバーのコンテナもDockerHubに登録されていますのでそれを使ってすぐ利用できます。

Docker Registry

今回は2.7.1のtagを使用して動作を確認しています。

ネットワークの作成

後述しますが、今回WebUIとしてdocker-registry-frontendを利用する予定で、docker-registry-frontendからDocker Registryを参照するので同じネットワークに属させる為にまずネットワークを作成しコンテナ起動時に作成したネットワークを指定します。
これにより、後にdocker-registry-frontendでDocker RegistryのIPを指定する箇所でコンテナ名を書けば疎通できるようになります。

ネットワーク名はregistry-networkとしておきます。

$ docker network create registry-network
run
$ docker run -d -p 5000:5000 --restart always --name registry --net registry-network registry:2.7.1

ドキュメント通りでネットワークを追加したのみです。
一点注意点としてはデフォルトの状態だとデータ永続化の為に無名のデータボリュームを作成し/var/lib/registryにマウントします。
そのため、コンテナを削除して再度docker runする際は、vオプションでvolumeを指定するか、コンテナの削除時にデータボリュームが削除されるようにdocker runにrmオプションをつけるか、コンテナ削除時にvオプションでボリュームを削除するようにしないとコンテナ作成の度に無名のデータボリュームが作成されていってしまうので注意。

docker-registry-frontend

今回はv2のtagを使用して動作を確認しています。

run
$ docker run -d -e ENV_DOCKER_REGISTRY_HOST=registry -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8080:80 --net registry-network konradkleine/docker-registry-frontend:v2  

前述の通りregistryの指定にはコンテナ名を指定してネットワークも指定します。。ポートは8080にポートフォワードしているのでlocalhost:8080でWelcome, to the Docker registry!なはずです。

あとはタグを付けてpushするとWebUIからもImageが確認でき、pullもできるようになります。

Tag the image so that it points to your registry

docker image tag ubuntu localhost:5000/myfirstimage

Push it

docker push localhost:5000/myfirstimage

Pull it back

docker pull localhost:5000/myfirstimage
https://docs.docker.com/registry/