Raspberry Pi 2をサーバーとして動かすとなると、
よりUbuntuらしいインストールイメージ
先月の第362回では、
そんな中、
今回はまず最初に、
イメージのインストール
4GB以上のmicroSDHCカードを用意してください。インストール済みのイメージをダウンロードし、
$ wget http://www.finnie.org/software/raspberrypi/2015-02-19-ubuntu-trusty.zip $ unzip 2015-02-19-ubuntu-trusty.zip
imgファイルとbmapファイルの2つのファイルが現れるはずです。bmapファイルはrawのイメージファイルの使用しているブロックを記録したファイルで、
$ sudo apt install bmap-tools $ sudo bmaptool copy --bmap 2015-02-19-ubuntu-trusty.bmap 2015-02-19-ubuntu-trusty.img /dev/sdb
もちろん、
$ sudo dd if=2015-02-19-ubuntu-trusty.img of=/dev/sdb bs=1M
この時点で第362回の
ちなみにetc/
第362回の方法 $ sudo mount -o bind /etc/resolv.conf etc/resolv.conf ... $ sudo umount etc/resolv.conf 今回の方法 $ sudo mkdir run/resolvconf $ sudo mount -o bind /etc/resolv.conf run/resolvconf/resolv.conf ... $ sudo umount run/resolvconf/resolv.conf $ sudo rm -rf run/resolvconf
ルートパーティションの拡張
microSDHCカードをRaspberry Pi 2に接続し起動します。今回のイメージのホスト名は
この状態で
$ sudo fdisk /dev/mmcblk0 (中略) Command (m for help): d Partition number (1-4): 2 Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (1-4, default 2): 2 First sector (133120-15556607, default 133120): Using default value 133120 Last sector, +sectors or +size{K,M,G} (133120-15556607, default 15556607): Using default value 15556607 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks. $ reboot
上記ではパーティションテーブルから第2パーティション
$ sudo resize2fs /dev/mmcblk0p2
あとは第362回の
Dockerのインストール
これでようやくDockerの話に入れます。Dockerについては一般的な方ならおおまかなことはご存知だと思いますので、
DockerのARM対応
DockerにはDocker ClientとDocker Daemonの2種類の機能が存在します。Docker Clientのほうはマルチプラットフォームなバイナリが公式から提供されていますが、
linux/
- Ubuntuのdocker.
ioパッケージを利用する Ubuntuにはdocker.
ioというパッケージ名でDockerが存在します [3]。このためaptから簡単にDockerをインストールできます。さらにUbuntuのリポジトリにあるarmhf版のdocker. ioは、 Daemon機能が有効になっているのです。ただしUbuntuパッケージのポリシー上、 インストールできるバージョンは古めです。14. 04の場合は1. 0.1相当となります。 - Dockerのビルド済みバイナリを利用する
最新のDockerを使いたい場合は、
Docker公式のドキュメントに従って、 バイナリをインストールする方法が一番簡単でしょう。ただし前述のように、 linux/ armhf版は配布していないので、 今回の目的には利用できません。 - DockerをDockerでビルドする
現在のDockerは、
DockerfileでDocker上に開発環境を構築しビルドするシステムになっています。つまりDockerをビルドするためにはそのホストで動くDockerが必要です。ビルド時のDockerは多少古くても大丈夫なので、 docker. ioパッケージを使えば良いでしょう。 ただarmhfマシンの上でlinux/
armhf用のDockerを構築するとなると、 Dockerfileで利用するベースイメージをarmhfに変更したり、 ビルドスクリプトで指定しているDocker Daemonのビルドオプションをlinux/ armhfでも動くようにしたりと、 いろいろと修正が必要になります。 Go言語を使っているので、
linux/ amd64上でarmhfをクロスコンパイルすれば良いのでは、 と思う向きもあるでしょう。実際、 Docker Clientはこの方法でビルドできます。ただ、 Docker DaemonについてはAppArmorやLXC、 LVMをビルドし、 cgoを使ってGoのコードからそれらのライブラリを利用しているため、 クロスコンパイルは思いのほか大変です。 - Dockerを自分でビルドする
Dockerfileでやっていることをホスト上で実行すれば、
あらかじめDockerを用意しなくてもDockerをビルドできます。おそらく最初のうちはターゲット上で試行錯誤しながらビルドして、 最終的にDockerfileに落とし込んだほうが良いかもしれません。ただしコマンドの実行だけでなく、 スクリプトの変数や環境変数の流れも把握しながら実行しなくてはならないため、 それなりに大変です。またクロスコンパイルという点では、 Dockerでビルドするときと同じ問題が存在します。
今回はバージョンは古いもののこの中では一番簡単な、
Dockerのインストール
長々と説明してしまいましたが、
$ sudo apt install docker.io
これでDocker Daemonが立ち上がっているはずです。dockerコマンドを一般ユーザー権限で使いたい場合は、
$ sudo gpasswd -a ${USER} docker
一度ログアウトし再度ログインすれば、
$ docker version Client version: 1.0.1 Client API version: 1.12 Go version (client): go1.2.1 Git commit (client): 990021a Server version: 1.0.1 Server API version: 1.12 Go version (server): go1.2.1 Git commit (server): 990021a $ docker info Containers: 0 Images: 0 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 0 Execution Driver: native-0.2 Kernel Version: 3.18.0-14-rpi2 WARNING: No swap limit support
Dockerの設定
docker infoの
ちなみに外付けディスクのような大きめの電力が必要なデバイスは、
このドライブがext4でフォーマットされて/mnt/
$ sudo mkdir /mnt/docker/tmp /mnt/docker/docker
/etc/
DOCKER_OPTS="-g /mnt/docker/docker"
export TMPDIR="/mnt/docker/tmp"
設定を変更したので、
$ sudo restart docker.io
docker infoコマンドで、
armhfベースイメージを使う
Dockerは設定済みのイメージと、
Raspberry Pi 2はアーキテクチャがarmhfなので、
以下のように、
$ docker run --rm -ti mazzolino/armhf-ubuntu bash # apt-cache policy docker.io docker.io: Installed: (none) Candidate: 1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1 Version table: 1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1 0 500 http://ports.ubuntu.com/ubuntu-ports/ trusty-updates/universe armhf Packages 0.9.1~dfsg1-2 0 500 http://ports.ubuntu.com/ubuntu-ports/ trusty/universe armhf Packages # exit $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mazzolino/armhf-ubuntu latest 02330bc3eb88 11 weeks ago 284.5 MB
ホストにインストールしたdocker.
ownCloudコンテナを作る
最後にこのベースイメージを使ってownCloudコンテナを作成してみましょう。Dokcer HubでownCloudで検索するとたくさんのイメージが見つかります。今回はその中からNginxにも対応しているjchaney/
jchaney/
$ git clone https://github.com/jchaney/owncloud.git $ cd owncloud $ sed -i "s,ubuntu:14.04,mazzolino/armhf-ubuntu," Dockerfile $ sed -i "s,^\(ADD \)\(extensions.sh\) \(extensions.conf\) \(/var/www/owncloud/apps/\),\1\2 \4\n\1\3 \4," Dockerfile $ sudo mkdir -p /mnt/docker/owncloud $ sudo chown ${USER}: /mnt/docker/owncloud $ docker build -t ubuntu/owncloud .
Dockerfileのapt-get部分は、
使用するDockerのバージョンによっては、
最後にこのイメージを起動しましょう。今回はSSLなどは利用せずにシンプルな方法で起動します。
$ docker run -p 80:80 --name nginx -v /mnt/docker/owncloud:/var/www/owncloud/data ubuntu/owncloud
「http://

腕で抱えるにはくじらは大きすぎる
DockerはDaemonがarmhfを正式にはサポートしていないこともあって、
それでも普段使いなれたツールで仮想環境を構築したい方にとって、
ところでSnappy Ubuntu Coreのほうであれば、