とりあえず Raspberry Pi で Docker を動かす

(更新

Simply running Docker on Raspberry Pi, in anyway.

先日のブログで、PC 上の Linux で Raspberry Pi 用の Docker イメージをビルドする話を書かせて頂きました。しかし、実はまだ Raspberry Pi 上で Docker を動かしたことはなかったのです。なんだか、面倒そうで…。

そんなことも言っていられないので、やってみることにしました。今回の目的の一つは、Raspberry Pi + Raspbian で Docker を動かしたときに、ディスク(SD カード)をどれくらい使用することになるのか確認したい、ということもあります。Docker を動かせれば良いのであれば、Docker Engine を動かすホスト OS は、できるだけ軽量のもののほうが嬉しい訳です。いずれ、Alpine Linux なども評価してみたいので、その辺に注意しながらインストールしてみました。

最初に Docker イメージの準備

その前に、テスト用の Docker イメージを用意しておきましょう。先日のブログで説明した docker buildx という experimental 機能を使います。

$ cat Dockerfile
FROM python:3.7.4-alpine
WORKDIR /app
COPY hello.py /app
COPY requirements.txt /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
CMD ["python", "hello.py"]

$ cat hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return f'Hello, World!'
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

$ cat requirements.txt
flask==1.0.2

$ docker buildx create --name buildarm --platform linux/arm64,linux/arm/v7,linux/amd64 --use
$ docker buildx build --platform linux/arm64,linux/arm/v7,linux/amd64 -t yokoyamaflogics/hellodocker --push .

ホスト OS のインストール

ホスト OS としては、私が比較的よく利用している Raspbian Stretch を使うことにしました。その中でも、必要最小限のパッケージだけ納められている Stretch Lite です。Docker Engine を動かすのに X11 などは要りません。

という訳で、2019-04-08-raspbian-stretch-lite.img をインストールしてみました。インストール直後の df は、これくらいです。(正確には、sshd を有効にし、再起動してあります。)

pi@raspberrypi:~ $ df -m
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/root          29031  1031     26793   4% /
devtmpfs             460     0       460   0% /dev
tmpfs                464     0       464   0% /dev/shm
tmpfs                464    12       452   3% /run
tmpfs                  5     1         5   1% /run/lock
tmpfs                464     0       464   0% /sys/fs/cgroup
/dev/mmcblk0p1        43    22        21  51% /boot
tmpfs                 93     0        93   0% /run/user/1000

pi@raspberrypi:~ $ swapon
NAME      TYPE SIZE USED PRIO
/var/swap file 100M   0B   -2

Docker Engine のインストール

さて、続いて Docker のインストールです。ネットを探すといろいろ参考になる情報がありますが、本家 Docker サイトに、Debian 向けのインストール説明があり、そこに Raspbian についての言及もあるので、素直にそれに従ってみたいと思います。

その説明によると、Install using the convenience script というセクションに get.docker.com を使ったインストール方法が記述されています。やってみましょう。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

サイトに説明されている通りなので、特に追加の説明はしません。続いて、ユーザー pi で Docker を利用できるようにします。

$ sudo usermod -aG docker pi

あまりに簡単なので拍子抜けですが、ちゃんとインストールできているか確認しましょう。

$ docker info
Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        9013bf5
 Built:             Fri Oct 18 16:02:04 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       9013bf5
  Built:            Fri Oct 18 15:56:07 2019
  OS/Arch:          linux/arm
  Experimental:     false
(略)

末尾のほうに

WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No kernel memory TCP limit support
WARNING: No oom kill disable support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support

のような警告があり、これまたネットを探すといろいろ対応策があるようですが、まずはそのまま実験を続けます。

Docker イメージを実行する

それでは、最初のほうでビルドした Docker イメージを Docker Hub からダウンロードして実行してみましょう。

pi@raspberrypi:~ $ docker run --rm --name hd -p 5000:80 yokoyamaflogics/hellodocker:latest
Unable to find image 'yokoyamaflogics/hellodocker:latest' locally
latest: Pulling from yokoyamaflogics/hellodocker
33b18ff7f9b7: Pull complete 
0c1f90421c3a: Pull complete 
91543a0ba590: Pull complete 
913b1310b79e: Pull complete 
8113b539eb49: Pull complete 
32fab85feca4: Pull complete 
fea0485746e7: Pull complete 
1187ad426685: Pull complete 
b6f9a7a485c1: Pull complete 
Digest: sha256:6b375494108e809ce496d519482f000a8da0c0cf56cfb9e411d45823a2c4a481
Status: Downloaded newer image for yokoyamaflogics/hellodocker:latest
 * Serving Flask app "hello" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
172.21.141.3 - - [11/Nov/2019 00:56:55] "GET / HTTP/1.1" 200 -

隣の PC ブラウザから覗いてみると、ちゃんと動いているようですね。ディスクの使用状況を確認しておきましょう。

pi@raspberrypi:~ $ df -m
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/root          29031  1434     26390   6% /
devtmpfs             460     0       460   0% /dev
tmpfs                464     0       464   0% /dev/shm
tmpfs                464    12       452   3% /run
tmpfs                  5     1         5   1% /run/lock
tmpfs                464     0       464   0% /sys/fs/cgroup
/dev/mmcblk0p1        43    22        21  51% /boot
tmpfs                 93     0        93   0% /run/user/1000

こんな感じです。

次回は、Alpine Linux 等で動かせないか実験してみたいと思います。また、このような評価で毎回 SD カードを焼くのは面倒ですので、QEMU を使って ARMv7 や ARM64 用の Debian、Alpine Linux を動かす実験もしてみたいです。

今日はここまで。