Mosquittoの動かし方

# はじめに

本ドキュメントでは、試験環境での利用を目的としたMQTT Broker (mosquitto)のセットアップ手順を記します。

# 前提条件

- コンテナ実行環境 (AMD64以外にもARM64などに対応しているようです。私はAMD64環境で確認しています。)

# mosquittoの設定

## 準備作業

mosquittoコンテナイメージを取得します。

```sh
docker pull eclipse-mosquitto
```

mosquitto.confを用意します。デフォルトのmosquitto.confは、外部との通信ができない状態なので、下記を追加し、通信可能な状態とします。この手順は、SSL/TLS設定、認証、クライアント(Publisher/Subscriber)のIP制限などセキュリティ面を考慮しておらず、試験環境での利用目的としてご利用下さい。

```file
allow_anonymous true
listener 1883 0.0.0.0
log_dest file /mosquitto/log/mosquitto.log
```

## 実行

`docker run`コマンドを実行し、mosquittoを起動します。上記にて作成したmosquitto.confを`/mosquitto/config/mosquitto.conf`としてマウントして使用します。{ホストマシンのconfファイルのフルパス}:{上記パス}と記載すれば機能します。

```sh
docker run -d -p 1883:1883 -v /home/ubuntu/mosq/config/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
```

## 確認

[MQTTX](https://mqttx.app/)などで、`{ip address}:1883`として接続確認およびメッセージの送受信を確認します。

MQTTXの設定例
![MQTTX_connection_conf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1557529/b2b46f09-d62c-db3d-1707-cc21c4b3ea4d.png)

## (オプション) m1 macでlimaなどを使う場合

ファイルシステムの違いなどから`docker run`時にファイルを読ませることが難しい場合やlogファイル用ディレクトリのマウントができない場合などがあります。その場合は、こちらの手順を実施すれば起動できます。

```Dockerfile
FROM eclipse-mosquitto
COPY mosquitto.conf /mosquitto/config/
```

```sh
docker build -t my-mosquitto .
```

```sh
docker run -d -p 1883:1883 my-mosquitto
```

## 失敗例

`local only mode`なので外部との通信ができません。

```sh
docker logs {Container ID}
1677048864: mosquitto version 2.0.15 starting
1677048864: Config loaded from /mosquitto/config/mosquitto.conf.
1677048864: Starting in local only mode. Connections will only be possible from clients running on this machine.
1677048864: Create a configuration file which defines a listener to allow remote access.
1677048864: For more details see https://mosquitto.org/documentation/authentication-methods/
1677048864: Opening ipv4 listen socket on port 1883.
1677048864: Opening ipv6 listen socket on port 1883.
1677048864: Error: Address not available
1677048864: mosquitto version 2.0.15 running
```

mosquitto.confファイルのフルパスを間違えてコンテナに渡し損ねたため、起動しない。`docker stop {Container ID}`ののち、`docker rm {Container ID}`すれば削除できます。

```sh
docker run -d -p 1883:1883 -v /home/ubuntu/mosq/config/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
5f258d3291e5b1d69e02bec93c41249ed189cd3c12be10ce9b4f7cba473f2c8e
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/home/ubuntu/mosq/config/mosquitto.conf" to rootfs at "/mosquitto/config/mosquitto.conf": mount /home/ubuntu/mosq/config/mosquitto.conf:/mosquitto/config/mosquitto.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
ubuntu@gmktec:~/mosquitto$ docker ps -a
CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS        PORTS                                                                     NAMES
5f258d3291e5   eclipse-mosquitto                    "/docker-entrypoint.…"   5 seconds ago   Created       0.0.0.0:1883->1883/tcp, :::1883->1883/tcp                                 brave_dirac
```

# 参考情報

[docker hub/eclipse-mosquitto](https://hub.docker.com/_/eclipse-mosquitto?tab=description)