telnet
, il faut taper la commande telnet adresse_du_site 80
puis une fois la connexion étable taper GET /
En plus de la machine virtuelle nous allons utiliser docker pour séparer les différentes applications. Le but de ce TP est d'installer 4 conteneurs :
nginx
en tant que proxy inverse, il assurera la répartition des requêtes http sur les différents conteneurs;apache
pour avoir un premier site web/php et de l'équilibrage de charge entre les deux.Ce TP doit être rendu en 2 partie. nous utiliserons des scripts pour tester le fonctionnement attendu de vos machines. Il faut donc bien renseigner votre binôme, l'adresse de votre VM et les clefs utilisées dans tomuss. Un TP qu'on ne peut pas attribuer sera synonyme de la note 0 dans une UE où les TP forment la moitié de la note finale.
Pour le dimanche 19/11/217 au soir, vous devez :
Pour le dimanche 10/12/17 au soir vous devez :
Vous devez détruire vos VM crées la dernière fois (sauf cas particuliers). L'utilisation de snapshot pose problème dans la plateforme, il est donc nécessaire d'opérer cette destruction pour revenir à des machines propres. À partir de maintenant, merci de ne pas faire de snapshot de vos machines, normalement, vous conservez dans vos rapports les commandes nécessaires au bon fonctionnement du TP.
Pour créer la machine, utiliser le snapshot snap-docker-ready
qui est une machine avec docker pré-installé et configuré.
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.
nginx
, (commande docker search
) vous verrez qu'ils sont classés par défaut grâce à un système de recommandation via des étoiles. Dockerfile
…docker pull …
)test
, dont le hostname est test
et faites en sorte que la machine virtuelle renvoie le port 80 et le port 443 sur ce docker (commandes docker run -d …
ou docker create
puis docker start
)docker exec -it …
) et créer un fichier à la racine /toto
à la racine du docker contenant coucou
.docker inspect …
notamment la partie Data
. Que représentent les répertoires MergedDir
et UpperDir
et LowerDir
?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 :
Dockerfile
ou les outils de création (voir plus tard);
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.
/etc/nginx
du docker test
dans le répertoire /docker/nginx/config
de la VM (commande docker cp …
)test
(commande docker rm …
)nginx
, le hostname est nginx
, qui partage les mêmes ports que le précédent et dont le répertoire /etc/nginx
correspond au répertoire ./docker/nginx/config/
de la VM. Attention le contenu précédent du répertoire du docker test
doit exactement remplacé le contenu du répertoire /etc/nginx
du nouveau docker. Cela dépend de la manière dont vous l'avez copier. La commande à taper n'est donc pas forcement identique à celle de votre voisin./docker/nginx/config/nginx.conf
), relancer le docker (docker restart …
), afficher les logs dynamiquement (commande docker logs -f nginx
) et générer un log en utilisant le navigateur pour demander une page inexistante.Si vous avez des problèmes de fonctionnement, testez :
docker logs nomdocker
Vous trouverez ici une explication de l'erreur la plus courante.
<hi #ff7f27> Lorsque tout fonctionne, vous pouvez passer à la section suivante.</hi>
Le but ici est de voir comment créer une image docker personnalisée via la construction d'image : docker build …
.
Apache est le plus populaire des serveur de site web. Il est souvent associé à php et vous allez devoir créer une image contenant ces deux modules et capable de dialoguer avec une base de données. Il existe des dockers apache prêts à l'emploi, mais il sont(site web) basés sur des versions minimalistes et il est alors difficilede rajouter des modules. Vous allez donc utiliser un docker basé sur une distribution standard : ubuntu (xenial). Et modifier l'image via l'utilisation 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
, php-ldap
, php-auth
, php-mysql
, php-common
, libapache2-mod-php
.
Dockerfile
/var/www/html/
est partagé avec l’hôte /docker/apache/html/
. Ne faites pas de partage de port.docker inspect …
')telnet
1). Les clients évolués comme wget ou curl peuvent ne pas être valident car ils utilisent automatiquement les serveurs proxy définis par le système./site
soit envoyé sur le serveur apache en utilisant le proxy_pass
du serveur nginx et l'adresse IP du docker apache. Vous trouverez ici une documentation sur la configuration de nginx en tant que reverse proxy.<?php phpinfo(); ?>
phpinfo
affiche entre autre les variables du serveur (tableau $_SERVER
). Quel est l'adresse du serveur ? Le chemin utilisé ? L'adresse du client ?
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
.
docker network create …
. Attention, il faut utiliser l'option subnet
pour définir le réseau. Créer un réseau de nom interne
et utilisant le reseau 172.18.100.0/24.interne
(option network
ou net
selon la version de docker) et en attribuant 2 adresses (option ip
) :
Ces 2 dockers doivent partager le volume /var/www/html/
sur le repertoire /docker/apache/html
de l'hôte. Vous devez remplacer le nom des docker par celui des membre du binome.
add-host
).docker network connect …
).docker inspect
). La VM peut-elle contacter ces dockers ? Une autre VM le peut-elle ? nginx
pour envoyer les requêtes destinées à /site1
vers le premier docker et celle destinées à /site2
vers le second docker.
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
nginx:/etc/nginx/conf.d/default.conf
et nginx:/etc/nginx/nginx.conf
) renvoyez les requêtes vers la racine du site /
sur les deux dockers apache1 et apache2 en alternant le serveur effectivement contacté. <hi #ed1c24>Attention</hi>, la partie upstream
doit allez dans le fichier nginx.conf
, la partie location
dans default.conf
. test.php
contenant :<?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
Avant de partir, ne laisser fonctionner que 3 docker : le docker nginx et les 2 dockers apache. Sans cela les scripts pourraient avoir des problèmes à reconnaitre ces derniers. Bien sur, faites attention à ne pas supprimer les docker qui fonctionnent !
Vous avez peut-être des soucis pour faire redémarrer un docker apache qui a cessé de fonctionner ou pour faire un simple restart.
Cela est du à une sécurité mise en place pour les apache sur des serveurs normaux qui crée un fichier pour éviter de démarrer un second serveur lorsqu'un premier tourne déjà. Il faut donc effacer ce fichier avant le démarrage du docker apache et pour cela, refaire une nouvelle image après avoir modifier le Dockerfile.
Si vous expérimentez ce problème, remplacer dans votre Dockerfile la ligne
CMD ["/usr/local/bin/apache2-foreground"]
Par les 3 lignes
COPY apache2-foreground /usr/local/bin/ RUN chmod a+x /usr/local/bin/apache2-foreground CMD ["/usr/local/bin/apache2-foreground"]
et ajoutez au répertoire contenant le Dockerfile le fichier apache2-foreground
qui provient de cette archive
Ensuite recréez une image apache et de nouveau docker apache1 et apache2 utilisant cette image.
Vous allez terminer l'installation de votre site web en installant une application php/mysql et donc un serveur de base de données mysql. Cette application : tiny est un mini framework en php. Récupérez le zip du projet sur votre VM https://github.com/panique/tiny ou ici.
Bien sur vous allez utilisez un docker mysql, le plus facile à paramétrer n'est pas le docker officiel de l'entreprise Oracle mais celui proposé par Docker. Vous pouvez consulter sa documentation sur le docker-store. Il permet via l'utilisation d'une série de variable d’environnement de :
Vous devez créer un serveur à l'adresse 172.18.100.20 avec une base tiny, un utilisateur usertiny dont le mot de passe est passtiny. La base doit être pré-remplie avec les fichiers du répertoire _installation
de l'archive et le mot de passe de l'administrateur doit être tiré au hasard. Ce mot de passe doit être mis sur votre page tomuss dans le champ mysql_root_tp_docker
. Attention à bien utiliser pour ce docker le même réseau que les autres.
Pour tester la base vous pouvez éventuellement utiliser un autre docker phpmyadmin/phpmyadmin ou des requètes SQL directement.
Dans le volume partagé avec vos dockers apaches (c'est à dire avec /var/www/html
de ces docker), vous devez déplacer le fichier index.php
précédent vers test.php
et déplacer les fichiers de tiny (sauf le repertoire _installation
). Il faudra configurer le site pour utiliser la bonne base de donnée, une url correcte … Tout se trouve dans le fichier : <repertoire-tiny>/application/config/config.php
.
Testez est corrigez l'installation. Le site doit ressembler à celui-ci.
Ici ce trouve qq erreur courante l'année dernière :
403 forbidden you don't have permission to access /tiny-master/ on this server
allez ici pour une explication.
Docker compose est un outils permettant de créer plusieurs dockers, de les configurer selon les méthodes vue précédemment et de les administrer. Il se base sur un fichier docker-compose.yml
et sur l'ensemble des fichier et répertoire qui permettraient de créer les dockers nécessaires, faire leur image, contenir les volumes partagés …
Tout se fait par une commande : docker-compose up
qui s'occupe de créer les images nécessaire, de lancer les dockers dans le bon ordre en gérant les liens entre eux et éventuellement de mettre à jour les docker si une partie fonctionne déjà.
Cela semble idéal, mais, cette commande est en grande évolution et tout ce que vous ferez dépendra fortement de la version (écrite en haut du fichier docker-compose.yml
). Ici, il faut utiliser des commande pour la version 2.1 et bien sur consulter la bonne documentation !
Avant de commencer :
Vous devez recréer l'ensemble des dockers précédents via docker compose en créant un répertoire contenant toute l’arborescence de fichiers nécessaire ainsi que le fichier de description. Il s'agit essentiellement de rassembler les différents répertoires faits aux questions I à VI et de créer un fichier docker-compose.yml
comportant les options correspondant aux instructions run que vous aviez effectuées. Pour cela, je vous invite à consulter l'exemple du cours (qui n'est pas dans la bonne version2)) , ceux donnés dans la documentation 3).
Les options intéressantes sont :
image
ou build
pour décrire la création des images;networks
dans un docker pour choisir son réseau et ipv4_address
pour choisir son IP;volumes
, ports
, environments
pour gérer les partages de ports, de volumes ou les variables d'environnement des dockers;links
pour qu'un docker puisse en contacter un autre;driver
et ipam
pour définir la plage d'adresse utilisée par le réseau.Pour éviter des perturbations avec ce qui a été précédemment crée sur la machine :
/home/ubuntu/compose/
rescomp
dont l'adresse est 172.20.20.0/24
;/home/ubuntu/compose/
.mdproot
et l'utilisateur de la base utilisé doit être tiny
avec un mot de passe mdptiny
telnet
, il faut taper la commande telnet adresse_du_site 80
puis une fois la connexion étable taper GET /
services
on déclarent les dockers et dans networks
on déclare les réseaux