Raspberry Pi 5にdocker registryを構築する

building-a-docker-registry-on-a-raspberry-pi-5-eyecatch Raspberry Pi 5
building-a-docker-registry-on-a-raspberry-pi-5-eyecatch

この記事ではRaspberry Pi 5にDocker Registryを立ち上げる方法を説明します。そして、立ち上げたレジストリにアクセスする方法も説明します。

はじめに

昨今、コンテナ技術がソフトウェア開発の主流となっています。その中でもDockerは最も人気のあるコンテナです。Dockerレジストリは、Dockerイメージを保存、配布、管理する役割があります。 これは、重要な基盤であり、開発チームにとってなくてはならない存在です。

しかし、パブリックレジストリに依存することは問題点もあります。セキュリティリスク開発フローの非効率性など、様々な問題を引き起こします。そこで、Raspberry Pi 5を活用してプライベートレジストリを構築します。これらの問題を解決し、開発環境を飛躍的に進化させることができるのです。

Dockerレジストリとは?

Dockerイメージを保存、配布、管理するための中央リポジトリです。イメージは、アプリケーションに必要なすべてのファイルと依存関係を含む軽量なソフトウェアパッケージです。迅速かつ簡単にデプロイすることができます。

レジストリの種類

Dockerレジストリは、パブリックプライベートの2種類に分類されます。

パブリックレジストリ

誰でもアクセスできるオープンなレジストリです。Docker Hubが最も有名な例です。パブリックレジストリは、オープンソースソフトウェアや汎用イメージを見つけるのに便利です。セキュリティバージョン管理などの面で課題があります。

プライベートレジストリ

特定の組織や個人だけがアクセスできるプライベートなレジストリです。プライベートレジストリは、機密性の高い情報を含むイメージを保存したり、開発チーム内のイメージ共有を効率化したりするのに最適です。

プライベートレジストリの構築

この章ではraspberry pi 5上にDocker registryを構築する方法を解説します。操作はraspberry pi 5で行います。

Raspberry Pi 5でプライベートレジストリを構築する利点

  1. セキュリティ強化
    •  パブリックレジストリに比べて、機密性の高いイメージを安全に保存できます。
  2. オフラインでの利用
    • インターネット接続がなくても、イメージにアクセスできます。
  3. 低コスト
    • クラウドベースのプライベートレジストリサービスに比べて、初期費用とランニングコストを削減できます。

証明書の発行

opensslコマンドで証明書の発行をします。subjectAltNameはraspberry pi 5のドメイン名にする必要があります。私はraspberrypi5-00.localという設定にしてるため、その値を使います。

Bash
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/ca.key -x509 -days 3650 -out certs/ca.crt -addext "subjectAltName = DNS:raspberrypi5-00.local"

情報を入力します。Common Nameraspberrypi5-00.localにします。これもraspberry pi 5のドメイン名です。

Bash
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:kanagawa
Locality Name (eg, city) []:yokohama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:higmasan
Organizational Unit Name (eg, section) []:iot lab
Common Name (e.g. server FQDN or YOUR name) []:raspberrypi5-00.local
Email Address []:
Bash

certsディレクトリにca.crtca.keyというファイルが作成されます。

Bash
$ ls certs/
ca.crt  ca.key
Bash

この二つのファイルを/usr/share/ca-certificats/dockerにコピーします。そして/etc/ca-certificats.confをca.crtを使用するように修正します。

Bash
$ sudo mkdir -p /usr/share/ca-certificates/docker
$ sudo cp certs/ca.* /usr/share/ca-certificates/docker
$ sudo vim /etc/ca-certificates.conf
bash
/etc/cacertificates.conf
docker/ca.crt
plaintext

設定を反映させるためにupdate-ca-certificatsコマンドを実行します。

Bash
sudo update-ca-certificates
bash

Docker Registryの起動

compose.ymlを以下のように設定します。

compose.yaml
services:
  registry:
    image: registry:2.8.3
    container_name: registry
    volumes:
      - ./certs:/certs
    ports:
      - "443:443"
    environment:
      - REGISTRY_HTTP_ADDR=0.0.0.0:443
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt
      - REGISTRY_HTTP_TLS_KEY=/certs/ca.key
      - REGISTRY_STORAGE_DELETE_ENABLED=true
    restart: always            
YAML

docker compose upコマンドでregistryを立ち上げます。

Bash
 $ docker compose up -d
Bash

docker compose psコマンドを実行して次ように表示されたらregistryは立ち上がっています。

Bash
 $ docker compose ps
NAME       IMAGE            COMMAND                   SERVICE    CREATED          STATUS          PORTS
registry   registry:2.8.3   "/entrypoint.sh /etc…"   registry   28 seconds ago   Up 27 seconds   0.0.0.0:443->443/tcp, :::443->443/tcp, 5000/tcp

