Docker部署EMQX指南及解决权限问题(mkdir权限拒绝问题处理)
目录预览:
一、Docker部署EMQX
前言
先介绍一下EMQX是什么,EMQX 可以简单理解为一个MQTT的服务器。是一款「无限连接,任意集成,随处运行」的大规模分布式物联网接入平台,同时作为一个高性能、可扩展的 MQTT 消息服务器,它可以为物联网(IoT)应用提供可靠的实时消息传输和设备连接解决方案。
官方教程
: https://docs.emqx.com/zh/emqx/latest/deploy/install-docker-ce.html
注:因为服务器部署RabbitMq,1883端口占用,所以映射端口我在前面都加了一个5 。
(一)获取 Docker 镜像
docker pull emqx/emqx:5.7.1
(二)启动 Docker 容器(未挂载目录)
docker run -d --name emqx -p 51883:1883 -p 58083:8083 -p 58084:8084 -p 58883:8883 -p 51083:18083 emqx/emqx:5.7.1
(三)启动 Docker 容器(挂载目录)
如果需要持久 Docker 容器 ,请将以下目录挂载到容器外部,这样即使容器被删除数据也不会丢失。
关于 EMQX 目录结构的详细信息,可参考 EMQX 官方文件和目录介绍
:
https://docs.emqx.com/zh/emqx/latest/deploy/install.html#文件和目录
启动容器并挂载目录:
docker run -d --name emqx -p 51883:1883 -p 58083:8083 -p 58084:8084 -p 58883:8883 -p 51083:18083 -v /var/lib/emqx/data:/opt/emqx/data -v /var/lib/emqx/log:/opt/emqx/log emqx/emqx:5.7.1
至此,EMQX就部署完成了!
但是在执行含挂载目录启动命令时会遇见问题。
二、部署问题
(一)问题分析
按照 EMQX官方文档启动,默认是不带目录挂载的。
5.1.3 版本需要挂载出来以下目录才能持久化:
但是启动加上 -v 挂载后, 会报错:
mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied
数据卷挂载提示权限不足解决,如下图所示:
原因很简单,EMQX 的镜像内 Linux 用户为 emqx,组为emqx,并非 root 用户。
-v 创建目录时候默认用的一般是 root 用户,这时候 emqx 在 root 下的目录创建文件自然就权限不足。
这一点进入容器中可以看到,如下图所示:
docker exec -it emqx/emqx:5.7.1 /bin/bash
ls -l
EMQX 不使用 root 应该有他的原因,现在重点是怎么解决这个问题。
一种思路是宿主机也创建 emqx 这个用户,并且保持用户 id 和容器内部的一致,然后先创建好要挂载的目录,这样就可以跳过权限问题。
我觉得这个方法很麻烦,容器居然还要依赖环境…
(二)解决方案
查阅了 Docker 的卷挂载相关的内容,发现匿名卷和具名卷可以兼容权限问题。匿名卷可读性不太好,建议创建具名卷。
1.创建一个具名卷
docker volume create emqx_data1
2.启动容器
启动加上 -v emqx-data1:/opt/emqx/
docker run -d --name emqx1 -p 51883:1883 -p 58083:8083 -p 58084:8084 -p 58883:8883 -p 51083:18083 -v emqx_data1:/opt/emqx/ emqx/emqx:5.7.1
启动成功!!!
3.查看具名卷
docker volume list
4.查看具名卷详情
docker volume inspect emqx_data1
三、访问EMQX web管理页面
在浏览器中输入以下链接(51083映射的是18083,如果是阿里云服务器,需要去阿里云控制台开放一下端口):
出现以下页面就大功告成了!!!
默认账号:admin 默认密码:public
首次登录进去之后,会提示你修改密码。
总结
本篇博客只是介绍一下如何Docker启动EMQX。
笔者在其中跌跌撞撞历经坎坷,所以整理了一下踩坑过程分享给大家。
生产环境肯定是需要集群部署的,后续docker-compose EMQX集群部署、K8s EMQX集群部署也会分享给大家!!!
作者:清淡的粥