Raspberry pi zero上で動作させるシステムを開発するのですが、実行環境はどうしようかと考えてみました。
初めてのRaspberryでの開発なので、Try&Errorになる事は間違えありません。Try&Errorを繰り返すと言う事は、いろんなものをインストールしたり、アンインストールしたりを繰り返すと言うこと、つまりRaspbianの環境が次々と変わり、ついには決定的なミスで動作しなくなる可能性もあると言うことです。
そこで、Dockerを採用することにしました。Docker採用のメリットは以下の通りです。
- Dockerであればその環境だけでクローズするので、Raspbianの環境が維持できる
- 失敗したら何度でもやり直し可能
- 一つのRaspberryにいくつものサービスを組み込むことができる
いいことばかりなので、早速、Dockerのセットアップを行います。
Raspberryを買ったばかりという方は、下記を参照にセットアップしてください。
https://qiita.com/kmatae-home/items/1dd81f2b2091c6ce776b
環境
今回の環境は以下の通りです。
- Raspberry pi zero WH
- 2018-11-13-raspbian-stretch-lite
Dockerのインストール
以下のコマンドで、Dockerのインストール一式がインストールできます。
curl -sSL https://get.docker.com | sh
エラー?
E: Failed to fetch http://raspbian.raspberrypi.org/raspbian/dists/stretch/main/binary-armhf/Packages.xz Hash Sum mismatch
もう一回
curl -sSL https://get.docker.com | sh
波乱の幕開けのような気がしますが、とりあえずエラーは表示されずに完了。
ユーザpiにDockerの実行権限を付与
Raspbianの標準ユーザのpiにDockerの実行権限を付与します。
(sudoを付けての実行が不要になります)
sudo usermod -aG docker pi
Dockerのバージョン確認
以下のコマンドでdockerのバージョンを確認します。
pi@raspberrypi:~ $ docker -v
Docker version 18.09.0, build 4d60db4
とりあえず再起動
こういうものをインストールした時は再起動した方がいい事が多いという理由で再起動。
sudo reboot
Dockerが起動されているかを確認
いよいよ、Dockerとご対面です。
pi@raspberrypi:~ $ ps aux | grep docker
pi 662 0.0 0.4 4364 1900 pts/0 S+ 19:59 0:00 grep --color=auto docker
ん?いない。
systemctlが有効になっていないのかと確認
systemctl
(中略)
● docker.service loaded failed failed
失敗している・・・。
ログを確認してみる
systemctl status
でdockerの状態を確認してみます。
pi@raspberrypi:~ $ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e
Active: failed (Result: core-dump) since Thu 2019-04-04 20:02:59 BST; 1min 11
Docs: https://docs.docker.com
Process: 735 ExecStart=/usr/bin/dockerd -H unix:// (code=dumped, signal=SEGV)
Main PID: 735 (code=dumped, signal=SEGV)
CPU: 472ms
Apr 04 20:02:55 raspberrypi systemd[1]: Starting Docker Application Container En
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Main process exited, cod
Apr 04 20:02:59 raspberrypi systemd[1]: Stopped Docker Application Container Eng
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Unit entered failed stat
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Failed with result 'core
core dumped!懐かしい。昔、Unixでシステム開発していたときにはよく見たキーワードです。
さらに、journalctl
コマンドで詳細を確認してみます。
pi@raspberrypi:~ $ journalctl -fu docker.service
-- Logs begin at Thu 2016-11-03 17:16:44 GMT. --
Apr 04 19:57:23 raspberrypi systemd[1]: Starting Docker Application Container Engine...
Apr 04 19:57:27 raspberrypi systemd[1]: docker.service: Main process exited, code=dumped, status=11/SEGV
Apr 04 19:57:27 raspberrypi systemd[1]: Stopped Docker Application Container Engine.
Apr 04 19:57:27 raspberrypi systemd[1]: docker.service: Unit entered failed state.
Apr 04 19:57:27 raspberrypi systemd[1]: docker.service: Failed with result 'core-dump'.
Apr 04 20:02:55 raspberrypi systemd[1]: Starting Docker Application Container Engine...
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Main process exited, code=dumped, status=11/SEGV
Apr 04 20:02:59 raspberrypi systemd[1]: Stopped Docker Application Container Engine.
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Unit entered failed state.
Apr 04 20:02:59 raspberrypi systemd[1]: docker.service: Failed with result 'core-dump'.
不明・・・。
原因究明
とりあえず、dokcerサービスを起動してみよう。
pi@raspberrypi:~ $ sudo systemctl start docker
Job for docker.service canceled.
raspbian Job for docker.service canceled
でググって見る。
お、これか?
https://dietpi.com/phpbb/viewtopic.php?f=11&t=5227&start=10
これによると、docker-ceのバージョンを下げてみようと書いてある。
では、やってみましょう
docker-ce=18.06.1~ce~3-0~raspbianをインストールします。
pi@raspberrypi:~ $ sudo apt-get install docker-ce=18.06.1~ce~3-0~raspbian
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
containerd.io
Use 'sudo apt autoremove' to remove it.
Recommended packages:
aufs-tools cgroupfs-mount | cgroup-lite git pigz
The following packages will be REMOVED:
docker-ce-cli
The following packages will be DOWNGRADED:
docker-ce
0 upgraded, 0 newly installed, 1 downgraded, 1 to remove and 58 not upgraded.
Need to get 28.3 MB of archives.
After this operation, 39.0 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 https://download.docker.com/linux/raspbian stretch/stable armhf docker-ce armhf 18.06.1~ce~3-0~raspbian [28.3 MB]
Fetched 28.3 MB in 23s (1,204 kB/s)
dpkg: docker-ce-cli: dependency problems, but removing anyway as you requested:
docker-ce depends on docker-ce-cli.
(Reading database ... 34822 files and directories currently installed.)
Removing docker-ce-cli (5:18.09.0~3-0~raspbian-stretch) ...
dpkg: warning: downgrading docker-ce from 5:18.09.0~3-0~raspbian-stretch to 18.06.1~ce~3-0~raspbian
(Reading database ... 34632 files and directories currently installed.)
Preparing to unpack .../docker-ce_18.06.1~ce~3-0~raspbian_armhf.deb ...
Unpacking docker-ce (18.06.1~ce~3-0~raspbian) over (5:18.09.0~3-0~raspbian-stretch) ...
Setting up docker-ce (18.06.1~ce~3-0~raspbian) ...
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
Processing triggers for systemd (232-25+deb9u6) ...
Processing triggers for man-db (2.7.6.1-2) ...
今度こそ
では、動作を見てみましょう。
pi@raspberrypi:~ $ docker -v
Docker version 18.06.1-ce, build e68fc7a
pi@raspberrypi:~ $ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.14.79+
Operating System: Raspbian GNU/Linux 9 (stretch)
OSType: linux
Architecture: armv6l
CPUs: 1
Total Memory: 433.5MiB
Name: raspberrypi
ID: 3UI7:DTNF:ETXT:2QB3:M7IP:X6OU:ZODI:5E5C:UX5R:VITT:HHHG:RCY6
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No oom kill disable support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
WARNING: No cpuset support
pi@raspberrypi:~ $ sudo systemctl start docker
pi@raspberrypi:~ $ ps aux | grep docker
root 1008 4.2 10.8 913860 48204 ? Ssl 20:13 0:02 /usr/bin/docke d -H fd://
root 1014 1.5 5.7 883100 25708 ? Ssl 20:13 0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
pi 1977 0.0 0.4 4364 1796 pts/0 S+ 20:14 0:00 grep --color=auto docker
いました!dockerサービス!!
結論
Raspbianにdockerをインストールするネタはたくさんあるが、結構大変。