読者です 読者をやめる 読者になる 読者になる

ラズパイでDocker (Raspbian Jessie)

Raspberry Pi Docker Linux ラズパイ

お勉強用にラズパイにDocker をインストールしてみます。というか、公式ブログの手順そのままです。

www.raspberrypi.org

先に書いておくと素直にx86でやった方がいいです。コマンド一発でインストールできるので。

インストール

コマンド一発です。さすが「楽すぎて何も身につかない」と評判のDebianベースのRaspbian。

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

自動的にセットアップ用のシェルスクリプトが実行されます。内容としては、 Docker のインストール用のパッケージリポジトリが自動で追加され、必要なパッケージが一式インストールされてDockerが起動します。

一気に自動起動の設定まで完了するようです。最終的に下記のメッセージが表示されるはず。

+ sudo -E sh -c docker version
Client:
 Version:      1.12.2
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:52:51 2016
 OS/Arch:      linux/arm

Server:
 Version:      1.12.2
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:52:51 2016
 OS/Arch:      linux/arm

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker pi

Remember that you will have to log out and back in for this to take effect!

最後のメッセージは「もし非ルートユーザ権限でDockerを使用したいなら、下記のコマンドで現在のユーザー(pi)をdockerという名前のグループに追加するといいよ。一度ログアウトしないと有効にならないんで気をつけてね」というご託宣(超意訳)。

提示されたコマンドに否やはないので*1、素直に指示通りにする。毎回sudoコマンドをつけずに実行できるようになります。

$ sudo usermod -aG docker pi

一旦ログアウトしてログインし直す。

動作確認

バージョンの確認など

バージョンとかシステムの状態とか。

``` $ docker version Client: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 17:52:51 2016 OS/Arch: linux/arm

Server: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 17:52:51 2016 OS/Arch: linux/arm ```

状態確認。

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.2
Storage Driver: overlay
 Backing Filesystem: extfs
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options:
Kernel Version: 4.4.23-v7+
Operating System: Raspbian GNU/Linux 8 (jessie)
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 862.1 MiB
Name: raspberrypi
ID: VYSO:QMV2:3LGH:ETXK:ZOUL:UBFG:OAEJ:L6VV:Q36H:MQCW:PFA4:UEZR
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
WARNING: No cpuset support
Insecure Registries:
 127.0.0.0/8

WARNING がちょっと気になりますがスルーします。

いくつかはシステム起動時にカーネルにオプションを渡せば消せるみたいですが、全部消すにはカーネル再構築して差し替える必要ありとのこと。

参考:debian8のdockerでWARNINGが吐かれる件

とりあえず保留。

hello-world

おなじみのやつは実行できません。以下のようになります。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
panic: standard_init_linux.go:175: exec user process caused "exec format error" [recovered]
    panic: standard_init_linux.go:175: exec user process caused "exec format error"

(skip)

そもそも普通のDockerイメージはx86系CPU向けにビルドされているのでラズパイでは動かない。

対策

ARM用にビルドされたイメージを探してくるか、自分で作るかしかありません。

下記のコマンドでARM用のイメージを探します。

$ docker search armhf-

あまり数がない?

とりあえずUbuntu(おそらく非公式)。

$ docker run ioft/armhf-ubuntu
Unable to find image 'ioft/armhf-ubuntu:latest' locally
latest: Pulling from ioft/armhf-ubuntu
77c45a60f4e6: Pull complete
7d1fb2204ca8: Pull complete
8789c51a4fa7: Pull complete
8ac55180a8d1: Pull complete
Digest: sha256:18046759911b86af563d1eb8518d1dc25b873a4c62b8aea2d185e6052e4adf92
Status: Downloaded newer image for ioft/armhf-ubuntu:latest

いやそうじゃなくて……。


$ docker run ioft/armhf-ubuntu /bin/echo 'Hello, World!'
Hello, World!

お約束。


今度はコンテナにログインしてみる。

$ docker run -i -t  ioft/armhf-ubuntu   /bin/bash

プロンプトが表示されるので、OS情報など。

root@ff4401bd71bb:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
root@ff4401bd71bb:/# uname -a
Linux ff4401bd71bb 4.4.23-v7+ #913 SMP Tue Oct 4 14:16:19 BST 2016 armv7l armv7l armv7l GNU/Linux
root@ff4401bd71bb:/# exit
exit

ログアウト。ホスト側のカーネルは下記の通り。

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.23-v7+ #913 SMP Tue Oct 4 14:16:19 BST 2016 armv7l GNU/Linux


参考:Installing, running, using docker on armhf (ARMv7) devices · umiddelb/armhf Wiki · GitHub-devices)

まとめ

とりあえず動きましたが、あまりARM向けのイメージ自体が提供されていないです。ありもののイメージを使うならDocker for Mac とかx86でやる方が良さそうです。


それではまた。

Raspberry Pi 3 MODEL B 【RS正規流通品】

Raspberry Pi 3 MODEL B 【RS正規流通品】

*1:「なろう系」のラノベでちょくちょく見かける表現。なんか違和感ありますが使ってみました。