Dockerを使ったEMQXのインストール
このページでは、公式Dockerイメージを使ってEMQX Enterpriseをインストールおよび起動する方法と、Docker Composeを使ってEMQXクラスターを構築する方法を紹介します。
はじめに
Docker上でEMQXを起動する前に、以下のデプロイメントに関する注意点を確認してください。
安定したノード名を選択する
EMQXはノードデータを data/mnesia/<node_name> ディレクトリに保存します。コンテナ起動後にノード名が変更されるとデータが失われる可能性があるため、コンテナ起動前に安定したノード名を選択してください。
単一ノードのデプロイメントでは、EMQX_NODE_NAME 環境変数を emqx@<host> の形式で設定します。コンテナのホスト名も同じ <host> に設定してください。
注意: <host> 部分はIPアドレスまたは完全修飾ドメイン名(FQDN)である必要があります。例:node1.emqx.com。EMQXはErlangノードをロングネームモードで起動するため、ドットを含まない短いホスト名(例:node1)は使用できません。
永続ストレージの準備
コンテナ削除後もEMQXのデータを保持するには、以下のコンテナ内ディレクトリをホストにマウントしてください。
/opt/emqx/data: EMQXのデータを保存します。/opt/emqx/log: ファイルログおよびクラッシュダンプを保存します。
EMQXコンテナはデフォルトでコンソールログを使用しますが、Erlang VMはノードが異常終了した際にクラッシュダンプを /opt/emqx/log に書き込みます。マウントしていない場合、コンテナ削除時にダンプは失われます。ホストのログディレクトリはコンテナ内の emqx ユーザー(UID 1000)が書き込み可能である必要があります。詳細はDockerでのクラッシュダンプを参照してください。
EMQXのディレクトリ構成の詳細はEMQXのファイルとディレクトリを参照してください。
ホスト上のサービスへのアクセス
EMQXがホスト上で稼働するサービスにアクセスする場合、サービスアドレスに localhost や 127.0.0.1 を使用しないでください。これらはコンテナ自身のネットワークインターフェースを指します。ホストのIPアドレスかホストネットワークを使用してください。Docker Desktop for MacやWindowsでは host.docker.internal も使用可能です。
Dockerを使った単一EMQXノードの起動
以下の手順で単一のEMQXノードを起動します。公式EMQX Dockerイメージの詳細はDocker Hub - emqx/emqx-enterpriseを参照してください。
Dockerイメージをプルします。
bashdocker pull emqx/emqx-enterprise:6.3.1ホスト上にディレクトリを作成し、ログディレクトリをコンテナ内の
emqxユーザーが書き込み可能にします。bashmkdir -p $PWD/data $PWD/log sudo chown $UID:$GID $PWD/log安定したノード名とマウントしたディレクトリを指定してコンテナを起動します。
bashdocker run -d --name emqx-enterprise \ --hostname node1.emqx.com \ -e "EMQX_NODE_NAME=emqx@node1.emqx.com" \ -p 1883:1883 -p 8083:8083 \ -p 8084:8084 -p 8883:8883 \ -p 18083:18083 \ -v $PWD/data:/opt/emqx/data \ -v $PWD/log:/opt/emqx/log \ emqx/emqx-enterprise:6.3.1
Dockerでのデフォルトリスナーアドレスの設定
Dockerイメージのデフォルト
EMQX 6.3.0以降、公式イメージのエントリポイントは EMQX_NODE__DEFAULT_LISTENER_ADDRESS が未設定または空の場合、自動的に all に設定します。
これにより、ポートのみを指定したMQTTリスナー、ゲートウェイリスナー、ダッシュボードHTTPリスナーはすべてのネットワークインターフェースにバインドされ、どちらのセキュリティプロファイルでも公開されたコンテナポート経由でアクセス可能になります。
リスナーのバインドに明示的なIPアドレスが指定されている場合は変更されません。この設定はバインドアドレスのみを制御し、認証や認可の要件を緩和するものではありません。
デフォルトの上書き
このデフォルトを上書きするには、docker run -e EMQX_NODE__DEFAULT_LISTENER_ADDRESS=<value> で別のサポートされる値を渡すか、Docker Composeのサービスの environment セクションで設定してください。
環境変数は設定ファイルより優先されるため、マウントした emqx.conf のみで node.default_listener_address を設定してもエントリポイントのデフォルトは上書きされません。
サポートされる値の詳細はデフォルトリスナーアドレスを参照してください。
重要なお知らせ
Dockerのブリッジネットワーク環境でこの変数を loopback に設定すると、対象のリスナーはコンテナのネットワーク名前空間内のループバックにバインドされます。そのため、-p オプションでポートを公開していても外部からアクセスできなくなります。
公開ポートに使用するホストアドレスを制御するには、Dockerのポート公開とマッピングを参照してください。
機能ゲートを使ったEMQXの起動
EMQX 6.3.0以降、EMQX_FEATURES 環境変数で起動時に有効にするオプション機能を制御できます。例えば、コアアプリケーションのみで起動するには以下のように実行します。
docker run -d --name emqx-enterprise \
-e "EMQX_FEATURES=ESSENTIAL" \
-p 1883:1883 -p 8083:8083 \
-p 8084:8084 -p 8883:8883 \
emqx/emqx-enterprise:6.3.1カスタム機能セットで起動するには、以下のように実行します。
docker run -d --name emqx-enterprise \
-e "EMQX_FEATURES=dashboard,metrics,plugins" \
-p 1883:1883 -p 18083:18083 \
emqx/emqx-enterprise:6.3.1機能一覧と依存関係の詳細は機能ゲートを参照してください。
Docker Composeを使ったEMQXクラスターの構築
Docker Composeは複数コンテナのDockerアプリケーションを定義・実行するツールです。このセクションではDocker Composeを使って静的なEMQXクラスターを作成する方法を紹介します。
このセクションのDocker Composeの例はローカルテスト用であり、ボリュームマウントはコメントアウトされています。データやクラッシュダンプを保持するには、はじめにの手順でホストディレクトリを準備し、volumes のコメントを外してください。本番環境でのクラスター構築はクラスターを参照してください。
TIP
Docker ComposeはDocker Desktopに含まれています。まだインストールが必要な場合は、Docker Composeのインストールを参照してください。
任意のディレクトリに
docker-compose.ymlファイルを作成し、以下の内容を記述します。ymlversion: '3' services: emqx1: image: emqx/emqx-enterprise:6.3.1 container_name: emqx1 environment: - "EMQX_NODE_NAME=emqx@node1.emqx.com" # - "EMQX_FEATURES=dashboard,metrics,plugins" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.com,emqx@node2.emqx.com]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node1.emqx.com ports: - 1883:1883 - 8083:8083 - 8084:8084 - 8883:8883 - 18083:18083 # volumes: # - $PWD/emqx1_data:/opt/emqx/data # - $PWD/emqx1_log:/opt/emqx/log emqx2: image: emqx/emqx-enterprise:6.3.1 container_name: emqx2 environment: - "EMQX_NODE_NAME=emqx@node2.emqx.com" # - "EMQX_FEATURES=dashboard,metrics,plugins" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.com,emqx@node2.emqx.com]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node2.emqx.com # volumes: # - $PWD/emqx2_data:/opt/emqx/data # - $PWD/emqx2_log:/opt/emqx/log networks: emqx-bridge: driver: bridgeDocker Composeクラスターで
EMQX_FEATURESを設定する場合は、すべてのEMQXサービスで同じ値を使用してください。コマンドラインツールで
docker-compose.ymlがあるディレクトリに移動し、以下のコマンドを実行してEMQXクラスターを起動します。bashdocker-compose up -dクラスターの状態を確認するには、以下を実行します。
bash$ docker exec -it emqx1 sh -c "emqx ctl cluster status" Cluster status: #{running_nodes => ['emqx@node1.emqx.com','emqx@node2.emqx.com'], stopped_nodes => []}
次のステップ
MQTTクライアントを使ってEMQXに接続し、メッセージのパブリッシュ/サブスクライブを行ってください。詳細はパブリッシュとサブスクライブを参照してください。