はじめに
この記事では、Raspberry Pi 4 を使って Node-RED / Mosquitto(MQTT Broker) / Home Assistant をすべて Docker コンテナとして構築する方法をまとめます。
もともと apt や npm で個別に構築していた環境を Docker に統一することで以下のメリットが得られます:
- バージョン管理が楽になる
- バックアップが簡単になる
- 移行が容易になる(Raspberry Pi 5 などへ)
- サービスの起動・停止が一括管理できる
この記事は 新規導入者 と 既存環境から Docker 統一構成へ移行する人の両方に対応しています。
特に、Home Assistant をすでに Docker で構築している人が迷わないように分岐を明確にしています。
なお、Home Assistant を単体の Docker で運用している場合、そのままでも十分安定して稼働します。この記事の構成に合わせる必要はありません。
ただし、Node-RED や Mosquitto も含めて 1つの docker-compose.yml に集約しておくと、起動・停止・バックアップをまとめて扱えるようになるため、複数サービスを長期運用する場合はメリットが大きいです。
1. 対象環境
- Raspberry Pi 4(4GB / 8GB 推奨)
- Raspberry Pi OS Lite 64bit(Bookworm)
- SSD ブート(推奨)
- 固定IP設定済み(NetworkManager)
- SSH 鍵認証済み
セットアップ方法は、以前公開した以下の記事を参考にしてください。
※ 本記事の構成で進める場合は、「Node-RED のインストール(4〜8章)」は実施せず、そのまま本記事へ進んでください。
2. なぜ全部 Docker にするのか?
✔ Node-RED(npm)
OS の Node.js バージョンに依存するため、アップデートが面倒。Docker なら Node-RED のバージョンを自由に選べる。
✔ Mosquitto(apt)
OS のバージョンに縛られる。Docker なら永続化ディレクトリを丸ごとコピーするだけで移行可能。
✔ Home Assistant(Container)
Home Assistant は Docker(Home Assistant Container)での運用にも公式対応しています。特に 自動検出(mDNS / SSDP / UPnP) を利用する場合は network_mode: host が必要です。
なぜ Home Assistant OS ではなく Docker を選ぶのか?
Home Assistant を使うだけであれば、公式の Home Assistant OS は非常に優れた選択肢です。導入が簡単で、アドオンも管理画面から追加できます。
しかし、この記事では Home Assistantだけではなく、Node-RED や Mosquitto を含めた IoT サーバ全体 を構築・運用することを目的としています。
そのため、Home Assistant OS のアドオン機能を利用するのではなく、各サービスを独立した Docker コンテナとして管理する構成を採用しています。
この構成なら、すべてのサービスを Docker Compose で一元管理できるため、
- 起動・停止・更新をまとめて管理できる
- バックアップや Raspberry Pi 5 への移行が容易
- InfluxDB や Grafana などのサービスも同じ方法で追加できる
といったメリットがあります。
Home Assistant OS は「Home Assistant を中心としたスマートホーム環境」に適していますが、本記事では IoT サーバ全体を柔軟に構築・拡張できる Docker 構成 を採用しています。
3. 既存環境から移行する人向け:元のサービス停止手順
新規に導入する方(Node-RED / Mosquitto を今まで使っていない方)は、この章は不要です。次の「4. Docker / Docker Compose の導入」に進んでください。
Docker 版とポートが競合するため、既存の Node-RED / Mosquitto を停止しておきます。
Node-RED(systemd サービス版)
sudo systemctl stop nodered.service
sudo systemctl disable nodered.service
Node-RED のデータ(フロー JSON)は以下:
~/.node-red/
また、~/.node-red/settings.js 内の credentialSecret の値もあらかじめ確認・メモしておいてください。これは後の「10. 既存設定の引き継ぎ」で、Node-RED のフロー(flows_cred.json)をDocker版に移行する際に必要になります。
settings.js は以下のコマンドで開けます。
nano ~/.node-red/settings.js
credentialSecret を設定している場合は、その値を控えておいてください。
credentialSecret: "your-secret-key",
credentialSecret を設定していない場合(先頭に // が付いたコメントアウト状態)は、自動生成された暗号化キーが使われています。この場合は flows_cred.json をそのままコピーしても認証情報を引き継げないため、後述する方法で credentialSecret を設定するか、認証情報を再入力してください。
アンインストールは不要です。 ポート競合を避けるために停止・自動起動無効化さえしておけば、npm版のNode-RED自体は残したままでOKです。
それでも消しておきたい方は、以下のコマンドでアンインストールできます(任意)。
sudo npm uninstall -g node-redフローのデータ(
~/.node-red/)はコマンドでは消えないので、Docker版への移行が完了して不要になったら手動で削除してください。rm -rf ~/.node-red
Mosquitto(apt 版)
sudo systemctl stop mosquitto.service
sudo systemctl disable mosquitto.service
Mosquitto の永続化データ(メッセージの保存内容など)は以下にあります。このデータも後の「10. 既存設定の引き継ぎ」でDocker版にコピーして引き継ぐので、場所だけ覚えておいてください。
/var/lib/mosquitto/
アンインストールは不要です。 こちらもポート競合さえ避ければ、apt版のMosquitto自体は残したままでOKです。
それでも消しておきたい方は、以下のコマンドでアンインストールできます(任意)。
purgeを使うと/etc/mosquitto/などの設定ファイルも一緒に削除されます。永続化データ(/var/lib/mosquitto/)をDocker版にまだコピーしていない場合は、先にコピーを済ませてから実行してください。sudo apt purge mosquitto mosquitto-clients sudo apt autoremove
Home Assistant をすでに Docker で使っている人へ
→ Docker の導入は不要。設定もそのまま利用できます。
Home Assistant を Docker で構築済みの場合は、Docker の再インストールは不要です。
既存コンテナを停止・削除します。
docker stop homeassistant
docker rm homeassistant
コンテナを削除しても、設定データ(
/config)はホスト側に保存されているため削除されません。ホスト側の設定ディレクトリは、
docker run時の-vオプションやdocker-compose.ymlのvolumesで指定した場所にあります。例えば~/homeassistant/のようなパスに置いている場合が多いですが、人によって異なります。以下ではこの~/homeassistant/を例として説明を進めますが、実際のパスは環境によって異なるため、10章で確認方法とあわせて説明します。
4. Docker / Docker Compose の導入
(Home Assistant をすでに Docker で構築している人はこの章をスキップ)
新規導入の方のみ以下を実行してください。
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
再ログインして docker が使えることを確認します。
5. Docker Compose 用ディレクトリ構成を作る
以下のコマンドで必要なディレクトリを作成します。
mkdir ~/docker
cd ~/docker
mkdir mosquitto nodered homeassistant
6. Mosquitto の設定ファイルを作成
まず、設定ファイルを配置するディレクトリを作成します。
cd ~/docker
mkdir -p mosquitto/config mosquitto/data mosquitto/log
続いて、設定ファイルを作成します。
nano mosquitto/config/mosquitto.conf
以下の内容を貼り付けて保存してください。
listener 1883
persistence true
persistence_location /mosquitto/data/
# 匿名接続を許可する場合(自宅LAN限定・外部公開しない場合のみ)
allow_anonymous true
セキュリティ注意:
allow_anonymous trueはブローカーへの認証なしアクセスを許可します。自宅LAN内に閉じている場合はひとまず問題ありませんが、ルーターのポート開放などで 外部からアクセスできる状態には絶対にしないでください。 外部公開する予定がある場合はallow_anonymous falseにした上で、mosquitto_passwdコマンドでユーザー認証を設定してください。
7. Node-RED の永続化ディレクトリを準備
Mosquitto と同様に、Node-RED も設定・フローを永続化するためのディレクトリをあらかじめ用意しておきます。
cd ~/docker
mkdir -p nodered/data
Node-RED の公式イメージはコンテナ内で UID 1000(node-red ユーザー)として動作するため、マウントするホスト側のディレクトリもあらかじめ所有者を UID 1000 に揃えておきます。これを行わないと、コンテナ起動時にデータディレクトリへ書き込めず Restarting を繰り返す原因になります。
sudo chown -R 1000:1000 nodered/data
これで nodered/data の準備は完了です。次にこのディレクトリを docker-compose.yml の volumes でコンテナの /data にマウントします。
8. 管理用設定ファイル docker-compose.yml
ここまでで ~/docker 以下にディレクトリと Mosquitto・Node-RED の設定ファイルを用意しました。次はこの3つのサービス(Mosquitto / Node-RED / Home Assistant)をまとめて管理するための設定ファイル docker-compose.yml を作成します。
~/docker 直下(mosquitto や nodered フォルダと同じ階層)に docker-compose.yml という名前でファイルを作成し、以下の内容を貼り付けてください。
cd ~/docker
nano docker-compose.yml
services:
mosquitto:
image: eclipse-mosquitto:2.0
container_name: mosquitto
restart: unless-stopped
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
nodered:
image: nodered/node-red:3.1
container_name: nodered
restart: unless-stopped
ports:
- "1880:1880"
volumes:
- ./nodered/data:/data
environment:
- TZ=Asia/Tokyo
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
restart: unless-stopped
network_mode: host
volumes:
- ./homeassistant:/config
environment:
- TZ=Asia/Tokyo
内容を貼り付けたら保存して閉じます(nanoの場合は Ctrl+O → Enter → Ctrl+X)。これで ~/docker/docker-compose.yml が作成された状態になります。
なぜ Home Assistant だけ
stableタグなのか?Mosquitto と Node-RED は基本機能が安定しており、更新頻度も低いため、意図しない破壊的変更を避ける目的で具体的なバージョンを固定しています。
一方 Home Assistant は月次でリリースされ、新しい統合(インテグレーション)や不具合修正が頻繁に追加されます。加えて公式のバックアップ機能で更新前の状態に戻せるため、最新版に追従するメリットが大きいと判断し、あえて stable タグを採用しています。
そのため本記事では、Home Assistant のみ意図的に
stableタグを採用しています。バージョンを固定して運用したい場合は、ghcr.io/home-assistant/home-assistant:2024.x.xのように具体的なバージョンタグを指定することも可能です。
9. 起動
docker compose up -d
10. 既存設定の引き継ぎ
新規に導入した方(Node-RED / Mosquitto / Home Assistantを今まで使っていない方)は、この章は不要です。次の「11. 動作確認」に進んでください。
Node-RED のフローを移行する
元の環境:
~/.node-red/flows.json
~/.node-red/flows_cred.json
Docker 版:
~/docker/nodered/data/
コピー:
cp ~/.node-red/flows.json ~/docker/nodered/data/
cp ~/.node-red/flows_cred.json ~/docker/nodered/data/
注意:所有者の再確認
7章でnodered/dataの所有者を UID 1000 に設定していますが、cpでファイルをコピーすると、コピーしたファイルの所有者はコピーを実行したユーザー(通常は自分のユーザーアカウント)になります。コピー後、念のため以下で所有者を揃えておいてください。sudo chown 1000:1000 ~/docker/nodered/data/flows.json ~/docker/nodered/data/flows_cred.json
重要:
flows_cred.jsonを移行する際の注意
flows_cred.jsonはcredentialSecretという鍵で暗号化されています。この鍵は Node-RED インスタンスごとに(settings.js で指定していない限り)自動生成されるため、旧環境とDocker版で鍵が異なると、コピーしただけでは認証情報を復号できずエラーになります。対処法は次のいずれかです。
- 旧環境の
settings.jsで使っていたcredentialSecretの値を確認し、Docker版の~/docker/nodered/data/settings.jsに同じ値を明示的に設定する- あるいは、Docker起動後に
flows_cred.jsonを削除し、Node-REDの管理画面上で認証情報(APIキーなど)を入力し直す特に MQTT node や外部APIノードでパスワード・トークンを使っている場合、ここを飛ばすと起動後にエラーが出て気づく、という事態になりがちです。
Mosquitto の永続化データを移行する
元の環境:
/var/lib/mosquitto/
Docker 版:
~/docker/mosquitto/data/
コピー:
sudo cp -r /var/lib/mosquitto/* ~/docker/mosquitto/data/
Home Assistant を既に Docker で使っている人
→ 既存の /config をそのまま使えば OK
まず、実際の設定ディレクトリがどこにあるか確認します。(3章で見た ~/homeassistant/ はあくまで一例で、人によっては別の場所に置いている場合があります。)
docker inspect homeassistant --format '{{ range .Mounts }}{{ .Source }} -> {{ .Destination }}{{ "\n" }}{{ end }}'
/config にマウントされているホスト側のパス(例:/home/pi/homeassistant など)が実際の設定ディレクトリです。以下では、それが ~/homeassistant/ だった場合の例で進めます。実際のパスに読み替えてください。
まず、コンテナを起動したまま設定を上書きすると不整合が起きる可能性があるため、一度停止します。
docker compose stop homeassistant
続いて、rsync を使って旧環境の設定を同期します(~/docker/homeassistant 内にある自動生成ファイルのうち、旧環境に存在しないものは削除されます)。
注意:
sudoが必要です
Home Assistant コンテナは内部で root としてファイルを書き込むため、~/homeassistant/と~/docker/homeassistant/の中身はどちらもroot所有になっています。一般ユーザーのままrsyncを実行するとPermission deniedで一部ファイルがコピーされずに失敗するため、必ずsudoを付けて実行してください。
sudo rsync -a --delete ~/homeassistant/ ~/docker/homeassistant/
rsync が使えない環境の場合は、以下のように一度中身を空にしてからコピーしても同じ結果になります(こちらも同様に sudo が必要です)。
sudo rm -rf ~/docker/homeassistant/*
sudo cp -r ~/homeassistant/* ~/docker/homeassistant/
同期が終わったら、Home Assistant を起動し直します。
docker compose start homeassistant
compose の ./homeassistant:/config にそのままマウントされているため、これで旧環境の設定が引き継がれます。
正しく引き継げているかは、以下のコマンドでファイルの更新日時が旧環境のものになっているか確認すると確実です(Docker再起動で自動生成された直後の日時ではなく、元の運用開始日時になっていればOKです)。
ls -la ~/docker/homeassistant/ | head -5
11. 動作確認
ここまでの手順で3つのサービスが起動しているはずなので、それぞれ実際にアクセスして確認します。
Node-RED
Raspberry Pi と同じネットワークにあるPCやスマホの Webブラウザ で、以下のURLを開いてください。<Raspberry-Pi-IPアドレス> の部分は実際のPiのIPアドレス(例:192.168.1.50)に置き換えます。
http://<Raspberry-Pi-IPアドレス>:1880
Node-RED のフローエディタ画面が表示されれば成功です。

もし
ERR_CONNECTION_REFUSEDが出たり、docker psでnoderedがRestartingを繰り返している場合は、7章の所有者設定が漏れている可能性があります。以下で確認・修正してください。ls -la ~/docker/nodered/ docker compose logs nodered
dataディレクトリの所有者がrootになっている場合は、cd ~/docker docker compose stop nodered sudo chown -R 1000:1000 nodered/data docker compose start noderedで解消します。
Mosquitto
こちらはブラウザではなく、Raspberry Pi にSSHログインした状態のターミナルで実行します。ターミナルを2つ開いて(またはタブを分けて)、片方で購読、もう片方で送信を試します。
購読側(先にこちらを実行して待機させておく):
mosquitto_sub -h localhost -t test
送信側(別のターミナルで実行):
mosquitto_pub -h localhost -t test -m "hello"
購読側のターミナルに hello と表示されれば、Mosquittoが正常に動いています。

Home Assistant
こちらもPCやスマホの Webブラウザ から、以下のURLを開きます。
http://<Raspberry-Pi-IPアドレス>:8123
初回セットアップ画面が表示されれば成功です(既存環境を引き継いだ場合は、下図のダッシュボードやログイン画面が表示されます)。

12. バックアップ方法
Docker 版はバックアップが非常に簡単です。
~/docker/nodered/data
~/docker/mosquitto/data
~/docker/homeassistant
これらを丸ごとコピーするだけで復元できます。
注意:稼働中のコピーは避ける
コンテナを起動したままファイルをコピーすると、DBファイル(Home AssistantのSQLiteや、Mosquittoのpersistenceファイルなど)の書き込み中にコピーしてしまい、不整合が起きる可能性があります。確実なバックアップを取りたい場合は、cd ~/docker docker compose stop cp -r nodered mosquitto homeassistant /path/to/backup/ docker compose startのように一度停止してからコピーするか、Home Assistant については公式のバックアップ機能(設定 → システム → バックアップ)を使うことをおすすめします。
13. おわりに
Node-RED、Mosquitto、Home Assistant をそれぞれ個別に管理していると、アップデート方法やバックアップ方法が異なり、運用が複雑になりがちです。
Docker Compose に統一しておけば、サービスの追加・更新・バックアップ・移行まで同じ手順で管理できるようになります。
今後 InfluxDB や Grafana などを追加する場合も、同じ docker-compose.yml にサービスを追加していくだけです。
Raspberry Pi を長期的に運用する IoT サーバーとして育てていくなら、Docker 統一構成は非常に扱いやすい選択肢だと思います。
本記事の内容は、私の環境では問題なく動作しましたが、Raspberry Pi のモデルや OS バージョン、ネットワーク構成などによっては同じ結果にならない場合があります。もしうまくいかない点や気になる点があれば、気軽にコメントいただければ嬉しいです。可能な範囲で検討・フォローします。
この記事が、再構築する方にも新規導入する方にも参考になれば幸いです。
関連記事
Raspberry Pi のインストールと Node-REDサーバ の構築(Docker未使用)
MQTT Broker を Raspberry Pi に導入する方法(Docker未使用)
Dockerを使用したHome Assistantサーバの構築
MQTT対応版 ESP32IO の紹介