DockerでMQTTを試してみた

MQTT を今後使うことがありそうなので Docker の練習も兼ねてやってみた。

方針は次の通り。

  • Publisher, Subscriber, Broker それぞれを Docker コンテナにする
  • Broker に mosquitto をインストールする
  • Publisher, Subscriber に mosquitto-clients をインストールする
  • Publisher は “hello world” を5秒ごとに送信する
  • MQTT 標準の 1883 ポートで通信する

動作環境

Ubuntu 15.10 x86_64

Docker のインストール

$ sudo apt-get install docker.io

ユーザを docker グループに追加

一般ユーザが docker コマンドを使えるようにするために docker グループに
追加する。下記コマンドの実行後に一旦ログアウトしてログインし直すと適用
される。

$ sudo usermod -aG docker <username>

DNS 設定

/etc/default/docker が docker daemon の設定ファイルである。
ここに

#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

という記述があるのでコメントを外して有効化する。
その後 docker daemon を再起動する。
この設定をしなかったら Docker イメージ作成時の apt-get で失敗する。

$ sudo vi /etc/default/docker
$ sudo service docker restart

Dockerfile の作成

$ mkdir -p mq-broker/conf mq-publisher/conf mq-subscriber/conf

各 conf ディレクトリ配下に Dockerfile を作成する。
内容は下記の通り。

mq-broker/conf/Dockerfile

FROM ubuntu:latest
RUN apt-get update && \
    apt-get install mosquitto -y && \
    apt-get clean
EXPOSE 1883

mq-publisher/conf/Dockerfile

FROM ubuntu:latest
RUN apt-get update && \
    apt-get install mosquitto-clients -y && \
    apt-get clean

mq-subscriber/conf/Dockerfile

FROM ubuntu:latest
RUN apt-get update && \
    apt-get install mosquitto-clients -y && \
    apt-get clean

Docker イメージの作成

$ docker build --no-cache -t mq-broker mq-broker/conf
$ docker build --no-cache -t mq-subscriber mq-subscriber/conf
$ docker build --no-cache -t mq-publisher mq-publisher/conf

Docker コンテナの起動

broker, subcriber, publisher を順番に立ち上げる。
-d オプションを付けたのでバックグラウンドで動作する。

$ docker run -d --name broker mq-broker mosquitto
$ docker run -d --name sub --link broker:broker mq-subscriber mosquitto_sub -h broker -t "topic/test"
$ docker run -d --name pub --link broker:broker mq-publisher sh -c 'while :; do mosquitto_pub -h broker -t "topic/test" -m "hello world"; sleep 5; done'

subscriber のログ (mosquitto_sub の標準出力) を表示する。
5秒ごとに “hello world” が表示されることを確認する。

$ docker logs -f sub
hello world
hello world
hello world

コンテナを停止し廃棄する。

$ docker stop pub sub broker
$ docker rm pub sub broker

参考文献

  • http://qiita.com/hiroeorz@github/items/455dfcce211866465d29