dockerレジストリを利用してプライベートなdockerレジストリを構築します。
Dockerレジストリとは?
コンテナイメージを保存しておく場所でdocekr pullコマンドでイメージをダウンロードできます。
DockerレジストリはCI/CDシステム内で利用するのが良いです。
ソースコードのコミットをトリガーとして、Dockerレジストリのイメージをプルしてイメージをビルドしてアプリケーションをデプロイというような使い方ができます。
ここではDocker Hubのようなパブリックなレジストリではなく、プライベートなDokcerレジストリを構築します。(DockerHubでもプライベートレジストリを構築できますが無料では制限があります)
Dockerレジストリを構築する
プライベートなDockerレジストリを構築する方法は複数ありますが、ここではDocker registryを利用します。
https://docs.docker.jp/registry/deploying.html
ローカルで構築
##データ永続化のためにボリュームを作成
$ docker volume create registry
$ docker run -d -p 5000:5000 --restart=always --name registry -v registry:/var/lib/registry registry:2
##イメージをプルする
$ docker pull gcr.io/distroless/base-debian11
##イメージにタグ付けする
# docker tag gcr.io/distroless/base-debian11 localhost:5000/base-debian11
# docker images | grep base
gcr.io/distroless/base-debian11 latest 4557b0facd59 5 days ago 20.3MB
localhost:5000/base-debian11 latest 4557b0facd59 5 days ago 20.3MB
## 作成したイメージを作成したdockerレジストリにpushする
# docker push localhost:5000/base-debian11
##レジストリから取得する
# docker images | grep localhost
localhost:5000/base-debian11 latest 4557b0facd59 5 days ago 20.3MB
## レジストリからイメージをプルして確認する
## ローカルのイメージを一度削除
# docker image rm localhost:5000/base-debian11
Untagged: localhost:5000/base-debian11:latest
Untagged: localhost:5000/base-debian11@sha256:3083f1ef2e91c5d5a1268b8372e82520c888c71b79d847be5a92cbe4f801b9dc
# docker images | grep localhost
## ローカルレジストリからイメージをpullする
# docker pull localhost:5000/base-debian11
Using default tag: latest
latest: Pulling from base-debian11
Digest: sha256:3083f1ef2e91c5d5a1268b8372e82520c888c71b79d847be5a92cbe4f801b9dc
Status: Downloaded newer image for localhost:5000/base-debian11:latest
localhost:5000/base-debian11:latest
## プルしたイメージの確認
# docker images | grep localhost
localhost:5000/base-debian11 latest 4557b0facd59 5 days ago 20.3MB
ドメインとTLSを設定する
外部に公開してプルするためにドメインを設定し、セキュリティのためにTLSを設定します。
1.サーバのIPを設定したドメインを用意する(myregistrydomain.com)
2. myregistrydomian.comの証明書を取得する(Let’sencryptなど)
3. 取得した証明書をサーバの実行ディレクトリの配下certsディレクトリの下に置く
$ mkdir certs
##let'sの証明書は中間証明書と連結する必要がある
$ cat /etc/letsencrypt/live/myregistrydomain.com/cert.pem /etc/letsencrypt/live/myregistrydomain.com/fullchain.pem > ./certs/domain.crt
$ cat /etc/letsencrypt/live/myregistrydomain.com/privkey.pem > ./certs/domain.key
$ docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \
-v registry:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
##プライベートレジストリ上にイメージをプッシュしておき、別のサーバからプルする
$ docker pull myregistrydomain.com:5000/base-debian11
セキュリティ上の問題があるため、アクセス制限を設定しましょう。
basic認証やトークン認証を設定できるそうです。今回はfirewallでIP制限を行いました。
Docker Registryの操作方法
リポジトリの一覧などは提供されているAPIで確認します。
$ curl https://myregistrydomain.com:5000/v2/_catalog
{"repositories":["base-debian11"]}
イメージの削除はちょっとめんどくさいです。下記のリンクを参考にしてください。