Node-RED・Mosquitto・Grafana・InfluxDB・nginxの環境をDockerを使って構築し、外部からMQTT通信を行う場合、mosquitto.confをいれる場所が最初わからなかったのでメモを残します。
今回は単純にDockerにMosquittoをいれてmosquitto.confをマウントする方法の紹介です。
docker-compose.yml
version: '3'
services:
mosquitto:
image: eclipse-mosquitto
container_name: mosquitto
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./config/mosquitto.conf:/mosquitto/config/mosquitto.conf
- ./data:/mosquitto/data
- ./log:/mosquitto/log
restart: unless-stopped
このdocker-compose.yml
ファイルは、Docker Composeを使用してMosquitto MQTTブローカーのコンテナを設定し、起動するための設定ファイルです。以下は、このファイルの各要素の詳細な説明です。
version: '3'
- 説明: Docker Composeのファイルフォーマットバージョンを指定しています。
version: '3'
は、現在の主要なDocker Composeバージョンであり、ネットワークやボリュームの管理に優れています。ただし、最近のDockerでは、この属性が「obsolete」(廃止予定)として無視されることがあります。
services
- 説明: ここでは、起動するサービス(コンテナ)のリストを定義しています。この例では、
mosquitto
というサービス(Mosquittoブローカー)が1つ設定されています。
mosquitto
- 説明: これは、
mosquitto
サービスの定義です。MQTTブローカーであるMosquittoをDockerコンテナとして実行する設定が含まれています。
image: eclipse-mosquitto
- 説明: 使用するDockerイメージを指定しています。この場合は、Mosquittoの公式Dockerイメージである
eclipse-mosquitto
を使用します。Docker Hubから自動的に取得されます。
container_name: mosquitto
- 説明: 作成されるコンテナの名前を指定しています。この例では、コンテナに
mosquitto
という名前が付きます。名前を付けることで、後でコンテナを管理しやすくなります(例: コンテナの停止、再起動など)。
ports
- 説明: コンテナのポートとホストのポートをマッピングします。この設定により、ホストマシンの指定されたポートを介してコンテナ内のサービスにアクセスできるようになります。
"1883:1883"
: ホストのポート1883をコンテナのポート1883にマッピングします。ポート1883は、MQTTプロトコルのデフォルトポートです。"9001:9001"
: ホストのポート9001をコンテナのポート9001にマッピングします。ポート9001は、WebSocketを使用してMQTTメッセージを送受信するためのポートです。
volumes
- 説明: ホストマシンのディレクトリやファイルをコンテナ内にマウントします。これにより、データの永続化や、ホスト側での設定ファイルの使用が可能になります。
./config/mosquitto.conf:/mosquitto/config/mosquitto.conf
: ホスト側の./config/mosquitto.conf
ファイルをコンテナ内の/mosquitto/config/mosquitto.conf
にマウントします。Mosquittoの設定ファイルです。これにより、ホスト側の設定ファイルを使用してMosquittoを設定できます。./data:/mosquitto/data
: ホスト側の./data
ディレクトリをコンテナ内の/mosquitto/data
にマウントします。永続的なメッセージ保存に使用されるディレクトリです。./log:/mosquitto/log
: ホスト側の./log
ディレクトリをコンテナ内の/mosquitto/log
にマウントします。Mosquittoのログファイルが保存されるディレクトリです。
restart: unless-stopped
- 説明: コンテナの再起動ポリシーを指定します。この設定では、コンテナが異常終了(クラッシュ)した場合に自動的に再起動されますが、手動で停止した場合(
docker stop
を実行した場合)は再起動されません。
全体の動作
このdocker-compose.yml
ファイルは、以下の動作を行います:
- Mosquittoイメージのダウンロードとコンテナの作成:
eclipse-mosquitto
イメージを使用して、mosquitto2
という名前のMosquitto MQTTブローカーコンテナを起動します。 - ポートの公開: ホストマシン上でMQTT通信(ポート1883)およびWebSocket通信(ポート9001)を受け付けるように設定します。
- 設定ファイルの使用: ホスト側の設定ファイル、データ、ログをコンテナ内で使用し、設定変更やログの永続化を可能にします。
- 再起動ポリシー: コンテナがクラッシュした場合に自動的に再起動し、手動で停止した場合には再起動しないようにします。
これで、Mosquittoを簡単に管理できる環境が整います。
mosquitto.confの場所
MOSQUITTOというフォルダを用意してそこにdocker-compose.ymlを作成。
configというフォルダを作成し、その中にmosquitto.confを作成しました。
mosquitto.confの内容
# Mosquittoの基本設定
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
allow_anonymous true
この設定は、Mosquitto MQTTブローカーの基本的な設定を定義しています。それぞれの行について詳しく説明します。
persistence true
- 説明: 永続的なメッセージ保存を有効にする設定です。
- 詳細:
true
に設定することで、Mosquittoはシャットダウンや再起動後でもメッセージやセッションの状態を保持します。これにより、クライアントが再接続した際に、ブローカーに保存されたメッセージが配信されるようになります。
persistence_location /mosquitto/data/
- 説明: 永続的なデータを保存する場所を指定します。
- 詳細: Mosquittoがメッセージやセッションのデータを保持するディレクトリを指定します。この設定では、コンテナ内の
/mosquitto/data/
ディレクトリが指定されています。永続的なデータはこのディレクトリに保存されます。
log_dest file /mosquitto/log/mosquitto.log
- 説明: ログファイルの保存先を指定します。
- 詳細:
log_dest
はログの出力先を指定する設定です。この場合、ログはファイルとして保存され、ファイルのパスは/mosquitto/log/mosquitto.log
です。エラーや接続状況などのログ情報がこのファイルに書き込まれます。
listener 1883
- 説明: ブローカーが待ち受けるポートを指定します。
- 詳細: Mosquittoは、この設定で指定されたポートでクライアントからの接続を待ち受けます。ポート
1883
は、MQTTプロトコルの標準的な通信ポートです。このポートを介してMQTTメッセージの送受信が行われます。
allow_anonymous true
- 説明: 匿名接続を許可する設定です。
- 詳細:
true
に設定すると、ユーザー名やパスワードなしでクライアントがブローカーに接続できるようになります。セキュリティが必要な場合は、allow_anonymous false
にして、認証を必須にすることが一般的です。
全体の動作
この設定により、Mosquittoは以下のように動作します:
- メッセージやセッションのデータを永続化し、
/mosquitto/data/
に保存します。 - ログ情報を
/mosquitto/log/mosquitto.log
に出力します。 - ポート1883でクライアントからの接続を待ち受け、匿名接続を許可します。
これにより、基本的なMQTTブローカーの動作が設定されています。
動作検証
DockerではないNode-REDをDockerで動かしているPCで立ち上げます。
mqttブローカーには、localhost:1883 とすることで接続できます。
ちなみに、mosquitto.confのlistner 1883を削除すると
このように接続中になるので、Dockerを使ってmqttブローカーに接続できず、ポート設定が間違ってない場合は、ここが原因の可能性大です。
別のPCからこのMQTT Brokerを使う場合
その場合はDockerを動かしているPCのIPアドレスをMQTT Brokerサーバーとして入力すればOKです。