=====I. Docker Machine ===== [[https://docs.docker.com/machine/overview/|Docker machine]] est un script qui permet de générer des machines virtuelles et d'installer docker automatiquement. Il est capable d'utiliser plusieurs hyperviseurs comme //virtutalbox// ou //openstack// mais aussi les fournisseurs de cloud publiques : AWS, Azure ... Vous avez une documentation plus spécifique à [[https://docs.docker.com/machine/drivers/openstack/|openstack ici]] Certaines requêtes de docker machine utilisent //un port inhabituel qui est filtré sur le réseau wifi//. Pour créer des machine sur la plateforme openstack de l'université, vous devez donc utiliser docker machine depuis une machine de l'université (une autre machine virtuelle ou le serveur d'accès ssh((une autre méthode existe utilisant un tunnel dynamique et un proxyfieur mais vous ne l'avez pas vu)). Pour installer la commande ''docker-machine'' même sans être administrateur, vous pouvez taper : curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > docker-machine \ && chmod +x ./docker-machine La commande docker-machine est assez simple car elle signale la plupart des options qui lui manque. La commande de création est [[https://docs.docker.com/machine/reference/create/|documentée ici]], les [[https://docs.docker.com/machine/drivers/openstack/|options relatives à //openstack// là]]. Vous devez savoir que : - le driver est ''openstack'' - l'url d'authentification est ''https://cloud-info.univ-lyon1.fr:5000/v3/'' - le nom d'utilisateur et le mot de passe sont ceux qui vous permettent de vous connecter - le //tenant// est le projet //openstack// où créer les machines. Il y a un bug et l'option ''openstack-tenant-name'' ne fonctionne pas. Il faut donner son identifiant avec l'option ''openstack-tenant-id''. La valeur de l'ID peut être trouvée sur la platforme (onglet identité->projet), celle du projet IGA est ''9a72db7c70fb46b494ae9da59c21590f'' - le nom de l'image à utiliser est celui d'une VM par défaut (car docker-machine s'occupera des configurations) : ''Ubuntu 16.04.3 LTS Xenial'' - **Attention** il faut bien spécifier les options de proxy via l'option //engine-env// qui permet de spécifier une variable d'environnement((donnez une valeur pour ''HTTP_PROXY'' et ''HTTPS_PROXY'')). Cela permettra de configurer le docker installé pour l'utilisation du proxy de l'université et s'utilise de cette manière : docker-machine ... \ --engine-env HTTP_PROXY="http://adresse_de_votre_proxy:port" \ --engine-env HTTPS_PROXY="http://adresse_de_votre_proxy:port" \ ... NOMDELAMACHINE //docker-machine// sauvegarde ses informations dans le répertoire ''~/.docker/machine/''. Si à un moment vous avez tenté de créer une machine et que cela n'a pas fonctionner, il faut effacer la machine et ses informations avec ''docker-machine rm -f NOMDELAMACHINE''. * QI.1) En utilisant docker-machine, créez 2 machines qui serviront de nœuds de travail pour //swarm//. Appelez-les VOTRENOM-master, VOTRENOM-slave. Vous pouvez ensuite voir les nœuds gérés par docker-machine via la commande ''docker-machine ls'', en supprimer une par ''docker-machine rm'' ... Pour exécuter des commandes docker sur ces machines il y a 3 méthodes : - Vous pouvez utiliser les variables d'environnement docker fixées par la commande ''docker-machine env NOMMACHINE''. Dans note TP c'est impossible car le logiciel //docker// n'est pas installé sur les ordinateurs de l'université. - Vous pouvez vous connecter sur les machines via la commande ''docker-machine ssh NOMMACHINE'' - Vous pouvez exécuter les commandes à distance via la commande ''docker-machine ssh NOMMACHINE COMMANDE''. Par exemple docker-machine ssh NOMMACHINE sudo docker ps * QI.2) Initialiser un cluster //swarm// dont le manager est votre machine principale et le nœud de travail est la machine slave. ===== Création d'un registry privé ===== Vous avez vu lors du TP précédant que le cluster swarm pouvait facilement lancer des dockers basés sur des images publiques. Mais pour le moment vous ne pouvez pas le faire avec des images construites via un //dockerfile//. Pour éviter cette limite, il faut installer un dépôt docker privé dans lequel vous placerez et téléchargez les images que vous avez généré. Vous trouverez la [[https://docs.docker.com/registry/|documentation ici]] Attention, les //registry// que vous pouvez facilement utiliser sont des //registry// locaux c'est à dire que leur adresse est ''localhost''. En effet, pour autoriser un //registry// distant, il faut gérer des certificats d'authentification SSL ce qui est hors du cadre du cours. Vous allez donc créer un unique docker registry qui répond à l'adresse ''localhost:5000'' sur plusieurs machines virtuelle. Cela n'est possible que grâce au cluster swarm qui va s'occuper pour vous de la redirection des paquets. * Dans le cluster //swarm//, créer un service ''registry'' qui partage le port 5000 avec toutes les machines du cluster. * Sur quel nœud ce dernier est-il instancié ? * testez sa réponse à l'adresse localhost sur les 2 machines virtuelles. =====Utilisation d'une image configurée===== Vous pouvez construire une image personnelle, par exemple le docker/php via ce {{ :cloud:2017:dockerphp.zip |Dockerfile}}. Pour l'utiliser via un service swarm vous devez : * construire l'image //normalement// * la "tagguer" correctement comme expliqué [[https://docs.docker.com/registry/#basic-commands|ici]] (le nom du tag doit commencer par celui du registry c'est à dire ''localhost:5000/'' * l'envoyer dans le //registry// Vous pouvez ensuite : * lancer un service //swarm// basé sur cette image avec 3 réplicats; * tester qu'il est bien instancié sur plusieurs machines différentes; * tester qu'il répond avec une répartition de charge. ===== Création d'un fichier de déploiement ===== Pour automatiser vos déploiement, il est plus pratique d'utiliser un fichier yaml pour décrire votre application. Comme pour le premier TP avec docker-compose, vous allez maintenant utiliser docker stack. Vous devez supprimer votre précédent service avec ''docker service rm''. Ecrivez votre fichier yaml pour lancer votre image ''localhost:5000/VOTRETAG'' avec 2 replicas. Lancez le stack avec la commande docker stack up -c //votre fichier// Lors de la mise en place d'application, il y a de nombreuses données sensibles comme les certificats ou les mots de passe. Pour ne pas les mettre en clair dans vos fichiers, docker propose la fonction //secret//. Maintenant, vous allez créer un secret avec la commande ''docker secret''. Puis modifier votre fichier yaml afin de lui indiquer qu'il peut accéder à ce secret //externe//. Quand vous avez fini vous pouvez modifier le fichier afin d'afficher votre secret : echo "mon secret :" . file_get_contents("/var/run/secrets/''nom de votre secret''","r"); Ne pas oublier de rebuild votre image et de recréer votre stack.