一般的なWindows向け小型パソコンのIntel NUCに、Ubuntuを入れて、dockerを動かして、それにHomebridgeとHome Assistantをインストールしました。
先日の記事ではこのNUCにHome Assistantのイメージをインストールしましたが、気が変わってHomebridgeとHome Assistantの両方をdockerで入れることにしました。コロコロ変わってすみません。
仮想環境でサーバを動かす
OSの上で直接サーバデーモンを動かすのではなくて、仮想機械(VM)やコンテナのような仮想環境を作ってその上でサーバを動かす方式が流行っている気がします。大昔の大型コンピュータでも、VMの上で古いOSを動かして、古いプログラムを動かしていたらしいです。流行が繰り返しているのでしょうか。
今までHomebridgeを使ってましたが、Home Assistantも試してみたいと考えていました。Home Assistantはイメージでのインストールを推奨しています。なので当初は、Raspberry Piを1個新調して、そちらをHome Assistant専用にしようと考えてました。でもRaspberry Piが品不足で入手困難になってしまいました。それで、前回の記事では、もう一台予備で持っていたIntel NUCをHome Assistant専用サーバとして構成しました。ただ、このNUCも別の場所でサーバとして使いたく思うようになりました。それで、今Homebridgeで使用しているIntel NUCの上に、仮想環境を作り、Homebridgeと共存させることにしました。
Intel NUCで仮想環境を作るならば、流行りのもので、KVMかDockerでしょうか。ただ本格的なVMだと、メモリとかCPUコアのリソースを分配する調整が面倒に思います。それでコンテナ方式のDockerでサーバ構築することにしました。
Ubuntuをインストールする
ゼロから作り直す方がスッキリすると思い、初代Intel NUC DC3217IYEにUbuntuをインストールしなおしました。 搭載CPUはモバイル向け第3世代のIntel(R) Core(TM) i3-3217U CPU @ 1.80GHzです。メモリは8GB、ストレージは64GBのmSATA SSDです。Windowsが動く普通のパソコンなので、あちらこちらでうち捨てられている旧式のコンピュータのどれでも同じ方法で使えるはずです。スマートホームのサーバーとして蘇らせてあげましょう。
Ubuntuのインストール方法はいくらでも見つかると思いますので、あらすじだけ。
まずはUbuntuのサイトに行って、最新のUbuntuサーバー (22.04.1 LTS) のisoファイルを入手します。ここではMacにダウンロードしました。ubuntu-22.04.1-desktop-amd64.isoという名前の、1.4GBくらいのファイルでした。
次に、これが収まるサイズのUSBメモリ(今回は8GB)を用意して、ddコマンドで、
sudo dd of=/dev/rdisk5 if=ubuntu-22.04.1-desktop-amd64.iso bs=16m
のようにしてUSBメモリにコピーします。この例はUSBメモリがdisk5にある場合です。bsはコピーするブロックサイズの指定ですが、デフォルトだと遅いです。16MBくらいが最適らしいです。
最後に、このUSBメモリを、インストール先のパソコン(Intel NUC)に挿して起動すれば、Ubuntuのインストールを開始できます。インストール途中で、mosquittoやdockerをインストールするのか聞かれました。うっかりインストールをお願いしてしまったら、snapという枠組みでインストールされました。snapも、Dockerに近い考え方で、サーバを独立した環境で管理する方式のようです。でもその関係で、設定ファイルが素のままではリードオンリーになっていて、書き換え面倒でした。結局、削除しました。
Dockerとは
軽量の仮想機械のようなものかと理解してます。Linuxの上でWindowsを動かそうとすると、ハードウェアに近いレベルから仮想化しないとダメですが、Linuxの上で別のLinuxを動かすならば、共通で使えるカーネル部分のレベルで仮想化すれば十分なはずです。そうすれば無駄が少なくて効率よく実装できます。以下が構成図です。
(https://knowledge.sakura.ad.jp/13265/ から引用)
一つのコンピュータに多数のサーバを組み込んでいくと、依存関係が複雑になったり、どれかのサーバの不具合で他にも支障が出たりと、厄介です。でも別の仮想環境(コンテナと呼んでいるようです)でサーバを動かせば、個別に再起動したり、丸ごとバックアップしたり、実験的に動かしたりすることが容易です。
Docker CEをインストールする
Dockerにも色々なバージョンがあるようです。Docker Desktopというのが有料版で(個人利用はまだ無料らしいです)、Docker CEというのが無償版のようです。こちらの手順を参考にしてDocker CEをインストールしました。
パッケージリストを更新して:
sudo apt update
HTTP経由のレポジトリを使うパッケージをインストールして:
sudo apt install -y apt-transport-https
GPGキーをダウンロードして(wgetが無いと言われたので、メッセージに従ってsudo apt install wgetしました):
wget -qO - https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Docker CE repositoryを追加します:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" | sudo tee /etc/apt/sources.list.d/docker.list
ここでいよいよDocker CEをインストールします:
sudo apt update sudo apt install -y docker-ce
これでインストール終了のようです。aptコマンド以外は呪文みたいでした。
Docker CEを動かす
デフォルトでは、rootとsudoできるユーザだけがDockerを使えます。インストールの過程でdockerというグループが作られているので、それ以外のユーザがdockerを使えるようにするには、dockerグループに加えておけば良いようです。sudoコマンドを打つ手間が省けるので、自分をdockerグループに加えておきます。
sudo usermod -a -G docker $USER
これを有効にするには、一旦ログアウトして、ログインしなおします。動作を確認するために、dockerのversionを見ます。
docker version
それっぽい表示が出たので大丈夫のようでした。dockerサービスが動いているかどうか確認します:
sudo service docker status
このほか以下のコマンドで停止、起動、再起動ができます。
sudo service docker stop sudo service docker start sudo service docker restart
ちなみにこのページのガイドでは、serviceコマンドを使ってますが、いつも使っている、
sudo systemctl status docker
などのコマンドでも同じことができました。
Hello Worldの動作テスト
hello-worldを表示するイメージファイルがあるようです。それでテストできます。
docker run hello-world
このコマンドは、テスト用のイメージをダウンロードして、コンテナで動かして、メッセージを表示して、終了するものだそうです。
Docker CEを削除する方法
削除方法も書いてありました。#以下で補足して羅列します。
sudo apt purge --autoremove -y docker-ce sudo groupdel docker #グループ削除 sudo ip link delete docker0 #network interface削除 #GPG keyとリポジトリを削除: sudo rm -rf /usr/share/keyrings/docker-archive-keyring.gpg sudo rm -rf /etc/apt/sources.list.d/docker.list #Docker設定、イメージ、コンテナなどのディレクトリを削除 sudo rm -rf /etc/docker sudo rm -rf /var/lib/docker sudo rm -rf /run/docker sudo rm -rf /var/run/docker.sock sudo rm -rf /var/lib/containerd sudo rm -rf /opt/containerd
Homebridgeをインストールする
Homebridge本家のサイトからリンクされている、こちらのガイドに従いました。
ここではdocker-composeというユーティリティを使っているようです。Docker CE本体とは別に配布されているツールのようです。通常はdocker runコマンドに長いオプションを付けてでコンテナを起動するのですが、docker-composeコマンドはあらかじめymlファイルで定義した内容に従ってコンテナを起動します。何をどういうオプションで動かしたかもymlファイルで残るので、管理も楽そうです。
Homebridgeを動かすには、以下の内容のdocker-compose.ymlというファイルを作ります。どこでも良いようなので、ホームディレクトリに作りました。
version: '2'
services:
homebridge:
image: oznu/homebridge:ubuntu
container_name: homebridge
restart: always
network_mode: host
environment:
- HOMEBRIDGE_CONFIG_UI_PORT=8581
volumes:
- ./homebridge:/homebridge
この後、docker-compose.ymlをおいたディレクトリで、
docker-compose up -d
コマンドを動かせば良いようです。今回は、docker-composeがインストールされていないと言われたので、メッセージに従って、
sudo apt install docker-compose
してインストールしました。インストール終了後、http://xxx.xxx.xxx.xxx:8581/に接続したところ動いてました。
Home Assistantをインストールする
Home Assistantもdocker-composeを使ってインストールしました。方法はこちらを参考にしました。
ここにdocker-compose.ymlの内容が書いてあります。多分、上のHomebridgeのインストールに使ったファイルに、ここに書かれているhomeassistantの部分を追加すれば良いはずです。以下の水色の部分を追加しました。
version: '2'
services:
homebridge:
image: oznu/homebridge:ubuntu
container_name: homebridge
restart: always
network_mode: host
environment:
- HOMEBRIDGE_CONFIG_UI_PORT=8581
volumes:
- ./homebridge:/homebridge
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
volumes:
- /PATH_TO_YOUR_CONFIG:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
これで、
docker-compose up -d
コマンドを動かした後、http://xxx.xxx.xxx.xxx:8581/に接続したところ動いてました。
まとめ
UbuntuにDockerを入れて、その上にコンテナとしてHomebridgeとHome Assistantをインストールしました。Home Assistantはイメージとしてインストールするのが推奨されているようなので、他のサーバも同居させるためには仮想マシンかDockerを使うのが良いと思いました。
今後、mosquittoやzigbee2mqttなども使う予定ですが、これらのサーバは、従来通り、大元のUbuntuにインストールする予定です。HomebridgeやHome Assistantはwebからのインタフェースが充実してますが、mosquittoなどは設定ファイルやログファイルを見る必要があるので、従来通りの運用が楽かと考えています。
コメント