Docker DesktopやRancher Desktopを開発環境で利用している人は多いでしょう。 イメージレジストリーについてはSaaSのサービス、通常はDocker Hubとかを利用しているかもしれません。
Gitベースの開発では、「GitHub Container Registry」や「GitLab Container Registry」などを使っているかもしれません。その他、パブリッククラウドが用意するコンテナレジストリーなどもありますね。
これらは便利なのですがまれにテスト中のイメージで色々な内部的なコードが入っており、外部のレジストリーにイメージを公開したくないなあと思う時があります。そんなときに使えるのが「Docker Distribution Registry」です。
Docker Desktopの場合は、これを実行してDocker Desktopの設定の中の「Insecure Registry」として追加することで簡単に利用可能でした。
一方、Rancher Desktopにはそのような設定をする画面が用意されていません。調べたところ、次のような情報が見つかりました。
事前設定
Rancher Desktopを起動して、つぎのようにDockerとKubernetesを有効化しておきます。 メモリーとCPUはリソースと相談して良い感じに設定します。
DOCKER_OPTSでInsecure Registryを設定
Rancher Desktopの公式サイトは以下にあります。このサイトの下の方にOS別にどのようなコンポーネントによって動作しているかを示す、構成図が用意されています。
macOSの場合はLima (Linux on Mac)を使って、その上でRancher DesktopはDockerやKubernetesを動かしています。limaのシェルに入って、DOCKER_OPTSに追加するのが正式なやり方のようです(一方、Windowsではwslのシェル)。
macOSの場合を例に、設定を以下に示します。
limaのシェルに入ります。cat /etc/os-release
で調べたら、Alpine Linuxベースでした。
$ LIMA_HOME="$HOME/Library/Application Support/rancher-desktop/lima" "/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl" shell 0
--insecure-registry
行を追記します。ローカルからアクセスできればいいので、127.0.0.1
を指定しました。
lima-rancher-desktop:~$ sudo vi /etc/conf.d/docker DOCKER_OPTS="--insecure-registry=127.0.0.1:5000"
- 設定が終わったらexitでシェルから抜けて、Rancher Desktopを再起動する。
Distribution Registryを動かす
Distribution Registryを動かすにはつぎのように実行します。
本来は-v
でディレクトリーをバインドしたり、Docker Volumeを使うなどして良い感じにデータボリュームを渡してあげる法が良いのですが、ローカルで動かすかつ要らなくなったら破棄したいのもあって、イメージの説明にあるようにコンテナを実行します。5000番ポートでアクセスできるように設定してください。
% docker run -d -p 5000:5000 --restart always --name registry registry:2
Distribution Registryにイメージを登録
イメージはつぎのような感じで登録できます。
% docker pull busybox:latest (registryサーバーでイメージをpull) % docker tag busybox:latest localhost:5000/busybox:latest (イメージにタグをつける) % docker push localhost:5000/busybox:latest (イメージをregistryに登録)
Distribution Registryの動作確認
動作確認をする前に、事前にキャッシュを削除しておいてください。
% docker image rm busybox:latest % docker image rm localhost:5000/busybox:latest
つぎのように実行してイメージがPullされれば、ローカルでDistribution Registryの稼働と利用のための設定ができています。
% docker image pull localhost:5000/busybox:latest latest: Pulling from busybox Digest: sha256:2c5e2045f35086c019e80c86880fd5b7c7a619878b59e3b7592711e1781df51a Status: Downloaded newer image for localhost:5000/busybox:latest localhost:5000/busybox:latest
Distribution RegistryのイメージをK8sで使ってみる
Dockerだけであれば実はDistribution Registryは正直不要なのですが、K8sでアプリケーションを動かしたい時は、パブリックレジストリーに公開されていないイメージの利用は色々と面倒になります。そんなときにDistribution Registryが役立ちます。
まず試しにこのようなマニフェストファイルを作って...
% cat busybox.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp1 spec: replicas: 1 selector: matchLabels: app: myapp1 template: metadata: labels: app: myapp1 spec: containers: - name: myapp1 image: 127.0.0.1:5000/busybox:latest tty: true
kubectlコマンドを使ってPodを作成してみます。
% kubectl create -f busybox.yaml deployment.apps/myapp1 created % kubectl get -f busybox.yaml NAME READY UP-TO-DATE AVAILABLE AGE myapp1 1/1 1 1 88s
問題なくローカルレジストリーのイメージを使って、Kubernetes Podを作ることができました。 レジストリーは不要になったら削除すればいいですし、クリーンアップしたければ起動しなおすだけでリセットできます。
これで、「公開したくないイメージのイメージをどうするか」問題は解決できました。