ブログに書くつもりじゃなかった

フリーのプログラマーが綴る、裏チラ系の備忘録や雑記帳。

DockerとEclipse MosquittoでMQTT

はじめに

MQTTを勉強しないといけないのでDocker上に環境を作って動かすよ。

  • ブローカーはMosquittoの公式イメージをそのまま使う。
  • Subscriber、Publisherはブローカーとコンテナを分ける。tcpdumpも使いたいのでUbuntuから作る。

環境構築

Dockerfile

Subscriber / Publisher側。Ubuntumosquitto-clientstcpdumpを入れる。

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を見ながらお勉強。ふーん。なるほどー。