みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Raspberry Pi 4BでDockerを使う

Raspberry Pi 4BのCPUは4 core 1.5 GHzであり,サーバー用途としては十分ですが,開発環境としては遅いです.当たり前ですがIntel 4 core 3.2GHz CPUと比較すると処理速度は遅いです*1. 最近はDockerがマルチプラットフォームビルドに対応しているので,x64の開発環境でDocker imageをビルドしたものをarmのRaspberry Pi 4Bで実行することができます.

Docker Buildx | Docker Documentation

Raspberry PiにDockerをインストール

Debian系列のOSにDockerをインストールする手順は,以下の公式ドキュメントに記載されています.

Install Docker Engine on Debian | Docker Documentation

https://get.docker.com/からダウンロードしたシェルスクリプトを実行するだけでDockerがインストールできるので便利です.

開発用のマシンでイメージをビルド

macにインストールしたDocker 20.10.2 darwin/amd64 を使って,以下のような簡単なイメージを作成します.

Dockerfile

FROM python:3.8-slim-buster
CMD python --version

Raspberry Piは linux/arm/v7ですので,platformオプションを指定して,Raspberry Pi用にビルドします.

$ docker buildx build --platform linux/arm/v7 --tag rasp:latest  .

イメージを転送

Dockerではcontainer registryにpullしたりpushしたりすることが多いですが,手元にあるパソコンから手元にあるRaspberry Piにイメージを転送するのにわざわざ外部にあるcontainer registryを使うのは大袈裟ですし,間違って公開してしまうかもしれません.手元にcontainer registryを作るのも面倒です.

Dockerにはファイルシステムを介してイメージを転送するsave/loadコマンドがあるので,これを使います.まずはsaveコマンドでraspタグがついたイメージをrasp.tarに書き出します.

$ docker save -o rasp.tar rasp

rasp.tarファイルをUSBスティックにコピーして,Raspberry Piに接続し,loadコマンドで読み込みます.

$ docker load -i rasp.tar 

Raspberry Piでイメージを実行

イメージを実行してみます.

$ docker run -it --rm rasp:latest
Python 3.8.8

Dockerfileのcommand python --versionが実行され,Pythonのバージョンが正しく表示されました.darwin/amd64でlinux/arm/v7用のイメージが正常にビルドでき,マルチプラットフォームな開発ができることが分かりました.

*1:開発環境としては消費電力が低いことよりも,開発者を待たせないことが重要です.