Docker compose
Me voilà avec mes images docker réalisées. Maintenant, il faut les lier entre elles et packager le tout.
J’ai choisi d’utiliser docker-compose. c’est l’outil standard fourni par docker. Sa principale lacune est que cet outil ne s’exécute que localement. En gros, on ne pourra pas utiliser docker-compose pour exécuter de manière distribuée les différents containers (ex. la base de données sur un nœud, le serveur web sur un autre,…). Pour mon POC je n’ai pas trop besoin de ça et, il faut le dire, j’ai un peu la flemme d’installer des softs comme kubernetes.
Je ne décrirai pas l’installation. C’est beaucoup mieux fait ici.
Je mettrai prochainement le code sur github. Je pense que le code sera mis à jour ultérieurement. Il se peut donc que certains exemples de cet articles soient obsolètes.
Définition des différents composants
J’ai trois composants :
- une instance rabbitmq qui réceptionne des messages via le protocole MQTT
- elasticsearch qui stocke les différents évènements et les mets à disposition
- un programme s’appuyant sur spark-streaming qui se connecte à rabbitmq , transforme les évènements réceptionnés et les envoient dans elasticsearch.
La spécification des différents composants se fait par un fichier docker-compose.yml qui est dans le répertoire racine.
Je spécifie les images que je souhaite construire, les ports exposés et les variables d’environnement
Le fichier docker-compose.yml
elasticsearch: build: ./elasticsearch-marvel ports: - "9200:9200" - "9300:9300" environment: HOSTNAME: 127.0.0.1 rabbitmq: build: ./rabbitmq-mqtt ports: - "1883:1883" - "15672:15672" - "5672:5672" iot-etl: build: ./iot-etl
elasticsearch
J’ai surchargé l’image officielle d’elasticsearch en ajoutant un fichier de configuration personnalisé et en installant le plugin shield et marvel. Voici le dockerfile:
FROM elasticsearch:1.7 EXPOSE 9200 9300 ADD install_plugins /usr/share/elasticsearch/setup RUN ls -al /usr/share/elasticsearch/setup/license.zip RUN /usr/share/elasticsearch/bin/plugin install file:///usr/share/elasticsearch/setup/license.zip RUN /usr/share/elasticsearch/bin/plugin install file:///usr/share/elasticsearch/setup/marvel-agent.zip ADD config/elasticsearch.yml /usr/share/elasticsearch/config/
Rabbitmq
Ici j’ai souhaité ajouter deux utilisateurs au démarrage du container
FROM rabbitmq:3-management ENV RABBITMQ_DEFAULT_USER user ENV RABBITMQ_DEFAULT_PASS password EXPOSE 1883 # activation mqtt RUN rabbitmq-plugins enable rabbitmq_mqtt # Add script to create default users / vhosts ADD init.sh /init.sh # Set correct executable permissions RUN chmod +x /init.sh CMD ["/init.sh"]
La configuration se fait dans le fichier init.sh
#!/bin/sh ( sleep 10 ; \\ rabbitmqctl add_user guest ; \\ rabbitmqctl add_user user password ; \\ rabbitmqctl clear_password guest ;\\ rabbitmqctl set_user_tags guest administrator ; \\ rabbitmqctl set_user_tags user administrator ; \\ rabbitmqctl set_permissions -p / guest ".*" ".*" ".*" ; \\ rabbitmqctl set_permissions -p / user ".*" ".*" ".*" ; \\ rabbitmqctl list_permissions -p / ) & rabbitmq-server $@
Spark
Enfin mon code scala qui exécute SPARK est packagé sous qui la forme d’un JAR qui contient toutes les dépendances.
Le dockerfile correspondant
FROM java:openjdk-8-jdk RUN wget -cqO /tmp/iot-etl-allinone.jar http://URL/iot-etl-1.0-20151127.123518-6-allinone.jar?utm_source=rss&utm_medium=rss CMD ["java","-jar","/tmp/iot-etl-allinone.jar"]
Je ne décrirai pas le code ici. Peut-être dans un futur article.
Construction
docker-compose build
Exécution
docker-compose up