Utilisation de Docker
Version Française | English version
Résumé
En plus de la machine virtuelle (VM) nous allons utiliser Docker pour séparer les différentes applications. Le but de ce TP est d'installer 3 conteneurs :
- un Docker mysql qui servira de base de données ;
- un Docker phpmyadmin pour piloter cette base ;
- un Docker nginx qui sera le serveur web de base et servira aussi en tant que proxy inverse en assurant la répartition des requêtes dans les différents conteneurs ;
Objectifs
- Apprendre à manipuler les conteneurs Docker ;
- Savoir configurer les Dockers via les options de lancement ;
- Savoir configurer les Dockers en partageant certains fichiers de configurations avec la machine hôte ;
- Gérer les réseaux internes des Docker.
Notation
Nous allons noter ce TP en fonction du travail accompli. Pour cela, il faut impérativement noter l'adresse IP de votre VM dans la case prévue de Tomuss : IP_TP_Docker.
Avant de commencer
Vous devez détruire vos VMs créées la dernière fois (sauf cas particuliers).
- Créez une VM par élève
- basée sur l'image Ubuntu 22.04.1 LTS - Docker Ready
- avec le flavor m1.xsmall
- une fois la VM démarrée ajoutez y la clé publique de l'enseignant en appliquant la commande suivante.
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4fp5+2v2t5LjEckY6V3lNPPf8qIXEsZIVZvL0bnqY+f+zyPHhdyMS/r5qH8lpeB8CHjKwQRp3ttF1zZ5v7A4cel/2uXccun/gwf96s5Kpm5j8KzKwQbkigb/5Q69GC4pNA0b6u7QQ3kXTghaSFkuVlmqueoaw9sO9udYRXSVk9FX48F8OxkkwYMlUIacAU69udhvrpcUGBDn+t2Q696OUGl/4CZtHP4me3otOCFp6v3dGbY0ccu5at1aRaOmLH0XTtxRNSny3d1vpsgguAIT/PJJAjeuGCAWApNvJIYiQi4z0f6MSsjaIPwWtBakkNWPMkxP5Gph3x6qkkzyHMsoD jp@h2g2" >> /home/ubuntu/.ssh/authorized_keys
I. Installation d'un premier Docker : mysql
Comme pour beaucoup de serveurs connus, il existe plusieurs images qui permettent l'installation de mysql très simplement.
- Recherchez la liste des Dockers fournissant mysql, (commande
docker search
) vous verrez qu'ils sont classés par défaut grâce à un système de recommandation via des étoiles. Quels sont les 3 mieux notés ? - Recherchez de la même manière sur le Docker Store. Ce site donne plus de détails notamment les différentes versions pour une image, les Dockerfile,...
Il faut savoir reconnaître rapidement la qualité d'une image, dans l'exemple de mysql vous avez plusieurs possibilités (nous excluons mariadb, un fork de mysql qui est apparu après le rachat de l'entreprise par la firme Oracle, il est très proche de mysql et nous ne l'utiliserons pas ici) :
- Téléchargez l'image de mysql par l'entreprise Docker
La documentation de celle-ci est beaucoup plus fournie et semble proposer un grand nombre d'options de configuration, c'est cette dernière que vous allez choisir.
- Quelles sont les versions proposées et comment reconnait-on la dernière ?
- Téléchargez l'image de la version 5.7.27 (
docker pull ...
) - Vérifiez que l'image est bien téléchargée, son nom et son tag.
- Lancez un premier Docker basé sur cette image dont :
- le nom est docktest;
- le hostname est test;
- avec un mot de passe root aléatoire.
Notez le mot de passe de l'administrateur.
Lors du lancement un grand nombre d'informations sont affichées. En fait, par
défaut le lancement bloque le terminal et affiche tous les résultats de la
commande. Parmi ces derniers vous pouvez noter la ligne GENERATED ROOT PASSWORD: ...
qui contient le mot de passe administrateur de la base. Dans la
suite, vous utiliserez sans doute l'option -d
pour lancer le Docker de
manière détachée, les informations ne seront plus affichées, mais conservées
et disponible via la commande docker logs ...
.
- Grâce à la commande
docker inspect ...
trouvez l'adresse attribuée au Docker. - Pouvez-vous vous connecter sur le serveur mysql avec la commande
telnet
(le port par défaut est 3306). - Pouvez-vous le faire via la commande mysql ?
Il est toujours possible d'installer le client mysql sur votre VM, mais ici, on va utiliser celui qui se trouve dans le Docker. En effet, on peut toujours ajouter un processus au conteneur via la commande Docker exec ...
- En utilisant la commande
docker exec -it NOMDUDocker mysql -u root -pMOTDEPASSE
connectez-vous au serveur mysql. - Exécutez un shell bash dans le Docker (commande
docker exec -it ...
) et créer un fichier/toto.txt
contenant coucou à la racine du Docker. - Sortez du Docker et essayez de retrouver le fichier sur la VM. Pour cela,
vous pouvez utiliser
docker inspect ...
notamment la partieData
. Que représentent les répertoiresMergedDir
etUpperDir
etLowerDir
? (il vaut mieux être root pour cette question : ''sudo su'')
Partage de volumes
mysql est une base de données qui stocke ses données dans le répertoire
/var/lib/mysql
. Dans la configuration actuelle, ce répertoire est interne au
Docker et difficile d'accès. Cela peut poser des problèmes si vous souhaitez
changer le Docker sans perdre les données stockées. Pour éviter cela, vous
allez donc recréer le Docker en partageant le répertoire de stockage avec la
machine hôte. Pour cela il faut utiliser l'option -v
du docker run
.
- Détruisez le Docker
docktest
. -
Recréez un Docker basé sur mysql 5.7.27 dont :
- le nom est dockmysql;
- le hostname est mysql;
- le mot de passe root est passroot;
- qui partage le répertoire
/var/lib/mysql
du Docker avec le répertoire/home/ubuntu/docker/datatest/
de la VM.
-
Après la fin du démarrage du Docker (qui prend un peu de temps) listez le contenu du fichier
/home/ubuntu/docker/datatest/
- Créez une base de données en exécutant la commande
mysql -u root-ppassroot -e 'CREATE DATABASE BASE_A;'
dans le Docker - Relistez le même répertoire, quelle est la différence ?
II. Gestion des adresses et installation d'une interface à mysql : phpMyAdmin
mysql n'est qu'un serveur de base de données, on ne peut l'utiliser que via des commandes SQL. Pour simplifier son utilisation, on ajoute en général une interface comme le logiciel phpMyAdmin. C'est une interface web permettant simplement de faire la plupart des opérations sur le serveur. Elle est basée sur un code en php et donc un serveur capable de l'interpréter.
- Peut-on ajouter phpMyAdmin au Docker mysql pour former un Docker avec le serveur et l'interface. Si oui pourquoi ne le fait-on pas ?
Vous allez utiliser le Docker phpMyAdmin pour mettre en place l'interface. Dans la documentation ne suivez pas la méthode Usage with linked server qui est dépréciée. Utilisez la méthode avec un serveur externe.
- Créer un Docker basé sur la dernière version de phpMyAdmin :
- dont le nom est dockMyAdm;
- qui partage le port 8080 de votree VM avec le port 80 du Docker;
- qui utilise l'adresse du Docker dockmysql comme base de données.
- Connectez-vous sur l'interface web. Entrez le login et le mot de passe de l'administrateur mysql et créer une nouvelle base de données : BASE_B. Constatez les modifications du répertoire partagé.
Gestion du réseau et liaison entre les Dockers
Ce système de configuration n'est pas utilisable, car il demande d'entrer dans le Docker ou ses fichiers de configuration pour trouver une adresse qui est gérée par Docker. Cela signifie par exemple que si vous programmez un service web pour utiliser la base de donnée, ce dernier devra être modifié si par hasard le Docker est recréé avec une autre adresse. Pour remédier à cela vous allez utiliser la possibilité de créer des réseaux et de choisir les adresses des conteneurs Dockers.
En effet, il est possible de choisir les adresses IPs des Dockers, de choisir
la valeur de leurs variables d'environnement ou de paramétrer leur fichier
/etc/hosts
ainsi que de leur donner un nom dans ce réseau.
- Vous devez tout d'abord créer un réseau utilisateur via la commande
docker network create ...
. Attention, il faut utiliser l'optionsubnet
pour définir le réseau. - Créer un réseau de nom
interne
et utilisant la plage d'adresses ''172.18.100.0/24''. - Arrêtez le Docker dockmysql Attention ne le supprimez pas
- puis recréez un nouveau Docker mysql utilisant le réseau
interne
(option--net
), en attribuant une adresse (option--ip
) et en lui associant un alias réseau (option--network-alias
) :- le nom est
dockbase
; - le hostname est
basededonnee
; - le mot de passe root est passroot ;
- qui partage le répertoire
/var/lib/mysql
du Docker avec le répertoire/home/ubuntu/docker/datatest/
de la VM. - Utilisant l'adresse 172.18.100.10.
- Utilisant l'alias réseau base
- le nom est
Vous pourrez noter que comme le nouveau Docker partage le même répertoire de données, les bases précédemment crées et le mot de passe de l'administrateur sont déjà configurées au lancement.
-
Supprimez le Docker dockMyAdm puis recréez-le en modifiant le serveur qu'il administre. Pour cela créez un Docker basé sur phpmyadmin/phpmyadmin :
- dont le nom est dockMyAdm ;
- qui partage le port 8080 de votre VM avec le port 80 du Docker ;
- qui utilise dockbase comme base de données ;
-
Après l'avoir lancé, ajoutez dockMyAdm au réseau interne (commande
docker network connect ...
) en lui attribuant l'adresse :172.18.100.11
et l'aliaspma
. -
Verifiez que dockMyAdm est bien dans le même réseau que le Docker dockbase (avec un
docker inspect ...
). -
La VM peut-elle contacter ces Dockers ? Une autre VM le peut-elle ?
-
Reconnectez-vous sur l'interface web, tout devrait fonctionner et les bases créées précédemment devraient être encore fonctionnelles. Cela signifie donc que le Docker mysql est capable de conserver les données déjà existantes.
- Créez une autre base de données ''BASE_C'' et vérifiez son apparition dans le partage de données.
III. Configuration des Dockers
En général pour configurer un service, il est nécessaire de modifier des fichiers. Mais ces fichiers sont internes au Docker donc difficiles d'accès. De plus, les outils d'édition les plus courants (nano, vim, emacs ...) ne font pas parti d'un conteneur classique ce qui complique encore cette modification. Pour résoudre le problème, on peut :
- Pré-configurer le Docker via le Dockerfile ou des outils de création (voir plus tard);
- Copier des fichiers entre la VM et le Docker ;
- Utiliser le partage de répertoires et/ou de fichiers entre la VM et le Docker.
Nous allons utiliser la dernière méthode pour configurer un proxy inverse nginx.
Le fichier de configuration principale de nginx est
/etc/nginx/nginx.conf
. Nous allons partir d'un fichier copié depuis un
Docker nginx fonctionnel.
-
créez un Docker basé sur la dernière image nginx tel que :
- son nom soit dockFront ;
- il soit dans le réseau interne avec l'adresse
172.18.100.15
; - le port 80 de l'hôte soit envoyé sur le port 80 du Docker;
- le fichier nginx.conf soit lié au fichier
/etc/nginx/nginx.conf
du Docker, le container ne doit pas pouvoir écrire dans le fichier ; - le répertoire
/home/ubuntu/docker/nginx/
soit lié au répertoire/www/
du Docker.
-
Vérifiez le bon fonctionnement du serveur nginx en allant à l'adresse
http://IPDEVOTREVM/
- Modifiez la configuration du serveur pour que la racine du site web soit le répertoire partagé
/www/
-
Modifiez la configuration du serveur pour que l'url
http://IPDEVOTREVM/phpMyAdmin/
soit renvoyée vers le Docker dockMyAdm. Pour cela il faut- utiliser la configuration de nginx comme reverse proxy
- reconstruire le Docker dockMyAdm
- en le plaçant directement dans le réseau interne avec l'alias pma et l'adresse
172.18.100.11
; - en lui donnant l'url par laquelle il sera contacté via la variable
PMA_ABSOLUTE_URI
; - en supprimant le transfert de port (8080 vers 80) car il est à présent inutile.