matuconとマイコン

ITガジェットが好物です

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」コマンドでは基本的にマシンにあったアーキのコンテナがダウンロードされますが、コンテナによっては別アーキのものがダウンロードされコンテナ起動時にエラーになる場合がありました。 この場合はダイジェストを指定して取得します。

  1. DockerHub のサイトでコンテナの詳細を開く
  2. 「Tags」タブでアーキが「arm...」 のダイジェストを開く
  3. 「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

f:id:mazcon:20200820114856p:plain

32bit, 64bit どちらのOSも動作できました。

Node-RED コンテナ

次はNode-REDを試してみます。

$ docker run -it -p 1880:1880 -d --name nodered nodered/node-red

ブラウザでアクセスすると、

http://localhost:1880

f:id:mazcon:20200820115109p:plain

動作確認だけなのでボリュームのオプションは省略しましたが、あっけなく起動できました。

ただミニディスプレイ で開発するのは厳しそうです。。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はやっぱり便利っす。