同じマシンからレジストリにアクセスする

この章では、Raspberry pi 5で立ち上げたレジストリに対して、同じマシンのRaspberry pi 5からアクセスする方法を解説します。

それでは、立ち上げたレジストリにイメージをpushしてみましょう。まずは、docker Hubからイメージを取得します。取得してきたイメージに別の新しいタグを付与します。ここではraspberrypi5-00.local/ubuntu:22.04という新しいタグをつけています。

Bash
$ docker pull ubuntu:22.04
$ docker tag ubuntu:22.04 raspberrypi5-00.local/ubuntu:22.04
Bash

そして、新しいタグをつけたraspberrypi5-00.local/ubuntu:22.04というイメージをプッシュします。

Bash
$ docker push raspberrypi5-00.local/ubuntu:22.04
Bash

この段階でdocker imagesコマンドで表示されるraspberrpi5-00.local/ubuntu:22.04は既にローカルにダウンロードされているイメージです。レジストリに存在するイメージが表示されているわけではありません。

試しに、raspberrypi5-00.local/ubuntu:22.04を削除してみましょう。

Bash
$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
ubuntu                               22.04     dfbcc2701b93   2 weeks ago    69.2MB
raspberrypi5-00.local/ubuntu         22.04     dfbcc2701b93   2 weeks ago    69.2MB
registry                             2.8.3     a2d58c145a45   5 weeks ago    24.9MB
$ docker rmi raspberrypi5-00.local/ubuntu:22.04 ubuntu:22.04
$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
registry                             2.8.3     a2d58c145a45   5 weeks ago    24.9MB

この状態でdocker runコマンドを実行してみましょう。するとraspberrypi5-00.local/ubuntu:22.04

Bash
$ docker run -it --rm raspberrypi5-00.local/ubuntu:22.04 /bin/bash
Unable to find image 'raspberrypi5-00.local/ubuntu:22.04' locally
22.04: Pulling from ubuntu
89412e4d2f8b: Pull complete 
Digest: sha256:8f5072b749663bbc744b2a38bf30f3a8334434399af00d445ea06622c0cf5905
Status: Downloaded newer image for raspberrypi5-00.local/ubuntu:22.04
root@de8c91a0b24c:/# uname -a
Linux de8c91a0b24c 6.6.20+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 aarch64 aarch64 GNU/Linux

別マシンからレジストリにアクセスする

前章は、Raspberry pi 5で立ち上げたレジストリに対して、同じマシンのRaspberry pi 5からアクセスしていました。この章では同じネットワーク内の別マシンからアクセスする方法を解説します。

~/.docker/certs.dディレクトリに、レジストリを立ち上げたマシンのドメイン名のディレクトリを作成します。ここではraspberrypi5-00.localディレクトリを作成しています。

そのディレクトリに前章で作成したca.keyca.crtをコピーします。

$ mkdir -p ~/.docker/certs.d/raspberrypi5-00.local/
$ scp higmasan@raspberrypi5-00.local:~/certs/ca.{key,crt} ~/.docker/certs.d/raspberrypi5-00.local/

dockerの再起動をします。

そうしたら、raspberrypi5-00.local/ubuntu:22.04をプルしてきます。

$ docker pull raspberrypi5-00.local/ubuntu:22.04
22.04: Pulling from ubuntu
89412e4d2f8b: Download complete
Digest: sha256:8f5072b749663bbc744b2a38bf30f3a8334434399af00d445ea06622c0cf5905
Status: Downloaded newer image for raspberrypi5-00.local/ubuntu:22.04
raspberrypi5-00.local/ubuntu:22.04

docker imageコマンドで確認すると、raspberrypi5-00.local/ubuntu22.04イメージがダウンロードされています。

$ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED       SIZE
raspberrypi5-00.local/ubuntu   22.04     8f5072b74966   2 weeks ago   107MB

docker runコマンドも実行できます。確かにレジストリからイメージがダウンロードできたことがわかります。

$ docker run -it --rm raspberrypi5-00.local/ubuntu:22.04 /bin/bash
$ uname -a
Linux d9988e8fe722 6.6.22-linuxkit #1 SMP Fri Mar 29 12:21:27 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux

関連記事

  • Raspberry Pi 5にDockerをインストールする

おわりに

この記事ではRaspberry Pi 5にDocker Registryを構築する方法を説明しました。また、レジストリを立ち上げた同じマシンからアクセスする方法。同じネットワーク上の別マシンからアクセスする方法の2つを説明しました。

このサイトではRaspberry Piだけでなく他のマイコンボードやFPGA、IoT機器、ガジェットについての記事を執筆します。少しでも興味がある方や、何か要望がある方はぜひコメントください!また、Contactフォームからのお問い合わせも受け付けています。

コメント

タイトルとURLをコピーしました