Utilisation de Docker

En plus de la machine virtuelle nous allons utiliser docker pour séparer les différententes applications. Le but de ce TP est d'installer 4 conteneurs :

  1. un docker nginx en tant que proxy inverse, il assurera la répartition des requêtes http sur les différents conteneurs;
  2. deux dockers apache pour avoir un premier site web/php et de l'équilibrage de charge entre les deux.
  3. un docker mysql pour stocker les données du site web.

Création de l'instance de travail

Vous devez créer une machine virtuelle, mais cette fois sans utiliser de volume. Créez une instance :

I. Installation de docker

Vous devez installer docker sur votre VM, il y a 2 version de docker utilisable sur ubuntu : docker.io un paquet directement instalable via apt-get et docker-engine qui demande de suivre une procédure décrite ici. docker-engine contient en plus de docker les utilitaire pour faire de l'orchestration que vous utiliserez dans les TPs suivants.

Docker n'est pas encore fonctionnel dans cet environnement, car il a besoin d'accéder au réseau et il faut le configurer pour utiliser le proxy de l'université. Cette configuration n'est pas simple car elle doit modifier le service docker de la machine et dépend donc du gestionnaire de service. Elle n'est nécessaire que dans des réseaux utilisant un proxy comme celui des machines virtuelles de notre université. Elle n'est pas nécessaire si docker est installé sur une machine ayant directement accès au réseau (comme votre PC). La configuration est expliquée ici. Vous pouvez suivres bêtement les instructions suivantes (qui ne seront pas expliquées car hors du champ de ce TP).

mkdir -p /etc/systemd/system/docker.service.d
[Service]
Environment="HTTP_PROXY=http://proxy.univ-lyon1.fr:3128/"
systemctl daemon-reload
systemctl show docker
# la liste des options doit contenir un élément Environment="HTTP_PROXY=http://proxy.univ-lyon1.fr:3128/"
systemctl restart docker
docker search mysql

II. Installation d'un docker nginx

Comme pour beaucoup de serveurs connus, il existe un docker officiel qui permet l'installation de nginx très simplement. Pour cela vous allez simplement télécharger l’image et créer un docker dont le répertoire de configuration sera partagé avec l’hôte. Dans votre rapport, vous noterez chaque commande faite pour effectuer les installations et configurations.

find /var/lib/docker/ -name “toto”

Vous avez peut-être remarqué que les outils les plus courants (nano, vim, emacs …) ne font pas parti du docker nginx ce qui rend difficile la modification des fichiers dans le docker. Pour résoudre le problème, on peut :

  1. Pré-configurer le docker via le Dockerfile ou les outils de création (voir plus tard);
  2. Installer dans le docker votre éditeur préféré;
  3. Copier des fichiers entre la VM et le docker;
  4. Partager des répertoires entre la VM et le docker.

Nous allons utiliser la dernière méthode dans ce cas pour gérer les configurations de nginx qui sont dans le répertoire /etc/nginx du docker, mais pour cela il faut recréer un docker.

