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

Vus : 1031
Publié par Littlewing : 368