TL;DR
サーバー側でDockerデーモンをtcpで公開し、ファイアウォールの設定を適宜行った後、Earthlyを実行するクライアント側で環境変数DOCKER_HOST
にサーバーのアドレスを設定するとリモートのDocker上でビルドを走らせることができる。
経緯
出先のノートパソコン(16GB RAM)で開発をする際、Earthlyを動かすためにDocker DesktopをIDEやブラウザと同時に起動するとRAM不足に陥ってしまった。また、ノートパソコンを閉じている間に時間のかかるビルドプロセスを実行できると何かと便利なため、自宅に設置したサーバーのDocker上でビルドを行えばよいと考えた。
実現方法
サーバーを直接公開するのは不安なので、Raspberry PiでVPNサーバーを立て、VPN経由でDockerサーバーに接続することとした。VPNサーバーを構築する過程については省略し、VPNなどでLANに接続できることを前提とする。
Dockerデーモンがtcpで公開は、/lib/systemd/system/docker.serviceの以下の項目で設定することができる。
ExecStart=/usr/bin/dockerd -H fd:// -H=tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
この例ではデーモンがtcpのポート2375に公開されている。これを利用するため、適宜ファイアウォールの設定を行う。
sudo ufw allow 2375
次にクライアント側の設定を行う。設定といってもDOCKER_HOST=tcp://サーバーのアドレス:ポート
という風に環境変数を設定するだけでよい。適切に環境を構築できたかどうかはクライアント側でdocker version
を実行することで確認できる。
// 設定前
>docker version
Client:
Cloud integration: v1.0.35+desktop.11
Version: 25.0.3
API version: 1.44
Go version: go1.21.6
Git commit: 4debf41
Built: Tue Feb 6 21:13:02 2024
OS/Arch: windows/amd64
Context: default
Server: Docker Desktop 4.28.0 (139021)
Engine:
Version: 25.0.3
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: f417435
Built: Tue Feb 6 21:14:25 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
>set DOCKER_HOST=tcp://192.168.1.10:2375
//設定後
>docker version
Client:
Cloud integration: v1.0.35+desktop.11
Version: 25.0.3
API version: 1.41 (downgraded from 1.44)
Go version: go1.21.6
Git commit: 4debf41
Built: Tue Feb 6 21:13:02 2024
OS/Arch: windows/amd64
Context: default
Server:
Engine:
Version: 20.10.25
API version: 1.41 (minimum version 1.12)
Go version: go1.18.1
Git commit: 20.10.25-0ubuntu1~22.04.1
Built: Thu Jun 29 21:21:05 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.2
GitCommit:
runc:
Version: 1.1.7-0ubuntu1~22.04.2
GitCommit:
docker-init:
Version: 0.19.0
GitCommit:
これでサーバーのDockerを利用するように設定できたので、Docker DesktopやWSLを終了しメモリを節約することができる。