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 を動かす実験もしてみたいです。
今日はここまで。