自宅サーバがなくなってから、なんとなく物足りなくなってきたので、RaspberryPIにDockerを入れてうんちゃかする所までのメモ

環境

SDカードを初期化してRaspbianを入れる

Download Raspbian for Raspberry Pi

RaspbianのバージョンがDebian9系に上がってたのでいったんSDカードを初期化。こちらの記事を参考に、Win32DiskImagerというのを使ってWindowsマシンで作業しました

セットアップ: 日本人設定

(2021.02.17追記) SSH接続に関しては新しい記事も書いています → Raspberry PIにモニタ無しでSSHするメモ buster版 | 7me

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 必要そうな物入れる
$ sudo apt-get update
$ sudo apt-get install -y vim git locales

// その他個人的に入れた物
$ sudo apt-get install -y automake libncurses5 libncurses5-dev libncursesw5 libncursesw5-dev libreadline-dev pkg-config fbterm ttf-sazanami-gothic ngrok-server

// キーマップが異なるので日本仕様に(適当なメーカを選んで、途中で「OADG 109A」という文字列を含む選択肢が見えたらそれを選びます)
$ sudo dpkg-reconfigure keyboard-configuration

// 言語設定
$ sudo localedef -f UTF-8 -i ja_JP ja_JP
$ sudo localectl set-locale LANG=ja_JP.utf8

// 時刻設定
$ sudo timedatectl set-timezone Asia/Tokyo

// 1回リブート
$ sudo reboot

セットアップ: 無線LAN設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// パスフレーズの暗号化
$ sudo wpa_passphrase [SSID] [パスフレーズ]
network={
ssid="[SSID]"
#psk="[パスフレーズ]"
psk=[暗号化されたパスフレーズ]
}

// 表示された内容を元に、以下のファイルを編集
$ sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1


network={
ssid="[SSID]"
#psk="[パスフレーズ]"
psk=[暗号化されたパスフレーズ]
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
priority=2 // networkを複数設定した場合は、priorityの大きい設定から優先で接続
}
1
2
3
4
5
// interfaces.dにwlan0ファイルを作成
$ cat /etc/network/interfaces.d/wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
1
2
3
4
5
// 1回リスタート
$ sudo systemctl restart networking

$ ip addr
(wlan0にIPが振られてればOK)

セットアップ: SSH

特に外に公開するわけでもないので、普通にパスワード認証で設定

1
2
3
$ cat /etc/ssh//sshd_config | grep Password
PasswordAuthentication yes
PermitEmptyPasswords no
1
2
3
4
// 自動起動になってなかったので
$ sudo systemctl enable ssh

$ sudo systemctl start ssh

インストール: docker

Get Docker CE for Debian | Docker Documentation

最初、なんとなしに手順通り進めていたら行き詰ったので、よく見返したら以下の記述を見落としていました

Raspbian users cannot use this method!
For Raspbian, installing using the repository is not yet supported. You must instead use the convenience script.

という事なので、以下の手順でget-docker.shを使います

Get Docker CE for Debian | Docker Documentation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

// ユーザ「pi」を「docker」グループに
$ sudo usermod -aG docker pi

// 1回ログインし直す
$ exit

// dockerグループに所属しているか確認
$ id
uid=1000(pi) gid=1000(pi) groups=1000(pi),996(docker),997(gpio),998(i2c),999(spi)

$ docker version
Client:
Version: 18.01.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: 03596f5
Built: Wed Jan 10 20:25:15 2018
OS/Arch: linux/arm
Experimental: false
Orchestrator: swarm

Server:
Engine:
Version: 18.01.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: 03596f5
Built: Wed Jan 10 20:21:22 2018
OS/Arch: linux/arm
Experimental: false

インストール: docker-compose

いつも通り、Releases · docker/composeから持ってきたらエラーになりました

1
2
$ docker-compose
-bash: docker-compose: バイナリファイルを実行できません: 実行形式エラー

Raspbianが32bitOSという所に起因している模様

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Model: 5
Model name: ARMv7 Processor rev 5 (v7l)
CPU max MHz: 900.0000
CPU min MHz: 600.0000
BogoMIPS: 57.60
Flags: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

こちらの記事を参考に、自前でビルドしました(※ビルドには2時間ぐらいかかりました)

1
2
3
4
5
6
7
8
9
10
11
12
$ git clone https://github.com/docker/compose.git
$ cd compose/
$ docker build -t docker-compose:armhf -f Dockerfile.armhf .
$ docker run --rm --entrypoint="script/build/linux-entrypoint" -v $(pwd)/dist:/code/dist -v $(pwd)/.git:/code/.git "docker-compose:armhf"
$ cd dist
$ sudo cp docker-compose-Linux-armv7l /usr/local/sbin/docker-compose

$ docker-compose version
docker-compose version 1.19.0dev, build 520fad3
docker-py version: 2.7.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016

マウント: USBメモリ

Amazon | 64GB SanDisk サンディスク USBメモリー 親指サイズの小型設計 Ultra Fit USB3.0対応

Dockerのデフォルトが/var/lib/dockerになってるので、↑のUSBメモリを/mnt/sandisk/にマウントして、Dockerがそこを使うように設定します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ lsusb
Bus 001 Device 005: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 004: ID 0781:5583 SanDisk Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ sudo fdisk -l
Disk /dev/sda: 59.6 GiB, 64023789568 bytes, 125046464 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1c633a3b

// パーティションを切る
$ sudo fdisk /dev/sda

// フォーマット
$ sudo mkfs.ext4 /dev/sda1

fstabまわりは、何か問題がありそうな感じだったので、単純な@rebootに書くようにしました。Dockerの起動順序に影響しないか心配でしたが、特に問題なさそう

1
2
3
4
5
6
7
8
9
$ sudo crontab -l | grep mount
@reboot mount -t ext4 /dev/sda1 /mnt/sandisk/

// 1回リブート
$ sudo reboot

// 確認
$ df -h | grep sda1
/dev/sda1 59G 6.4G 50G 12% /mnt/sandisk

設定: DockerがUSBメモリの領域を使うようにする

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sudo systemctl stop docker

// 「-g /mnt/sandisk/docker」をExecStartに加える
$ sudo cat /lib/systemd/system/docker.service | grep ExecStart
ExecStart=/usr/bin/dockerd -H fd:// -g /mnt/sandisk/docker

// ディレクトリ作成
$ sudo mkdir -p /mnt/sandisk/docker

// 設定反映して起動
$ sudo systemctl daemon-reload
$ sudo systemctl start docker

// 確認
$ sudo ls -l /mnt/sandisk/docker/
合計 84
drwx------ 2 root root 4096 1月 27 14:51 builder
drwx--x--x 3 root root 4096 1月 27 14:51 containerd
drwx------ 12 root root 4096 1月 27 17:48 containers
drwx------ 3 root root 4096 1月 27 14:51 image
drwxr-x--- 3 root root 4096 1月 27 14:51 network
drwx------ 321 root root 36864 1月 27 17:48 overlay2
drwx------ 4 root root 4096 1月 27 14:51 plugins
drwx------ 2 root root 4096 1月 27 14:54 runtimes
drwx------ 2 root root 4096 1月 27 14:51 swarm
drwx------ 2 root root 4096 1月 27 17:45 tmp
drwx------ 2 root root 4096 1月 27 14:51 trust
drwx------ 3 root root 4096 1月 27 17:48 volumes

以上です。特に何やるかは決めてないけどやっぱlinuxいじりは楽しい