Raspberry pi zeroにDockerをインストールする

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のインストール一式がインストールできます。

```shell
curl -sSL https://get.docker.com | sh
```

エラー？

```shell
E: Failed to fetch http://raspbian.raspberrypi.org/raspbian/dists/stretch/main/binary-armhf/Packages.xz  Hash Sum mismatch
```

もう一回

```shell
curl -sSL https://get.docker.com | sh
```

波乱の幕開けのような気がしますが、とりあえずエラーは表示されずに完了。

# ユーザpiにDockerの実行権限を付与
Raspbianの標準ユーザのpiにDockerの実行権限を付与します。
(sudoを付けての実行が不要になります)

```shell
sudo usermod -aG docker pi
```
# Dockerのバージョン確認
以下のコマンドでdockerのバージョンを確認します。

```shell
pi@raspberrypi:~ $ docker -v
Docker version 18.09.0, build 4d60db4
```

# とりあえず再起動
こういうものをインストールした時は再起動した方がいい事が多いという理由で再起動。

```shell
sudo reboot
```

# Dockerが起動されているかを確認
いよいよ、Dockerとご対面です。

```shell
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が有効になっていないのかと確認

```shell

systemctl
(中略)
● docker.service               loaded failed failed
```

失敗している･･･。

# ログを確認してみる
`systemctl status`でdockerの状態を確認してみます。

```shell
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`コマンドで詳細を確認してみます。

```shell
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サービスを起動してみよう。

```shell
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をインストールします。

```shell
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) ...
```

# 今度こそ
では、動作を見てみましょう。

```shell
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をインストールするネタはたくさんあるが、結構大変。