0. 前言

  现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库。以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联网架构。好了,废话不说,开始咯。

1. 构建STUNServer服务

  STUN服务,是一个标准的服务,用户判断当前外网IP,主要用于NAT判断。我使用的是 https://github.com/jselbie/stunserver 这个开源的STUN服务,直接 git clone 下来,执行docker build 进行构建即可,自带有Dockerfile文件。我构建的时候,发生构建失败,所以把apt源改为阿里源。

 FROM ubuntu:latest

 EXPOSE 3478/tcp 3478/udp

 USER root

 RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list RUN set -ex && \
apt-get update && \
apt-get install -y build-essential && \
apt-get install -y libboost-all-dev && \
apt-get install -y libssl-dev && \
apt-get install -y g++ && \
apt-get install -y make && \
apt-get install -y git && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/* RUN cd /opt && git clone https://github.com/jselbie/stunserver.git && cd stunserver && make WORKDIR /opt/stunserver HEALTHCHECK CMD /opt/stunserver/stunclient localhost ENTRYPOINT ["/opt/stunserver/stunserver"]

  通过以下工具,可以测试STUN服务是否正常

  这里我只测试局域网的,外网也是可以的,我以前测试过。

  为了测试效果,我把镜像放到阿里云ECS主机上测试,利用之前提到的,把打包好的Image上传到阿里Docker仓库,然后在ECS主机上pull后运行。

docker run -d -p 3478:3478/udp stunserver:1.2.13 

  阿里云ECS自定义IP及多IP绑定,这里略,以后实际用到的,再开一篇博客说明。

  可以用这个在线工具测试STUN服务 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

  由于现在我的ECS主机配置及实例规格太久,不支持多IP设置。(这里涉及到ECS主机多IP,docker 多IP绑定,stunserver多IP绑定,还是有点复杂的)
  这里简单描述一下办法:
    1)阿里云控制台,云服务器ECS,购买弹性公网IP(EIP)
    2)云服务器ECS,网络和安全,创建弹性网卡(ENI)
    3)弹性公网IP(EIP)绑定弹性网卡(ENI)
    4)弹性网卡(ENI)绑定实例,这里作为辅助网卡进行绑定
  https://help.aliyun.com/document_detail/88991.html?spm=a2c4g.11186623.6.551.221228d1xEtM7X#h2-url-2

2. Redis镜像

  可以直接使用hub.docker.com 官方仓库的Image,或者自己构建 https://github.com/docker-library/redis/tree/master/5.0/alpine
  Dockerfile 代码,不过我还是建议从官方文件下载Image比较好

docker run -d -p 6379:6379 -v /root/workspace/docker/ipc/redis/data:/data redis:5.0.1

  如果需要自定义配置

-v /my_redis.conf:/usr/local/etc/redis/redis.conf 

  持久化

-v /docker/host/dir:/data
--volumes-from some-volume-container

  redis可视化Web客户端 phpRedisAdmin https://github.com/ErikDubbelboer/phpRedisAdmin

  一份docker-compose.yml 测试Redis功能

 version: '3'
services:
redis:
image: redis:5.0.1
ports:
- 6319:6379 redis-admin:
image: erikdubbelboer/phpredisadmin
environment:
- ADMIN_USER=admin
- ADMIN_PASS=admin
- REDIS_1_HOST=redis
- REDIS_1_PORT=6379
- REDIS_2_HOST=redis
- REDIS_2_PORT=6379
ports:
- 80:80

  Web客户端如下图所示,看起来有点Low

3. 官方MongoDB镜像

  跟Redis类似,可以直接用官方仓库的Image,或者自己构建 https://github.com/docker-library/mongo/tree/master/4.1

  自定义配置文件

docker run -v /my/custom/mongod.conf:/etc/mongo/mongod.conf -d mongo:4.0.4 --config /etc/mongo/mongod.conf

  自定义环境变量,如mongo登录帐号密码

docker run -d -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo:4.0.4

  自定义Volumn存储

docker run -v /my/datadir:/data/db -d mongo:4.0.4

  启动

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -v /root/workspace/docker/mongo/data:/data/db mongo:4.0.4

  docker-compose.yml

 version: '3.1'

 services:
mongo:
image: mongo
restart: always
volumes:
- "/root/workspace/docker/mongo/data/:/data/db/"
ports:
- 27017:27017 mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081

  Mongo-express

 ...
environment:
- ME_CONFIG_MONGODB_SERVER=mongo
- ME_CONFIG_MONGODB_PORT=
- ME_CONFIG_MONGODB_ENABLE_ADMIN=false
- ME_CONFIG_MONGODB_AUTH_DATABASE=admin
- ME_CONFIG_MONGODB_AUTH_USERNAME=${MONGO_ROOT_USER}
- ME_CONFIG_MONGODB_AUTH_PASSWORD=${MONGO_ROOT_PASSWORD}
- ME_CONFIG_BASICAUTH_USERNAME=${MONGOEXPRESS_LOGIN}
- ME_CONFIG_BASICAUTH_PASSWORD=${MONGOEXPRESS_PASSWORD}

  可视化Web客户端

4. EMQ 2.3.11

  https://github.com/emqx/emqx-docker 自己构建,如果构建失败,那么就用官方提供的Image即可。http://emqtt.com/downloads/2318,下载后,解压,然后通过 docker load 进行加载,不能用docker import 导入。
  一些配置可以参考github上的Readme

docker run --rm -it --name emq -p 18083:18083 -p 1883:1883 emqttd:2.3.11

  数据目录:/opt/emqttd/data
  日志目录:/opt/emqttd/log
  配置目录:/opt/emqttd/etc

  一份docker-compose.yml配置,主要功能是,启动MQTT服务器,并且该MQTT服务器启用帐号密码认证,帐号密码认证信息在MongoDB里。

 version: '3.1'
services:
mongo:
image: mongo
restart: always
volumes:
- "/root/workspace/docker/mongo/data/:/data/db/"
ports:
- 27017:27017 mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081 emqttd:
image: emqttd:2.3.11
restart: always
ports:
- 18083:18083
- 1883:1883
- 8083:8083
environment:
- EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard" #开启Mongo认证插件
- EMQ_AUTH__MONGO__SERVER=mongo:27017 #连接Mongo
- EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain #密码使用明文
- EMQ_MQTT__ALLOW_ANONYMOUS=false #不允许匿名登录

  docker-compose up -d
  启动后,通过mongo-express工具,在MongoDB里创建mqtt数据库,mqtt_user集合,并插入数据,详细参考:http://emqtt.com/docs/v2/plugins.html#emq-auth-mongo-mongodb

 {
"_id": ObjectID("5bebca74e99b2600089499b2"),
"username": "admin",
"password": "admin",
"is_superuser": true,
"created": "2018-01-01"
}

  EMQ 基于docker-compose 集群配置

 version: '3'
services:
emq1.wunaozai.com:
image: emqttd:latest
ports:
- 18083:18083
- 8083:8083
environment:
- EMQ_NAME=emq
- EMQ_HOST=emq1.wunaozai.com emq2.wunaozai.com:
image: emqttd:latest
ports:
- 8084:8083
environment:
- EMQ_NAME=emq
- EMQ_HOST=emq2.wunaozai.com
- EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com emq3.wunaozai.com:
image: emqttd:latest
ports:
- 8085:8083
environment:
- EMQ_NAME=emq
- EMQ_HOST=emq3.wunaozai.com
- EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com emq4.wunaozai.com:
image: emqttd:latest
ports:
- 8086:8083
environment:
- EMQ_NAME=emq
- EMQ_HOST=emq4.wunaozai.com
- EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com

  关于EMQ Dashboard的操作及预览这里略,如果不清楚的,可以参考我之前的博客。

5. 构建docker-compose.yml

  基于以上所有Image,将所有Image上传至阿里云Repo。并提供一份完整的docker-compose.yml文件

 version: '3'
services: stunserver:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/stunserver:1.2.13
restart: always
ports:
- 3478:3478/tcp
- 3478:3478/udp mongo:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/mongo:4.0.4
restart: always
volumes:
- "/root/workspace/docker/project/data/mongo/:/data/db/"
ports:
- 27017:27017
mongo-express:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/mongo-express:0.49.0
restart: always
ports:
- 27018:8081 redis:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/redis:5.0.1
restart: always
volumes:
- "/root/workspace/docker/project/data/redis/:/data"
ports:
- 6379:6379
redis-admin:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/redis-admin:1.11.0
restart: always
ports:
- 6380:80
environment:
- ADMIN_USER=admin
- ADMIN_PASS=wunaozai
- REDIS_1_HOST=redis
- REDIS_1_PORT=6379 mqtt-01.wunaozai.com:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/emqttd:2.3.11
ports:
- 18083:18083
- 10001:8083
- 10011:1883
environment:
- EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard"
- EMQ_AUTH__MONGO__SERVER=mongo:27017
- EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain
- EMQ_MQTT_ALLOW_ANONYMOUS=false
- EMQ_ADMIN_PASSWORD=wunaozai
- EMQ_NAME=mqtt
- EMQ_HOST=mqtt-01.wunaozai.com
- EMQ_JOIN_CLUSTER=mqtt@mqtt-02.wunaozai.com
mqtt-02.wunaozai.com:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/emqttd:2.3.11
ports:
- 10002:8083
- 10012:1883
environment:
- EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard"
- EMQ_AUTH__MONGO__SERVER=mongo:27017
- EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain
- EMQ_MQTT_ALLOW_ANONYMOUS=false
- EMQ_ADMIN_PASSWORD=wunaozai
- EMQ_NAME=mqtt
- EMQ_HOST=mqtt-02.wunaozai.com
- EMQ_JOIN_CLUSTER=mqtt@mqtt-01.wunaozai.com

  运行

docker-compose up -d

  使用 Weave Scope 工具查看

  从上图可以看到最上面的 The Internet 是表示Host主机连接到外部网络。上面有两个MQTT,分别是 project_mqtt-01 和 project_mqtt-02, 然后这两个mqtt构成集群,并连接project_mongo,表示这两个MQTT Broker是基于Mongo进行权限认证的。同时左边还有一个project_mongo_express这个表示用于MongoDB的Web可视化客户端。最后是下面的6个Contrainer,有些是测试用的,但是还是可以看到下面有project_redis和project_redis_admin,project_stunserver。

  本篇篇幅比较长,剩下部分,下一小结继续 物联网架构成长之路(26)-Docker构建项目用到的镜像2

参考资料
  http://blog.51cto.com/13323775/2061637
  https://hub.docker.com/r/library/mongo/
  https://www.jianshu.com/p/0523fc5c317a

本文地址: https://www.cnblogs.com/wunaozai/p/9965505.html

物联网架构成长之路(25)-Docker构建项目用到的镜像1的更多相关文章

  1. 物联网架构成长之路(26)-Docker构建项目用到的镜像2

    0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...

  2. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建

    0. 前言 时隔多日,前段时间忙完一个可有可无的项目后,又进入摸鱼时间,没有办法,非互联网公司,就是闲得蛋疼.又开始了自学之路.以前入门过Docker,然后又很久没有看了,最近重新看了一下,推荐一下这 ...

  3. 物联网架构成长之路(27)-Docker练习之Zookeeper安装

    0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...

  4. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  5. 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)

    0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...

  6. 物联网架构成长之路(23)-Docker练习之Elasticsearch服务搭建

    0. 前言 最近基本都是学一些环境配置,和一些中间件的安装与配置.没有实际编写代码.可能看起来有点水,我对自己的学习方式是,先要了解各个中间件的安装配置以及简单使用,理论应用场景,然后我在小项目中,逐 ...

  7. 物联网架构成长之路(44)-Docker私有仓库Harbor

    0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...

  8. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  9. 物联网架构成长之路(29)-Jenkins环境搭建

    0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...

随机推荐

  1. 机器学习实战笔记-k-近邻算法

    机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...

  2. KenBurns特效组件KenBurnsView

    KenBurns特效组件KenBurnsView   KenBurns特效是一种静态图片展现方式.通过镜头缩放和平移的方式来展现图片,让静态图片产生动态视觉的效果.KenBurns特效可以通过KenB ...

  3. re模块、hashlib模块

    一.re模块 1.什么是正则? 正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串,正则就是用来去一个大的字符串中匹配出符合规则的子字符串 2.为何要用正则? 用户注册 ...

  4. 电脑用bat脚本给手机批量自动安装apk文件 autoInstall.bat

    ------创建这个文件autoInstall.bat 内容如下: @ECHO off @REM 将adb.exe添加到PATH中ECHO 初始化…@SET PATH=%PATH%;%CD%\Adb@ ...

  5. Scrapy基础(十一)————导出数据到json文件中

    之前介绍过将数据写入mysql数据库中,但是对于那些没有数据库的,可以通过写入json文件中或者是写入到csv或者xls:这里只介绍写入json文件中,也为再练习一下自定义的pipeline 思路: ...

  6. PowerShell一次执行多条命令

    PowerShell一次执行多条命令语句 使用CMD之后换到PS之后想一次执行多条命令会很不习惯,因为原来的&&语句连接符已经不能用了. 在各种搜索后没有发现网上有说明这个的.无奈只能 ...

  7. CY7C68013 USB接口相机开发记录 - 第二天:驱动修改

    上次写了资料的下载,并对资料进行了分类,分完类看起来就比较清晰.同时通过强大的百度,也可以得到不少资料. 这里对比较关键的几个文件进行罗列: 一.驱动相关 cyusb.inf: 修改CYUSB.INF ...

  8. python系统编程(五)

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用 1. 使用threading模块 ...

  9. 2017.08.15【NOIP提高组】模拟赛B组

    Summary 今天比赛很差很差,掉到谷底.第一题快排打错了,漏了递归,变成一个while循环.最后一题k忘记减一,答案一直是无穷大,所以没交.第三题没时间调DP就打了个递归,第二题状态想歪了.四道题 ...

  10. Android 去除应用标题栏(Android Studio)

    修改styles.xml文件 <resources> <!-- Base application theme. --> <style name="AppThem ...