[tuto] Docker jeedom/mariadb reseau macvlan

Tags: #<Tag:0x00007fc8d6509bb8>

Bonjour,

Pour ceux qui tombent sur ce post pour essayer de configurer docker/jeedom (comme moi) et qui sont obligés d’utiliser le network_mode host de docker (pour acces au multicast de xiaomihome par exemple) , il y a une autre solution à explorer (qui marche pour moi): C’est d’utiliser le réseau macvlan de docker.

Pour ma part, j’utilise une gateway xiaomi et il faut que le plugin xiaomihome accède au multicast envoyé par cette gateway.
En créant le serveur jeedom dans un réseau macvlan (subnet identique au host docker), le serveur docker et plus particulièrement le plugin xiaomihome recoit enfin le multicast! (vérifié via tcpdump)

Il y a des effets de bord:

Mais tt fonctionne pour moi:
Ma config
Host docker: ubuntu 18.04 (docker 19.03)
Container: (jeedom:master, debian 9) + mariadb:latest

Sur demande docker-compose et Dockerfile
Il me reste encore à consolider le redémarrage des demons xiamihome/zwave apres relance des container.

Christophe.

C’est parti pour la petite explication :nerd_face:

[tuto] Monter un docker jeedom composé d’un container jeedom et d’une base de donnée mariadb dans un reseau macvlan

Utilisation d’un network macvlan: Pour faire simple, cela simule des containers sur ton reseau local…même subnet.

Avantage: :heart_eyes:

  • Jeedom pourra récupérer le multicast envoyé par la gateway xiaomi! comme dans le mode host.
    Moi je ne voulais pas utiliser host car non portable sous windows…
  • je vois tous mes containers comme s’ils étaient sur mon réseau local, même ma box.

Inconvénient: :rage:

  • Je viens de lire qu’il n’est pas supporté non plus sur windows comme le mode host. :cry:
    Du coup, je ne pourrai pas non plus migrer mon hote linux sous windows si nécessaire…je suis condamné avec mon linux now :smiling_face_with_three_hearts:…ou repasser sous hyper-v… :thinking:
  • j’ai mis la db dans le même réseau local, pas top/secu. Un mode bridge pour vos infras backend est une meilleur/autre solution (avec une patte du container web dans celui-ci)

Network

Ca donne ca au final:
Internet --> box (192.168.1.1) --> hote docker (192.168.1.A)
avec 2 containers docker
(web) 192.168.1.B
(db) 192.168.1.C

Résumé:

j’ai utilisé docker-compose pour monter les 2 containers
J’ai 2 Dockerfile pour chaque container, quasi vide mais qui pourrait évoluer pour prendre en compte certaine chose si je dois tt réinstaller et pas refaire certaines étapes manuellement)

Je ne rentrerai pas ds le détail de l’arborescence ou des commandes docker, docker-compose, etc. Il y a plein de site pour découvrir/apprendre.:nerd_face:

Création du reseau macvlan

