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) :

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 partie Data. Que représentent les répertoires MergedDir et UpperDir et LowerDir ? (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'option subnet 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

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'alias pma.

  • 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.