とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Rancher DesktopでローカルでDocker Distribution Registryを動かす

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を作ることができました。 レジストリーは不要になったら削除すればいいですし、クリーンアップしたければ起動しなおすだけでリセットできます。

これで、「公開したくないイメージのイメージをどうするか」問題は解決できました。