物聯網架構成長之路(25)-Docker構建項目用到的鏡像1


0. 前言

  現在項目處於初級階段,按照規划,先構建幾個以后可能會用到的Image,並上傳到阿里雲的Docker倉庫。以后博客中用到的Image,大部分都會用到這幾個基礎的Image,構建一個簡單的物聯網架構。好了,廢話不說,開始咯。

1. 構建STUNServer服務

  STUN服務,是一個標准的服務,用戶判斷當前外網IP,主要用於NAT判斷。我使用的是 https://github.com/jselbie/stunserver 這個開源的STUN服務,直接 git clone 下來,執行docker build 進行構建即可,自帶有Dockerfile文件。我構建的時候,發生構建失敗,所以把apt源改為阿里源。

 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服務是否正常

  這里我只測試局域網的,外網也是可以的,我以前測試過。

  為了測試效果,我把鏡像放到阿里雲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功能

 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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM