DockerCon19にてDockerのARM対応が話されていたので、ラズパイ向けのイメージをMacでクロスコンパイルして見ることにしました。
ちなみに、元々ARM自体には対応していましたが今回のカンファレンスの話だとクロスコンパイルとDockerHubでのマルチアーキテクチャ対応がメインかと思います。
Raspberry PiにDockerをインストール
まずは、ラズパイにDockerをインストールします。
Raspbianを使ってるのでこちらに記載がある通りapt-getで入れます。
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ docker -v
Docker version 18.09.0, build 4d60db4
ラズパイ側の準備はこれで完了です。
Docker Desktop(β)のインストール
19.03.0
からバックエンドでqemuを利用してMacでもlinux/amd64
のみならずlinux/arm/v7
やlinux/arm64
、さらにはwindows/amd64
がビルドできるようになりました。
ただし、19.03はまだベータ版なので、以下のURLからDocker Desktop for Mac Community
のベータ版を入れる必要があります。
$ docker -v
Docker version 19.03.0-beta3, build c55e026
上記のように19.03がインストールされていれば成功です。
Dockerfileの作成
Dockerfileの作成をします。なんでも良いのですが、以前作った「Raspberry PIでデスクトップ環境無しでChromiumを起動する」の内容をDockerイメージにしてみます。
FROM debian:buster
RUN apt-get update && \
apt-get install -y xinit matchbox-window-manager xterm chromium && \
apt-get -y --purge autoremove && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY run.sh /app/run.sh
CMD ["./run.sh"]
run.shは以下の通り。
#!/bin/sh
xinit matchbox-window-manager &
chromium --no-sandbox -kiosk "http://www.youtube.com"
Raspbianを使う必要はないので普通にDebianを使用しています。
重要なのはDockerHubの公式を見れば分かると思うのですがこの公式イメージがArmに対応しているということ
です。
Dockerは実行環境または指定されたオプションに従って適切なCPUアーキテクチャのイメージを落とします。
Dockerfile内でapt-get等もしていますがこれも元イメージが同じなので特に意識することなくx86とARMが切り替わります。
これによって動作確認は高速なx86で行って同じDockefileを編集なしにARM版のモジュールを作成することができます。
ARMイメージのビルド
ではARM版のビルドを行います。具体的には--platform
を指定します。
$ docker buildx build -t koduki/rpi-chrome --platform linux/arm/v7 --push .
開発版のbuildkitの機能を使うためにbuildx
を指定しています。また、ラズパイはarmv7なのでlinux/arm/v7
をplatformに指定しています。
詳細に関しては下記を参照してください。
https://github.com/docker/buildx#building-multi-platform-images
今回はlinux/arm/v7しか指定していませんが、マルチプラットフォームのイメージを作りたい場合は下記のようにDriverをdocker-container
に変更し、,
で区切ることで複数モジュールのビルド/Pushができるようになります。
$ docker buildx create --driver docker-container --name multibuild
$ docker buildx use multibuild
$ docker buildx build -t koduki/rpi-chrome --platform linux/amd64,linux/arm/v7 --push .
Raspberry Piでコンテナを実行する
実行するに当たって特に特別な事はありませんがラズパイ上で実行してみます。
$ docker run -it koduki/rpi-chrome uname -a
Linux cd4a0c8248fb 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
通常通りDockerHubから落として実行されます。この時にARM向けのモジュールを登録しておけば適切に選択され上記のように実行されますあ、arm64とかamd64とかしか登録してないと当然実行時にエラーになるのでご注意ください。
では、Chromeを起動してみましょう。
$ docker run -it -e DISPLAY=:0 --privileged koduki/rpi-chrome
少しサボってprivileged
を渡しています。これはGPUを叩くためです。
また、同じく:0
をDISPLAYとして環境変数に渡しています。
まとめ
「ラズパイでDocker動かしてなんの意味あるの?」と言われそうですがデプロイの管理がやはり楽になります。Dockerで配布して終わりになるので。ラズパイ側でaptとか不要!
あと、ラズパイ側が究極的にはかなり薄くできるのでIoT的にも良いんじゃないかと。
19.03.0
はビルドが高速化されたり今回のクロスプラットフォームビルドなど、かなり新機能が盛りだくさんなのでもうちょっと追っていきたいと思います。
それではHappy Hacking!