Si vous avez des problèmes de fonctionnement, testez :

  1. les logs du docker avec la commande docker logs nomdocker
  2. le contenu des fichiers utilisés par le docker (surtout s'il s'agit de fichier partagés car beaucoup d'erreurs sont faites durant le partage).

Vous trouverez ici une explication de l'erreur la plus courante.

Lorsque tout fonctionne, vous pouvez passer à la section suivante.

III. Installation d'un docker apache

Il existe des dockers apache tout fait, mais il sont basés sur des versions minimalistes et il est alors difficile de rajouter des modules. Vous allez donc utiliser un docker ubuntu (vivid). Pour cela vous allez utiliser une seconde façon de créer une image docker, le faire à partir d’un Dockerfile. Un Dockerfile est un fichier décrivant à partir d’une image de base la suites des actions à réaliser pour créer une nouvelle image ainsi que l’environnement dans lequel sera exécuté le conteneur. A partir du fichier Dockerfile fourni, vous allez écrire un nouveau fichier pour construire une image qui contient apache et le lance par défaut avec les modules php-pear , php5-ldap, php-auth, php5-mysql et php5-common.

<?php
phpinfo();
?>

IV. Utilisation du réseau

<hi #99d9ea>Vous devez rendre un rapport expliquant votre travail durant ce TP avant mardi 1/11/16 23h42 UTC. Pour chaque questions, votre rapport doit mentionner les commandes utilisées pour faire les configurations, les fichiers modifiés et les résultats obtenus. </hi>

Comme vous l'avez vu, il est possible d'utiliser les adresses IP attribuées par le service docker pour configurer les liaisons entre ces derniers, mais ces adresses peuvent changer. Cela peut poser des problèmes par exemple lorsque vous devez réutiliser un docker préparé dans un certains contexte. Pour simplifier la gestion, il est possible de choisir les adresses IP des dockers, de choisir la valeur de leurs variables d'environnement ou de paramétrer leur fichier /etc/hosts.

Ces 2 dockers doivent partager le volume /var/www/html/ sur le repertoire /docker/apache/html de l'hôte.

V. Comment travailler depuis chez vous ?

Cette série de questions n'a pas vraiment de rapport avec le TP mais vous donnera les bases pour travailler vos TPs depuis chez vous. Pour être en conditions réelles, si vous en avez la possibilité (et pour cette série uniquement) utilisez un partage de connexion de votre téléphone.

Pour travailler vous devez pouvoir :

  1. contacter une page web interne comme http://cloud-info.univ-lyon1.fr;
  2. vous connecter sur des machines distantes pour exécuter des programmes;
  3. vous connecter à des serveurs distants protégés par le firewall de l'université (oracle, serveur ssh des VM, …).

Utilisation du "vpn" proposé aux étudiants

Ce n'est pas vraiment un vpn, mais un simple site avec des applications en javascript pour faire des connexions de base. Je ne pense pas qu'il permettra de tout faire, mais il vaut mieux le connaître. Il est à l'adresse https://vpn.univ-lyon1.fr/. * utilisez-le pour ouvrir le site web de votre VM. * utilisez le pour ouvrir une session ssh sur votre VM. Cette partie supposait que le VPN des étudiants contient des services utiles, ce qui ne semble pas le cas.

Utilisation d'un tunnel ssh

Tous ce que vous voulez faire peut être fait grâce à des tunnels ssh. C'est donc une technique à maitriser même si ce n'est pas la plus pratique. Voir ici une explication de ce qu'est un tunnel et comment ils se mettent en place (voir aussi ). Pour vous connectez de l'extérieur, vous pouvez utiliser la machine linux linuxetu.univ-lyon1.fr qui est une simple passerelle.

Cela ne permet pas d'aller sur des pages web facilement, mais vous pouvez utiliser un proxy en plus d'un tunnel pour naviguer sur internet en passant par le réseau de l'université.

<hi #ed1c24>Attention</hi>, il faut penser à supprimer la configuration du proxy lorsque vous supprimer le tunnel ou que vous changer de réseau. Sinon, votre navigateur ne fonctionne plus.

[Si vous êtes en avance] Utilisation d'un tunnel dynamique et d'un proxyfieur

La méthode précédente permet de faire a peut près tous, mais elle est parfois laborieuse. En effet, il faut un tunnel par application et il faut modifier les configurations des logiciels clients. L'utilisation du proxy est plus souple, mais elle est limitée aux protocoles du web car en général les proxy ne laissent passer que ce type de flux. Ssh permet aussi de mettre en place des tunnels dynamiques socks5 c'est à dire un proxy au niveau de la connexion TCP. Grâce à ce type de tunnels on peut utiliser la connexion ssh pour transporter n'importe quoi. Pour que cela fonctionne, il faut que le logiciel client soit capable de faire l'opération de discussion avec le proxy socks. C'est pour cela qu'on a besoin d'un proxyfieur c'est à dire un logiciel qui permet de transformer n'importe quelle application en client d'un proxy socks. Ici nous allons utiliser proxychains4

# defaults set to "tor"
socks4         127.0.0.1 9050
  par le point d'entrée d'un tunnel dynamique ssh (ici j'utilise 9022 ce qui est totalement arbitraire).
  
socks5  127.0.0.1 9022 
ssh -D 9022 p???????@linuxetu.univ-lyon1.fr

A partir de ce moment, une application lancée précédée de la commande proxychains4 utilise le proxy. Les autres ne l'utilisent pas. Par exemple :

> proxychains4 scp toto.gz ubuntu@192.168.246.87: 
# copie le fichier local toto.gz sur le compte ubuntu du serveur 192.168.246.87 accessible
# depuis linuxetu (c'est sans doute une VM) elle passe par le tunnel et fonctionne depuis n'importe quel endroit.
> scp toto.gz ubuntu@192.168.246.87:
# copie le même fichier sur le compte ubuntu du serveur 192.168.246.87 accessible
# depuis la machine où vous travaillez (ce qui ne fonctionnera sans doute pas chez vous).

VI. Equilibrage de charge

Nous allons configurer nginx pour répartir des requêtes sur les 2 dockers apache. La documentation de l'équilibrage de charge de nginx est ici

<?php
echo "<pre>".print_r($_SERVER, true)."</pre>";
?>

Dans votre rapport vous joindrez le fichier nginx:/etc/nginx/conf.d/default.conf et nginx:/etc/nginx/nginx.conf

VII. Installation d'une application

Vous devez installer une petite application tiny. C'est un mini framework en php. Il utilise une base de donnée mysql (que vous mettrez, bien sûr, dans un docker à part).

mysql -u root -p -h adr_ip_de_mysql < nom_du_fichier_script.sql 

Le site doit être [un peu] plus joli, et surtout les urls doivent fonctionner. Testez l'application song en ajoutant une chanson. Cela doit fonctionner malgré l'équilibrage de charge.

1)
il y a un exemple de fonctionnement de sed dans le Dockerfile, il faut modifier la ligne #ServerName .* dans le fichier /etc/apache2/sites-enabled/000-default.conf
2)
pour tester un site web avec telnet, il faut taper la commande telnet adresse_du_site 80 puis une fois la connexion étable taper GET /
3)
comme vous pouvez le voir au début du fichier tiny/application/config/config.php