Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
49
Help us understand the problem. What is going on with this article?
@koduki

Raspberry PiでDockerを動かす

More than 1 year has passed since last update.

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/v7linux/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に対応しているということです。

001.png

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!

参考

49
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
koduki

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
49
Help us understand the problem. What is going on with this article?