ラズパイをDocker Desktopの代わりのDocker実行環境として使う

昔に買ったRaspberry Pi4 Model Bを特に使い道なく放置していたのですが、4core/8GB mem/256GB SSDとそれなりにスペック積んでいて勿体無いので実験がてらDockerの実行環境として使ってみようと思います。
ラズパイ構築した時の内容はラズパイにUSBメモリ型SSDを生やすにまとまってます。

またラズパイ上のDockerdに手元のMacbookからアクセスできるようにします。
macbookからdocker cliで操作し、ラズパイ上に起動したコンテナに接続するような状態を目指します。 img

設定

ラズパイ側

まずはdockerをインストールします。
公式の手順を参考にdocker-ceをインストールします。

 1[pi@raspi4b01] ~
 2% docker version
 3Client: Docker Engine - Community
 4 Version:           23.0.1
 5 API version:       1.42
 6 Go version:        go1.19.5
 7 Git commit:        a5ee5b1
 8 Built:             Thu Feb  9 19:46:40 2023
 9 OS/Arch:           linux/arm
10 Context:           default
11
12Server: Docker Engine - Community
13 Engine:
14  Version:          23.0.1
15  API version:      1.42 (minimum version 1.12)
16  Go version:       go1.19.5
17  Git commit:       bc3805a
18  Built:            Thu Feb  9 19:46:40 2023
19  OS/Arch:          linux/arm
20  Experimental:     false
21 containerd:
22  Version:          1.6.16
23  GitCommit:        31aa4358a36870b21a992d3ad2bef29e1d693bec
24 runc:
25  Version:          1.1.4
26  GitCommit:        v1.1.4-0-g5fd4c4d
27 docker-init:
28  Version:          0.19.0
29  GitCommit:        de40ad0
30[pi@raspi4b01] ~
31%

その後にdocker daemonがTCPでのアクセスを受け付けるように設定します。
デフォルトだと unix:///var/run/docker.sockでアクセスを受け付ける設定になっていますが、これに追加してTCPでもアクセスを受け付けるようにします。

まずはdockerの設定ファイルにtcpで受付ける設定を追加します。ファイルがなければ新規作成します。
ref: dockerd daemon

1[pi@raspi4b01] ~
2% cat /etc/docker/daemon.json
3{
4  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
5}
6[pi@raspi4b01] ~
7%

またdocker-ceで設定されたsystemdはデフォルトでサービス起動時に -Hオプションを指定しているためそのままだとdocker.jsonのhostsの設定が反映されません。

1[pi@raspi4b01] ~
2% grep ExecStart /lib/systemd/system/docker.service
3ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
4[pi@raspi4b01] ~
5%

そのためsystemdの設定を追加します。

1[pi@raspi4b01] ~
2% cat /etc/systemd/system/docker.service.d/docker.conf
3[Service]
4ExecStart=
5ExecStart=/usr/bin/dockerd
6[pi@raspi4b01] ~
7%

この状態でdocker再起動すると設定反映され、TCPでアクセスできる状態になります。

1[pi@raspi4b01] ~
2% sudo systemctl daemon-reload
3[pi@raspi4b01] ~
4% sudo systemctl restart docker.service
5[pi@raspi4b01] ~
6% ss state LISTENING | grep 2376
7tcp    0        4096                                                  *:2376                                               *:*
8[pi@raspi4b01] ~
9%

macbook側

macbook側ではcontextを追加してラズパイ上のdocker daemonへの接続情報を教えてあげます。

 1[koh@Kohs-MacBook-Pro-M1-387] ~
 2% docker context create raspi4b01 --description "raspi4b01" --docker "host=tcp://raspi4b01.local:2376"
 3[koh@Kohs-MacBook-Pro-M1-387] ~
 4% docker context use raspi4b01
 5[koh@Kohs-MacBook-Pro-M1-387] ~
 6% docker context show
 7raspi4b01
 8[koh@Kohs-MacBook-Pro-M1-387] ~
 9% docker container ls
10CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
11[koh@Kohs-MacBook-Pro-M1-387] ~
12%

動作確認

実際にコンテナを動かして動作確認します。
といってもやることは普通の操作と変わらないです。

nginxのコンテナを起動してcurlでアクセスしてあげると普通に繋がります。

 1[koh@Kohs-MacBook-Pro-M1-387] ~
 2% docker run -p 8080:80 --name some-nginx -d nginx
 3612e1f262ce0f72ab51c8eac6fdb1863daa62051af5b9fc35ec82cf127b3e133
 4[koh@Kohs-MacBook-Pro-M1-387] ~
 5% curl http://raspi4b01.local:8080
 6<!DOCTYPE html>
 7<html>
 8<head>
 9<title>Welcome to nginx!</title>
10<style>
11html { color-scheme: light dark; }
12body { width: 35em; margin: 0 auto;
13font-family: Tahoma, Verdana, Arial, sans-serif; }
14</style>
15</head>
16<body>
17<h1>Welcome to nginx!</h1>
18<p>If you see this page, the nginx web server is successfully installed and
19working. Further configuration is required.</p>
20
21<p>For online documentation and support please refer to
22<a href="http://nginx.org/">nginx.org</a>.<br/>
23Commercial support is available at
24<a href="http://nginx.com/">nginx.com</a>.</p>
25
26<p><em>Thank you for using nginx.</em></p>
27</body>
28</html>
29[koh@Kohs-MacBook-Pro-M1-387] ~
30%

ラズパイ側から確認してもコンテナ起動していることがわかります。

1[pi@raspi4b01] ~
2% docker container ls
3CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                   NAMES
4612e1f262ce0   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp, :::8080->80/tcp   some-nginx
5[pi@raspi4b01] ~
6%

まとめ

とりあえずできたので使い勝手を試していきたい。