Docker部署EMQX指南及解决权限问题(mkdir权限拒绝问题处理)

目录预览:

  • 一、Docker部署EMQX
  • 前言
  • (一)获取 Docker 镜像
  • (二)启动 Docker 容器(未挂载目录)
  • (三)启动 Docker 容器(挂载目录)
  • 二、部署问题
  • (一)问题分析
  • (二)解决方案
  • 1.创建一个具名卷
  • 2.启动容器
  • 3.查看具名卷
  • 4.查看具名卷详情
  • 三、访问EMQX web管理页面
  • 总结
  • 一、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 容器 ,请将以下目录挂载到容器外部,这样即使容器被删除数据也不会丢失。

  • /opt/emqx/data
  • /opt/emqx/log
  • 关于 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 版本需要挂载出来以下目录才能持久化:

  • /opt/emqx/data
  • /opt/emqx/etc
  • /opt/emqx/log
  • 但是启动加上 -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,如果是阿里云服务器,需要去阿里云控制台开放一下端口):

  • 服务器ip:51083
  • 出现以下页面就大功告成了!!!
    默认账号:admin 默认密码:public
    首次登录进去之后,会提示你修改密码。

    总结

    本篇博客只是介绍一下如何Docker启动EMQX。
    笔者在其中跌跌撞撞历经坎坷,所以整理了一下踩坑过程分享给大家。
    生产环境肯定是需要集群部署的,后续docker-compose EMQX集群部署、K8s EMQX集群部署也会分享给大家!!!

    作者:清淡的粥

    物联沃分享整理
    物联沃-IOTWORD物联网 » Docker部署EMQX指南及解决权限问题(mkdir权限拒绝问题处理)

    发表回复