0. 前言php
如今項目處於初級階段,按照規劃,先構建幾個之後可能會用到的Image,並上傳到阿里雲的Docker倉庫。之後博客中用到的Image,大部分都會用到這幾個基礎的Image,構建一個簡單的物聯網架構。好了,廢話不說,開始咯。html
1. 構建STUNServer服務git
STUN服務,是一個標準的服務,用戶判斷當前外網IP,主要用於NAT判斷。我使用的是 https://github.com/jselbie/stunserver 這個開源的STUN服務,直接 git clone 下來,執行docker build 進行構建便可,自帶有Dockerfile文件。我構建的時候,發生構建失敗,因此把apt源改成阿里源。github
1 FROM ubuntu:latest 2 3 EXPOSE 3478/tcp 3478/udp 4 5 USER root 6 7 RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list 8 RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list 9 10 RUN set -ex && \ 11 apt-get update && \ 12 apt-get install -y build-essential && \ 13 apt-get install -y libboost-all-dev && \ 14 apt-get install -y libssl-dev && \ 15 apt-get install -y g++ && \ 16 apt-get install -y make && \ 17 apt-get install -y git && \ 18 apt-get clean -y && \ 19 rm -rf /var/lib/apt/lists/* 20 21 RUN cd /opt && git clone https://github.com/jselbie/stunserver.git && cd stunserver && make 22 23 WORKDIR /opt/stunserver 24 25 HEALTHCHECK CMD /opt/stunserver/stunclient localhost 26 27 ENTRYPOINT ["/opt/stunserver/stunserver"]
經過如下工具,能夠測試STUN服務是否正常
這裏我只測試局域網的,外網也是能夠的,我之前測試過。web
爲了測試效果,我把鏡像放到阿里雲ECS主機上測試,利用以前提到的,把打包好的Image上傳到阿里Docker倉庫,而後在ECS主機上pull後運行。redis
docker run -d -p 3478:3478/udp stunserver:1.2.13
阿里雲ECS自定義IP及多IP綁定,這裏略,之後實際用到的,再開一篇博客說明。mongodb
能夠用這個在線工具測試STUN服務 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/docker
因爲如今個人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鏡像express
能夠直接使用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功能
1 version: '3' 2 services: 3 redis: 4 image: redis:5.0.1 5 ports: 6 - 6319:6379 7 8 redis-admin: 9 image: erikdubbelboer/phpredisadmin 10 environment: 11 - ADMIN_USER=admin 12 - ADMIN_PASS=admin 13 - REDIS_1_HOST=redis 14 - REDIS_1_PORT=6379 15 - REDIS_2_HOST=redis 16 - REDIS_2_PORT=6379 17 ports: 18 - 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
1 version: '3.1' 2 3 services: 4 mongo: 5 image: mongo 6 restart: always 7 volumes: 8 - "/root/workspace/docker/mongo/data/:/data/db/" 9 ports: 10 - 27017:27017 11 12 mongo-express: 13 image: mongo-express 14 restart: always 15 ports: 16 - 8081:8081
Mongo-express
1 ... 2 environment: 3 - ME_CONFIG_MONGODB_SERVER=mongo 4 - ME_CONFIG_MONGODB_PORT=27017 5 - ME_CONFIG_MONGODB_ENABLE_ADMIN=false 6 - ME_CONFIG_MONGODB_AUTH_DATABASE=admin 7 - ME_CONFIG_MONGODB_AUTH_USERNAME=${MONGO_ROOT_USER} 8 - ME_CONFIG_MONGODB_AUTH_PASSWORD=${MONGO_ROOT_PASSWORD} 9 - ME_CONFIG_BASICAUTH_USERNAME=${MONGOEXPRESS_LOGIN} 10 - 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裏。
1 version: '3.1' 2 services: 3 mongo: 4 image: mongo 5 restart: always 6 volumes: 7 - "/root/workspace/docker/mongo/data/:/data/db/" 8 ports: 9 - 27017:27017 10 11 mongo-express: 12 image: mongo-express 13 restart: always 14 ports: 15 - 8081:8081 16 17 emqttd: 18 image: emqttd:2.3.11 19 restart: always 20 ports: 21 - 18083:18083 22 - 1883:1883 23 - 8083:8083 24 environment: 25 - EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard" #開啓Mongo認證插件 26 - EMQ_AUTH__MONGO__SERVER=mongo:27017 #鏈接Mongo 27 - EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain #密碼使用明文 28 - 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
1 { 2 "_id": ObjectID("5bebca74e99b2600089499b2"), 3 "username": "admin", 4 "password": "admin", 5 "is_superuser": true, 6 "created": "2018-01-01" 7 }
EMQ 基於docker-compose 集羣配置
1 version: '3' 2 services: 3 emq1.wunaozai.com: 4 image: emqttd:latest 5 ports: 6 - 18083:18083 7 - 8083:8083 8 environment: 9 - EMQ_NAME=emq 10 - EMQ_HOST=emq1.wunaozai.com 11 12 emq2.wunaozai.com: 13 image: emqttd:latest 14 ports: 15 - 8084:8083 16 environment: 17 - EMQ_NAME=emq 18 - EMQ_HOST=emq2.wunaozai.com 19 - EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com 20 21 emq3.wunaozai.com: 22 image: emqttd:latest 23 ports: 24 - 8085:8083 25 environment: 26 - EMQ_NAME=emq 27 - EMQ_HOST=emq3.wunaozai.com 28 - EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com 29 30 emq4.wunaozai.com: 31 image: emqttd:latest 32 ports: 33 - 8086:8083 34 environment: 35 - EMQ_NAME=emq 36 - EMQ_HOST=emq4.wunaozai.com 37 - EMQ_JOIN_CLUSTER=emq@emq1.wunaozai.com
關於EMQ Dashboard的操做及預覽這裏略,若是不清楚的,能夠參考我以前的博客。
5. 構建docker-compose.yml
基於以上全部Image,將全部Image上傳至阿里雲Repo。並提供一份完整的docker-compose.yml文件
1 version: '3' 2 services: 3 4 stunserver: 5 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/stunserver:1.2.13 6 restart: always 7 ports: 8 - 3478:3478/tcp 9 - 3478:3478/udp 10 11 mongo: 12 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/mongo:4.0.4 13 restart: always 14 volumes: 15 - "/root/workspace/docker/project/data/mongo/:/data/db/" 16 ports: 17 - 27017:27017 18 mongo-express: 19 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/mongo-express:0.49.0 20 restart: always 21 ports: 22 - 27018:8081 23 24 redis: 25 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/redis:5.0.1 26 restart: always 27 volumes: 28 - "/root/workspace/docker/project/data/redis/:/data" 29 ports: 30 - 6379:6379 31 redis-admin: 32 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/redis-admin:1.11.0 33 restart: always 34 ports: 35 - 6380:80 36 environment: 37 - ADMIN_USER=admin 38 - ADMIN_PASS=wunaozai 39 - REDIS_1_HOST=redis 40 - REDIS_1_PORT=6379 41 42 mqtt-01.wunaozai.com: 43 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/emqttd:2.3.11 44 ports: 45 - 18083:18083 46 - 10001:8083 47 - 10011:1883 48 environment: 49 - EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard" 50 - EMQ_AUTH__MONGO__SERVER=mongo:27017 51 - EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain 52 - EMQ_MQTT_ALLOW_ANONYMOUS=false 53 - EMQ_ADMIN_PASSWORD=wunaozai 54 - EMQ_NAME=mqtt 55 - EMQ_HOST=mqtt-01.wunaozai.com 56 - EMQ_JOIN_CLUSTER=mqtt@mqtt-02.wunaozai.com 57 mqtt-02.wunaozai.com: 58 image: registry.cn-shenzhen.aliyuncs.com/wunaozai/emqttd:2.3.11 59 ports: 60 - 10002:8083 61 - 10012:1883 62 environment: 63 - EMQ_LOADED_PLUGINS="emq_auth_mongo emq_modules emq_dashboard" 64 - EMQ_AUTH__MONGO__SERVER=mongo:27017 65 - EMQ_AUTH__MONGO__AUTH_QUERY__PASSWORD_HASH=plain 66 - EMQ_MQTT_ALLOW_ANONYMOUS=false 67 - EMQ_ADMIN_PASSWORD=wunaozai 68 - EMQ_NAME=mqtt 69 - EMQ_HOST=mqtt-02.wunaozai.com 70 - 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