Avant de créer les containers, il faut créer le réseau macvlan (j’ai utilisé ip-range pour limiter docker a l’utilisation de ce range, pour ne pas interférer avec tout mes autres équipements derrière ma box sur le même subnet.

docker network create -d macvlan \ 
 --subnet=192.168.1.0/24 \
 --gateway=192.168.1.1 \
 --ip-range=192.168.1.X/27 \
 -o parent=br2 local_net`

Pour vérifier:
docker network ls
docker network --help

Création des containers

Je vous donne mes fichiers et je vous laisse les adapter à votre convenance.

particularité:

le devices c’est ma clé zwave
ROOT_PASSWORD c’est le mdp admin ds l’interface (je crois :thinking:)
Dans le Dockerfile, les packages en plus sont pour passer en https (qu’il faudra activer manuellement, mais j’ai vu qu’il existait un plugin jeedom pour les feignasses, a vous de voir :grin:) et avoir des commandes réseaux pour debug
Si vous vous posez des questions pour d’autres trucs, il faudra aller sur la très bonne doc de docker :face_with_monocle:

docker-compose.yml

version: '3.7'

services:

  web:
    build:
      context: ./web
    image: jeedom/web:1
    restart: always
    privileged: true
    devices:
      - "/dev/ttyACM0:/dev/ttyACM0"
    volumes:
       - /mon_chemin_sur_mon_hote/web/html:/var/www/html
    networks:
      local_net:
        ipv4_address: 192.168.1.B
    environment:
      ROOT_PASSWORD: my_precious
    depends_on:
      - db

  db:
    build:
      context: ./db
    image: jeedom/db:1
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my_precious_too
    networks:
      local_net:
        ipv4_address: 192.168.1.C

networks:
  local_net:
    external: true

Dockerfile (web)

FROM	jeedom/jeedom:master

RUN apt-get update -qy && \
    apt-get install -y \
    net-tools tcpdump certbot python-certbot-apache && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    rm /etc/localtime && \
    ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime

VOLUME /var/www/html

Dockefile (db)

FROM	mariadb:latest

Reste à faire

Dans l’ordre ou presque:

  • Se connecter a l’interface jeedom
    http://192.168.1.B
  • installer vos plugins
  • relancer les dependances
  • restaurer votre config jeedom de votre ancien serveur (a verifier si l’installation des plugins n’est pas superflu dans ce cas): votre de masse jeedom sera celui de votre ancien serveur ensuite :wink:
  • passer en https via cerbot ou le plugin jeedom
  • Sous mariadb: creer un compte jeedom et modifier le mot de passe root mysql
    il est ici /var/www/web/html/core/config/common.config.php
  • Tester vos scenarios, tous les plugins, etc, regarder les logs, etc.
  • Qd vous pensez que tt est ok. Et bien arrêtez et relancez les containers…vous aurez droit à des surprises…comme moi, après qq arrêt/relance et ajustement et qq heures, vous pourrez dire que la conf semble correct et que vous avez migré sous docker. Là, il faudra penser à sauvegarder vos containers via docker commit et/ou docker docker save. J’ai prévu de me faire un script shell ou python que je mettrai sous cron à base des commandes backup plus bas.

Qq commandes docker

Parce que je ne suis pas si méchant :innocent:

  • Lister les docker qui tournent (ou pas)
docker ps
docker ps -a
  • Arrêt/relance
docker-compose up
docker start|stop
  • On supprime tt et on recommence…again and again…
docker stop jeedom_web_1 jeedom_db_1
docker rm jeedom_web_1 jeedom_db_1
rm -rf  /mon_chemin_sur_mon_hote/web/html
docker-compose up --build
  • Démarrage d’un container docker adminer (equivalent de phpmyadmin)
    docker run -d --network local_net --name adminer adminer
    accessible par http://192.168.1.D:8080
    je vous laisse trouver son ip via: docker network inspect adminer

  • Se connecter au container web debian et faire les operations hors console jeedom
    docker exec -ti <container_name> bash

  • Backup

    • sauvegarde d’un container
      docker commit -p <id> <backup_container_name>
      on le retrouve via docker images (qq part sur votre hote docker dans /var/lib/docker)
    • Sauvegade sous format tar ou tgz:
      docker save -o <backup_container_name>.tar <backup_container_name>
      docker save <backup_container_name> | gzip - > <backup_container_name>.tgz

@lunarok
A voir s’il ne faut pas mettre à jour la doc du plugins xiaomihome pour dire que le mode macvlan est également compatible comme le mode host.

Bonjour,
Ton tutoriel parle d’une installation en Docker pure et dur ?
Moi j’utilise le Paquet Docker sur Synology
J’ai un conteneur Jeedom
Comment cela se passe t’il pour une utilisation avec le paquet Docker de Synology ?