DockerとEclipse MosquittoでMQTT
はじめに
MQTTを勉強しないといけないのでDocker上に環境を作って動かすよ。
- ブローカーはMosquittoの公式イメージをそのまま使う。
- Subscriber、Publisherはブローカーとコンテナを分ける。
tcpdump
も使いたいのでUbuntuから作る。
環境構築
Dockerfile
Subscriber / Publisher側。Ubuntuにmosquitto-clients
とtcpdump
を入れる。
FROM ubuntu RUN apt update \ && apt install -y mosquitto-clients tcpdump
mosquitto.conf
Mosquittoの設定ファイル。コンテナ間で通信するための最小限の設定をする。
allow_anonymous true listener 1883
docker-compose.yml
全体の構成を定義。
version: '3' services: mosquitto-publisher: build: . container_name: mosquitto-publisher tty: true mosquitto-subscriber: build: . container_name: mosquitto-subscriber tty: true mosquitto-broker: image: eclipse-mosquitto container_name: mosquitto-broker volumes: - ./mosquitto.conf:/mosquitto/config/mosquitto.conf
動作確認
コンテナを起動する。
$ docker-compose up -d
Subscriberのコンテナに入る。
$ docker exec -it mosquitto-subscriber /bin/bash
トピックをSubscribeする。
$ mosquitto_sub -h mosquitto-broker -t mytopic -d
Publisherのコンテナに入る。
$ docker exec -it mosquitto-publisher /bin/bash
トピックにメッセージをPublishする。
$ mosquitto_pub -h mosquitto-broker -t mytopic -m "This is a test." -d
ユーザID、パスワード認証を有効にしよう
dockerコンテナに入る。
$ docker exec -it mosquitto-broker /bin/sh
パスワードファイルを新規に作成し、user1
を追加。
$ mosquitto_passwd -c pwdfile user1 Password: Reenter password:
パスワードファイルにuser2
を追加。
$ mosquitto_passwd pwdfile user2 Password: Reenter password:
できたファイルを確認する。
$ cat pwdfile user1:$7$101$Lt7Tg/kTMwmZXe6D$mnDP9IpgkkOMQ6EV7E4mytxWvXAMNmPP391/j1YfkrgJENEAJ3W/1jFm20SRijLAYch6fwqnRw8UojVsAFlipw== user2:$7$101$l/J0c5HiY31XtIFY$4rQkP4egix5w9iEESkLLSCjUmveVUHhjqdAuEb2fGL/4r5dW7aT98DM4+ASI/vnXhQfKWw06FZlcPqOoPbdL3w==
一旦コンテナから抜ける。
$ exit
mosquitto.conf
を編集。
allow_anonymous false listener 8883 password_file /pwdfile cafile /mosquitto/certs/ca.crt keyfile /mosquitto/certs/server.key certfile /mosquitto/certs/server.crt
再起動。
$ docker-compose restart
通信内容を確認しよう
Subscriber / Publisherコンテナ上でtcpdump
を実行する。-w
オプションで内容をファイル出力する。
$ tcpdump -i any -w test.cap port 1883
ひと通り動かしたらファイルをホストにコピーする。
$ docker cp mosquitto-subscriber:/test.cap .
Wiresharkでファイルを開いて、MQTT Specificationを見ながらお勉強。ふーん。なるほどー。