官方的指令:
#原生的
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.1.3
我自己增加了数据卷的配置:
docker run -d
-p 1883:1883
-p 8083:8083
-p 8084:8084
-p 8883:8883
-p 18083:18083
–name emqx
-v $PWD/data:/opt/emqx/data
-v $PWD/etc:/opt/emqx/etc
-v $PWD/log:/opt/emqx/log
emqx/emqx:5.1.3
增加了数据卷配置之后 docker无法启动
用 docker logs [container_name]
这个命令看一下容器的启动日志
这个尝试过了
[root@iZ2ze9zpq93msg486riflbZ emqx_docker_data]# docker logs emqx
ERROR: emqx.conf is not found in /opt/emqx/etc
当执行logs日志的时候 报没有找到/opt/emqx/etc 这个问题 已经很多水友遇到了。是容器问题 还是emqx兼容容器的数据卷问题呢,因为只有配置了数据卷之后 就会出现这个问题。
我猜想 可能是配置数据卷后 不支持 然后 emqx安装的时候就异常退出了,导致最终的容器中emqx就没有安装完整。 docker logs 找不到 日志。 端口映射好像也是失败的。群里有很多人遇到这个问题,除非忽略这个数据卷配置,但是生产环境 不配置数据卷有点吓人。
又经过大量的测试,问题就是在于配置数据卷的命令,导致容器无法启动,不知道容器中什么原因导致了,容器内部的data、etc等相关目录丢失,最终无论是docker start 还是docker log 都无法使用。
可以帮忙执行一下配置数据卷的docker命令吗,你们看下问题
docker run -d
-p 1883:1883
-p 8083:8083
-p 8084:8084
-p 8883:8883
-p 18083:18083
–name emqx
-v $PWD/data:/opt/emqx/data
-v $PWD/etc:/opt/emqx/etc
-v $PWD/log:/opt/emqx/log
emqx/emqx:5.1.3
挂载了数据卷就意味着用外部目录替换容器内默认的 etc data log 目录
此时需要手动准备 etc 目录下的:配置文件,证书,erlang 虚拟机参数配置等文件
root@969b3598514d:/opt/emqx# tree etc
etc
├── acl.conf
├── certs
│ ├── README
│ ├── cacert.pem
│ ├── cert.pem
│ ├── client-cert.pem
│ ├── client-key.pem
│ └── key.pem
├── emqx.conf
├── examples
│ ├── README.md
│ ├── alarm.conf.example
│ ├── cluster-with-dns.conf.example
│ ├── cluster-with-etcd-ssl.conf.example
│ ├── cluster-with-etcd.conf.example
│ ├── cluster-with-k8s.conf.example
│ ├── cluster-with-manual.conf.example
│ ├── cluster-with-static.conf.example
│ ├── conn_congestion.conf.example
│ ├── dashboard-with-http.conf.example
│ ├── dashboard-with-https.conf.example
│ ├── delayed.conf.example
│ ├── exhook.conf.example
│ ├── flapping_detect.conf.example
│ ├── force_gc.conf.example
│ ├── force_shutdown.conf.example
│ ├── gateway.coap.conf.example
│ ├── gateway.exproto.conf.example
│ ├── gateway.lwm2m.conf.example
│ ├── gateway.mqttsn.conf.example
│ ├── gateway.stomp.conf.example
│ ├── listeners.quic.conf.example
│ ├── listeners.ssl.conf.example
│ ├── listeners.tcp.conf.example
│ ├── listeners.ws.conf.example
│ ├── listeners.wss.conf.example
│ ├── log.console.conf.example
│ ├── log.file.conf.example
│ ├── mqtt.conf.example
│ ├── node.conf.example
│ ├── plugins.conf.example
│ ├── prometheus-pushgateway.conf.example
│ ├── prometheus.conf.example
│ ├── psk_authentication.conf.example
│ ├── retainer.conf.example
│ ├── sys_topics.conf.example
│ ├── sysmon.os.conf.example
│ └── sysmon.vm.conf.example
├── lwm2m_xml
│ ├── LWM2M_Access_Control-v1_0_1.xml
│ ├── LWM2M_Connectivity_Statistics-v1_0_1.xml
│ ├── LWM2M_Device-v1_0_1.xml
│ ├── LWM2M_Firmware_Update-v1_0_1.xml
│ ├── LWM2M_Location-v1_0.xml
│ ├── LWM2M_Security-v1_0.xml
│ └── LWM2M_Server-v1_0.xml
├── ssl_dist.conf
└── vm.args
3 directories, 55 files
root@969b3598514d:/opt/emqx#
etc 目录下的:配置文件,证书,erlang 虚拟机参数配置等文件.。手动怎么配置呀, ,我今天没有配置数据卷装了一个emqx ,然后把etc目录复制出来一份,然后再重新装了一个新的配置数据卷,到我刚刚复制目录里面,当然etc里面内容什么也没动,docker emqx启动就闪退 然后一直启动不了,是要改配置吗,按照道理来说 配置数据卷 只是为了文件保留 方便配置呀,不配置也可以呀。为啥要还得手动准备 …
如果只有这手动准备方式,这么多要配置的 我将从哪里开始…
etc 目录下的配置文件,包含了 emqx 集群/节点/虚拟机参数等许多配置
配了空的目录就会因为找不到配置文件而无法启动。
简单的配置修改可以通过给容器传环境变量的方式进行,不一定要挂载数据卷进去,参考:通过环境变量设置配置
遇到这个问题的人有点多哎~~~ 存在可能完善的情况吗
配置数据卷不是为了docker出现意外 能够保留 日志 数据等各项配置么,正常情况下不会是空目录呀,docker中都有 同步到数据卷就好了呀。
是的,但是你挂进去的数据卷是空的: -v $PWD/etc:/opt/emqx/etc
EMQX 需要挂进去的目录里有准备好的配置文件才能正常启动与
如果我期望仍然以这种数据卷的方式应该怎么做呢,我自己启动一个容器 直接把etc目录内容复制一份,然后删除 重新启动一个容器 挂载到这里。
EMQX 的启动要求配置文件必须存在,在这里即 /opt/emqx/etc/emqx.conf
。所以你挂载的目录需要提供这个文件才行,不能是空文件夹。
我自己启动一个容器 直接把etc目录内容复制一份,然后删除 重新启动一个容器 挂载到这里。
emqx.conf
是 emqx 启动必须依赖的配置文件,所以就算是启动过,再次启动时仍然是需要的
@wivwiv 我们应该在文档里新增一个章节,来描述简单引导 “通过 Docker 启动 EMQX 如何持久化” 一些数据或者配置
非常值得推荐,在经过你们合格的测试后,将步骤放入到文档中,因为docker部署是很常见的,生产环境,公司一定会要求配置持久化。如果有个细则说明,就好了。非常感谢你能够向你的团队提出建议