EMQ(Erlang MQTT Broker)是一个分布式、大规模可扩展、高度可扩展的MQTT消息代理,采用Erlang/OTP编写。
当前Docker镜像大小:37.1 MB
您可以自行构建此Docker镜像:
bashgit clone -b master https://github.com/emqtt/emq_docker.git cd emq_docker docker build -t emq:latest .
在该Docker镜像下执行命令的格式如下:
bashdocker run --rm -ti -v `pwd`:$(somewhere) emq/$(image) $(somecommand)
例如:
bashdocker run --rm -ti --name emq -p 18083:18083 -p 1883:1883 emq:latest
EMQ Erlang代理在Docker容器中以Linux用户emqtt身份运行。
使用环境变量配置EMQ Docker容器。
以EMQ_为前缀的环境变量会映射到配置文件,其中.会被替换为__。
示例:
bashEMQ_LISTENER__SSL__EXTERNAL__ACCEPTORS <--> listener.ssl.external.acceptors EMQ_MQTT__MAX_PACKET_SIZE <--> mqtt.max_packet_size
以PLATFORM_为前缀的环境变量会映射到配置文件中的模板字符串。
示例:
bashPLATFORM_ETC_DIR <--> {{ platform_etc_dir }}
非映射环境变量:
bashEMQ_NAME EMQ_HOST
这些环境变量不会用于配置文件。
注意:https://github.com/emqtt/emqttd/blob/master/etc/emq.conf%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89EMQ%E9%85%8D%E7%BD%AE%E9%83%BD%E5%8F%AF%E9%80%9A%E8%BF%87%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%85%8D%E7%BD%AE%E3%80%82%E4%BB%A5%E4%B8%8B%E5%88%97%E8%A1%A8%E4%BB%85%E4%B8%BA%E7%A4%BA%E4%BE%8B%EF%BC%8C%E9%9D%9E%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E3%80%82
| 选项 | 默认值 | 映射关系 | 描述 |
|---|---|---|---|
| EMQ_NAME | 容器名称 | none | EMQ节点短名称 |
| EMQ_HOST | 容器IP | none | EMQ节点主机,IP或FQDN |
| EMQ_WAIT_TIME | 5 | none | 超时前等待时间(秒) |
| EMQ_JOIN_CLUSTER | none | none | 初始加入的集群 |
| EMQ_ADMIN_PASSWORD | public | none | EMQ管理员密码 |
| PLATFORM_ETC_DIR | /opt/emqtt/etc | {{ platform_etc_dir }} | 配置文件目录 |
| PLATFORM_LOG_DIR | /opt/emqtt/log | {{ platform_log_dir }} | 日志目录 |
| EMQ_NODE__NAME | EMQ_NAME@EMQ_HOST | node.name | Erlang节点名称,格式为name@ipaddress/host |
| EMQ_NODE__COOKIE | emq_dist_cookie | node.cookie | 集群通信密钥 |
| EMQ_LOG__CONSOLE | console | log.console | 控制台日志输出方式 |
| EMQ_MQTT__ALLOW_ANONYMOUS | true | mqtt.allow_anonymous | 允许MQTT***登录 |
| EMQ_LISTENER__TCP__EXTERNAL | 1883 | listener.tcp.external | MQTT TCP端口 |
| EMQ_LISTENER__SSL__EXTERNAL | 8883 | listener.ssl.external | MQTT TCP TLS/SSL端口 |
| EMQ_LISTENER__WS__EXTERNAL | 8083 | listener.ws.external | HTTP和WebSocket端口 |
| EMQ_LISTENER__WSS__EXTERNAL | 8084 | listener.wss.external | HTTPS和WSS端口 |
| EMQ_LISTENER__API__MGMT | 8080 | listener.api.mgmt | 管理API端口 |
| EMQ_MQTT__MAX_PACKET_SIZE | 64KB | mqtt.max_packet_size | 允许的最大数据包大小 |
该列表不完整,可能会随https://github.com/emqtt/emqttd/blob/master/etc/emq.conf%E5%92%8C%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8F%98%E5%8C%96%EF%BC%8C%E4%BD%86%E6%98%A0%E5%B0%84%E8%A7%84%E5%88%99%E7%9B%B8%E5%90%8C%E3%80%82
若设置了EMQ_NAME和EMQ_HOST而未设置EMQ_NODE__NAME,则EMQ_NODE__NAME=$EMQ_NAME@$EMQ_HOST。
例如,将MQTT TCP端口设置为1883:
bashdocker run --rm -ti --name emq -e EMQ_LISTENER__TCP__EXTERNAL=1883 -p 18083:18083 -p 1883:1883 emq:latest
| 选项 | 默认值 | 描述 |
|---|---|---|
| EMQ_LOADED_PLUGINS | 见下文内容 | EMQ默认加载的插件 |
默认环境变量EMQ_LOADED_PLUGINS包含:
emq_reconemq_modulesemq_retaineremq_dashboardbash# 默认EMQ_LOADED_PLUGINS环境变量 EMQ_LOADED_PLUGINS="emq_recon,emq_modules,emq_retainer,emq_dashboard"
例如,要加载emq_auth_redis插件,将其添加到EMQ_LOADED_PLUGINS中,可使用任意分隔符:
bashEMQ_LOADED_PLUGINS="emq_auth_redis,emq_recon,emq_modules,emq_retainer,emq_dashboard" EMQ_LOADED_PLUGINS="emq_auth_redis emq_recon emq_modules emq_retainer emq_dashboard" EMQ_LOADED_PLUGINS="emq_auth_redis | emq_recon | emq_modules | emq_retainer | emq_dashboard"
EMQ_LOADED_PLUGINS中定义的所有插件都会被加载。
以EMQ_为前缀的环境变量同样适用于所有EMQ插件的配置文件,.会被替换为__。
示例:
bashEMQ_AUTH__REDIS__SERVER <--> auth.redis.server EMQ_AUTH__REDIS__PASSWORD <--> auth.redis.password
无需关心插件配置文件位置,此Docker镜像会自动查找并配置。所有EMQ项目的插件均可按上述环境变量映射规则配置。
假设使用Redis认证插件,示例如下:
bashdocker run --rm -ti --name emq -p 18083:18083 -p 1883:1883 -p 4369:4369 \ -e EMQ_LISTENER__TCP__EXTERNAL=1883 \ -e EMQ_LOADED_PLUGINS="emq_auth_redis,emq_recon,emq_modules,emq_retainer,emq_dashboard" \ -e EMQ_AUTH__REDIS__SERVER="your.redis.server:6379" \ -e EMQ_AUTH__REDIS__PASSWORD="password_for_redis" \ -e EMQ_AUTH__REDIS__PASSWORD_HASH=plain \ emq:latest
您可以指定初始集群并加入。
注意:EMQ集群必须暴露端口4369和6000-6999端口范围。
例如,使用6000-6100端口范围构建集群:
bashdocker run --rm -ti --name emq -p 18083:18083 -p 1883:1883 -p 4369:4369 -p 6000-6100:6000-6100 \ -e EMQ_NAME="emq" \ -e EMQ_HOST="s2.emqtt.io" \ -e EMQ_LISTENER__TCP__EXTERNAL=1883 \ -e EMQ_JOIN_CLUSTER="emq@s1.emqtt.io" \ emq:latest
在Linux主机上,最简单的方法是调优主机内核。
若需通过Docker调优Linux内核,需确保Docker版本为1.12或更高:
bashdocker run --rm -ti --name emq -p 18083:18083 -p 1883:1883 -p 4369:4369 \ --sysctl fs.file-max=2097152 \ --sysctl fs.nr_open=2097152 \ --sysctl net.core.somaxconn=32768 \ --sysctl net.ipv4.tcp_max_syn_backlog=16384 \ --sysctl net.core.netdev_max_backlog=16384 \ --sysctl net.ipv4.ip_local_port_range=1000 65535 \ --sysctl net.core.rmem_default=262144 \ --sysctl net.core.wmem_default=262144 \ --sysctl net.core.rmem_max=16777216 \ --sysctl net.core.wmem_max=16777216 \ --sysctl net.core.optmem_max=16777216 \ --sysctl net.ipv4.tcp_rmem=1024 4096 16777216 \ --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \ --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \ --sysctl net.ipv4.tcp_fin_timeout=15 \ emq:latest
注意:不要以特权模式运行EMQ Docker或挂载系统proc到容器中来调优Linux内核,这是不安全的。
@je-al https://github.com/emqtt/emq-docker/issues/2 提供了变量名映射(点替换为__)的思路。
以下是 dotopt/emqx 相关的常用 Docker 镜像,适用于 不同场景 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务