概要
mosquittoはとても平たく言えば、簡単にpub/subサーバーを持てるということ。
- mosquitto = pub/subサーバー
- クライアントは
mosquitto-clients
などを入れてサーバーにsubscribeしたり、publishしたり出来る
問題
情報が少ない、色々見渡しても書いてあることがまちまち。
docker-composeで設定してみるとどうもdata
、log
ディレクトリが書き込まれない。
よく書かれている設定だけでは、サーバー、クライアントが同一ホストでないとConnection Refused: not authorised
エラーが出る。
簡単な解決方法
version: "3"
services:
client:
build:
context: ./client
tty: true
broker:
image: eclipse-mosquitto
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
user: "1000:1000"
まず、broker(pub/subサーバー)のvolumes
、user
(id $(whoami)のuid:gid
)を上のように設定しないと、どうしてもlogが入ってこない。
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all # 全部
# この2つの設定がないとdocker-compose内のclientからアクセスできない(Connection Refused: not authorisedが出る)
listener 1883
allow_anonymous true
クライアント側ではsudo apt-get install -y mosquitto-clients
などとしてmosquitto_sub
、mosquitto_pub
コマンドを手に入れておく。
使い方
$ sudo docker-compose up -d
$ docker exec -it __client__ ash # container名は自身の環境に合わせて変える、ターミナルでこれを2枚開く
mosquitto_sub -h broker -t topic_name
mosquitto_pub -h broker -t topic_name -m message
これでclient1にmessage
が届く
因みに
$ docker exec -it __broker__ ash
として入ると、/mosquitto-no-auth.conf
というファイルがあり、これに認証無しで他ホストから接続できるようにする設定が書いてある。
また、volumesの設定をなしで同じようにコンテナ内に入り/mosquitto/config/mosquitto.conf
をみるとデフォルトのconf内容がわかる。