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