この記事では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でプライベートレジストリを構築する利点
- セキュリティ強化
- パブリックレジストリに比べて、機密性の高いイメージを安全に保存できます。
- オフラインでの利用
- インターネット接続がなくても、イメージにアクセスできます。
- 低コスト
- クラウドベースのプライベートレジストリサービスに比べて、初期費用とランニングコストを削減できます。
証明書の発行
opensslコマンドで証明書の発行をします。subjectAltNameはraspberry pi 5のドメイン名にする必要があります。私はraspberrypi5-00.localという設定にしてるため、その値を使います。
$ 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 Nameをraspberrypi5-00.localにします。これもraspberry pi 5のドメイン名です。
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 []:Bashcertsディレクトリにca.crtとca.keyというファイルが作成されます。
$ ls certs/
ca.crt ca.keyBashこの二つのファイルを/usr/share/ca-certificats/dockerにコピーします。そして/etc/ca-certificats.confをca.crtを使用するように修正します。
$ sudo mkdir -p /usr/share/ca-certificates/docker
$ sudo cp certs/ca.* /usr/share/ca-certificates/docker
$ sudo vim /etc/ca-certificates.confbashdocker/ca.crtplaintext設定を反映させるためにupdate-ca-certificatsコマンドを実行します。
sudo update-ca-certificatesbashDocker Registryの起動
compose.ymlを以下のように設定します。
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 YAMLdocker compose upコマンドでregistryを立ち上げます。
$ docker compose up -dBashdocker compose psコマンドを実行して次ように表示されたらregistryは立ち上がっています。
$ 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という新しいタグをつけています。
$ docker pull ubuntu:22.04
$ docker tag ubuntu:22.04 raspberrypi5-00.local/ubuntu:22.04Bashそして、新しいタグをつけたraspberrypi5-00.local/ubuntu:22.04というイメージをプッシュします。
$ docker push raspberrypi5-00.local/ubuntu:22.04Bashこの段階でdocker imagesコマンドで表示されるraspberrpi5-00.local/ubuntu:22.04は既にローカルにダウンロードされているイメージです。レジストリに存在するイメージが表示されているわけではありません。
試しに、raspberrypi5-00.local/ubuntu:22.04を削除してみましょう。
$ 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
$ 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.keyとca.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.04docker imageコマンドで確認すると、raspberrypi5-00.local/ubuntu22.04イメージがダウンロードされています。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
raspberrypi5-00.local/ubuntu 22.04 8f5072b74966 2 weeks ago 107MBdocker 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 Registryを構築する方法を説明しました。また、レジストリを立ち上げた同じマシンからアクセスする方法。同じネットワーク上の別マシンからアクセスする方法の2つを説明しました。
このサイトではRaspberry Piだけでなく他のマイコンボードやFPGA、IoT機器、ガジェットについての記事を執筆します。少しでも興味がある方や、何か要望がある方はぜひコメントください!また、Contactフォームからのお問い合わせも受け付けています。



コメント