BerryBoot環境のRaspberryPiでDockerHubのコンテナを起動してみる
今回はDocker のインストールとDocker Hub のオフィシャルコンテナをRaspberryPi上でいくつか動かしてみます。
DBやミドルウェアが手軽に導入できたり、壊れたらさくっと作り直せるのでDocker 環境はあると重宝します。
環境
リソース | 内容 |
---|---|
本体 | Raspberry Pi4 Model B 4GB RAM |
OS | BerryBoot 上のRaspberry Pi OS 32bit, 64bit |
- Docker 概要など基礎的な説明は省略します。
Docker インストール
Docker 公式サイトにRaspbian でのインストール方法が手順が載っています。
https://docs.docker.com/engine/install/debian/
apt のパッケージも試してみましたが若干古いバージョンになるので、公式のインストールスクリプトを利用します。
32bit, 64bit どちらのOSでも同じ手順でインストールできました。
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh $ sudo usermod -aG docker {ユーザ名}
通常であれば以上で完了ですが、BerryBoot 上ではstorage-driver を変更しないと動かなかったので設定します。
- 編集ファイル:/lib/systemd/system/docker.service
- 修正内容:ExecStart の末尾に「--storage-driver=vfs」を追記
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --storage-driver=vfs
コピーオンライトでなくなってしまうのが残念ですが仕方ないのでこれで行きます。
修正したらDocker を再起動します。
$ sudo systemctl restart docker
コンテナ起動
試しに定番の「alpine」を起動してみます。
docker の起動を確認します。
$ sudo systemctl status docker $ docker -v
個人的な使い方ですが、docker-compose などでサブネットを指定したい場合がちょいちょいあるので最初に作っておきます。利用しなければ不要です。
$ docker network create --subnet=172.19.0.0/24 docker_nw
コンテナを取得します。
$ docker pull alpine $ docker images
起動してみます。
$ docker run --name sandbox -d alpine /sbin/init $ docker ps
接続できれば完了です。
$ docker exec -it sandbox ash # uname -a Linux sandbox 4.19.127v64 #1 SMP PREEMPT Fri Jun 12 22:09:51 CEST 2020 aarch64 Linux # cat /etc/issue Welcome to Alpine Linux 3.12
アーキについて
RaspberryPi のCPUはARMですが、x86系と比べると公開されてるコンテナは少なめで32bit版になるとさらに少ない印象です。
「docker pull」コマンドでは基本的にマシンにあったアーキのコンテナがダウンロードされますが、コンテナによっては別アーキのものがダウンロードされコンテナ起動時にエラーになる場合がありました。 この場合はダイジェストを指定して取得します。
- DockerHub のサイトでコンテナの詳細を開く
- 「Tags」タブでアーキが「arm...」 のダイジェストを開く
- 「DIGEST: sha256....」をコピペしてpull する
$ docker pull alpine:latest@sha256:......... $ docker images
pullしたコンテナのタグは none になってるので、起動時はIMAGE_IDを指定する事で起動できます。
$ docker run --name alpine -d {IMAGE_ID} $ docker ps
NGINX コンテナ
web サーバを起動してみます。
$ mkdir ~/nginxtest $ echo "<html><body><h1>hello nginx</h1></body></html>" > ~/nginxtest/index.html $ docker run --name nginx --hostname nginx -p 8080:80 -d \ -v ~/nginxtest:/usr/share/nginx/html \ nginx
ラズパイのブラウザでアクセスできればOKです。
http://localhost:8080
32bit, 64bit どちらのOSも動作できました。
Node-RED コンテナ
次はNode-REDを試してみます。
$ docker run -it -p 1880:1880 -d --name nodered nodered/node-red
ブラウザでアクセスすると、
http://localhost:1880
動作確認だけなのでボリュームのオプションは省略しましたが、あっけなく起動できました。
ただミニディスプレイ で開発するのは厳しそうです。。32bit, 64bit 共に問題なしです。
MariaDB コンテナ
こちらはarm64しか作られてないので 32bitOSでpull するとエラーになりました。
$ docker pull mariadb Using default tag: latest latest: Pulling from library/mariadb no matching manifest for linux/arm/v8 in the manifest list entries
64bit では動作できました。
$ docker run --name mariadb -e MYSQL_ROOT_PASSWORD=pw -d mariadb $ docker exec -it mariadb bash $ mysql -u root -ppw
mosquitto コンテナ
MQTTブローカを試してみます。
$ docker run --name mosquitto -it -p 1883:1883 -d eclipse-mosquitto
Retainでメッセージ送信
$ docker exec -it mosquitto ash # mosquitto_pub -t test -m 'hello mosquitto' -q 1 -r
メッセージ受信
# mosquitto_sub -t "test" hello mosquitto
こちらは32bit, 64bit 共に問題なしです。メッセージの操作は動作確認のためコンテナに入ってコマンドを叩いてるのでポートフォワードの意味はないですが、実際にブローカとして使う場合は指定します。
最後に
BerryBoot 環境でDockerコンテナをいくつか動かしてみました。動かせないコンテナもありますがDockerはやっぱり便利っす。