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 5 conteneurs :
mysql
qui servira de base de donnée;phpmyadmin
pour piloter cette base;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;owncloud
qui servira de serveur de partage de fichiersonlyoffice
qui permettra l'édition en ligne des fichiers.Vous devez détruire vos VMs créées la dernière fois (sauf cas particuliers). À partir de maintenant, merci de ne pas faire de snapshot de vos machines ni de volumes, normalement, vous conservez dans vos rapports les commandes nécessaires au bon fonctionnement du TP.
snap-docker-ready
m1-small
clefTpDocker
de tomussComme pour beaucoup de serveurs connus, il existe plusieurs images qui permettent l'installation de mysql très simplement.
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 ? Dockerfile
… Il faut savoir reconnaître rapidement la qualité d'une image, dans l'exemple de mysql vous avez 2 possibilités (nous excluons mariadb)1). :
La documentation de la seconde est beaucoup plus fournie et elle semble proposer un grand nombre d'options de configuration, c'est cette dernière que vous allez choisir.
5
de mysql ? <hi #f3f3f3>Regardez les Dockerfiles</hi>docker pull …
)docktest
;test
;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 utilisez 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 log …
.
docker inspect …
trouvez l'adresse attribuée au dockertelnet
(le port par défaut est 3306).
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 …
docker exec -it NOMDUDOCKER mysql -u root -pMOTDEPASSE
connectez-vous au serveur mysql.
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
?2)
mysql est une base de données qui stocke ces 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
.
docktest
.docktest
;test
;passbdd
;/var/lib/mysql
du docker avec le répertoire /home/ubuntu/docker/datatest/
de la VM./home/ubuntu/docker/datatest/
mysql -u root -ppassbdd -e 'CREATE DATABASE MABASE;'
dans le docker
mysql n'est qu'un serveur de base de donnée, 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. Il est basé sur un code en php et donc un serveur capable de l'interpréter.
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.
dockpma
;docktest
comme base de données.MABASE2
. Constatez les modifications du répertoire partagé.Ce système de configuration n'est pas utilisable, car il demande d'entrer dans le docker ou ses fichiers de configuration 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ée 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 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
.
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
.docktest
Attention ne le supprimez pasinterne
(option --net
) et en attribuant une adresse (option --ip
) :dockbdd
;bdd
;passbdd
;/var/lib/mysql
du docker avec le répertoire /home/ubuntu/docker/datatest/
de la VM.database
(option --network-alias
)dockpma
puis recréez-le en ajoutant à son fichier hosts le docker dockbdd
sous le nom bdd
avec leurs adresses (option --add-host
). Créez un docker basé sur phpmyadmin/phpmyadmin
:dockpma
;bdd
comme base de données;bdd
correspond à l'adresse 172.18.100.10
.dockpma
au réseau interne (commande docker network connect …
)172.18.100.11
;pma
et l'alias dockpma
.dockmpa
est bien dans le même réseau que le docker dockbdd
(avec un docker inspect ..
).dockmpa
peut bien contacter le docker base de donnée avec les différents nom : bdd
qui st présent dans son fichier /etc/hosts
et database
qui est l'alias du même docker dans le réseau. Par exemple les commandes suivantes doivent permettre au docker dockpma
de contacter le docker dockowncloud
.docker exec -it dockpma ping bdd
docker exec -it dockpma ping database
MABASE3
et vérifiez son apparition dans le partage de données. Ici, on vous à présenté plusieurs façon de lier les docker entre eux. Via des adresse que l'on impose et via les alias. A l'avenir, il faut privilégier les alias car ils permettent un fonctionnement plus souple.
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 :
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 .
docknginx
;interne
avec l'adresse 172.18.100.5
;dockpma
soit relié à l'adresse 172.18.100.11;/etc/nginx/nginx.conf
du docker, le container ne doit pas pouvoir écrire dans le fichier.
Le fichier de configuration nginx qui est fourni a déjà prévu l'existence de plusieurs redirection (pour devenir proxy inverser). Vous remarquerez que l'URL http://IPDEVOTREVM/phpmyadmin/ est par exemple redirigée sur http://pma/ ce qui devrait être le docker phpMyAdmin grâce à vos alias précédents. Mais cela n'est pas suffisant. En effet, certains logiciels comme phpMyAdmin ont besoin de connaître l'url qui a servi à les contacter pour fonctionner. Beaucoup de leur pages nécessitent en effet des liens internes pour télécharger par exemple les fichier css
ou js
. Ils sont parfois capable de reconstruire cette url grâce à l'entête de la requête reçue. Mais c'est beaucoup plus difficile s'il y a un proxy inversé. Il faut donc corriger cela.
dockpma
dockpma
;bdd
comme base de données;bdd
correspond à l'adresse 172.18.100.10
.172.18.100.11
;PMA_ABSOLUTE_URI
;pma
.Ici, nginx est configuré en tant que proxy inverse. Vous pouvez voir ici les détails de ce type de configuration reverse proxy
Vous allez maintenant ajouter un élément au site : owncloud. C'est un logiciel de partage de fichier. Il fonctionne un peu comme dropbox ou le drive de google. owncloud est un service web écrit en php. Il est disponible ici ou dans une version dockerisée.
Attention, il y a plusieurs docker possible pour owncloud. Notamment un proposé par l'entreprise docker et un autre par owncloud
elle même. Le premier est considéré déprécié il faut bien utiliser la version de l'entreprise owncloud
pour ce TP, pas celle qui apparait en premier dans le docker hub.
La documentation propose d'utiliser en plus de ce docker un docker mysql et un docker redis. Nous n'utiliserons que mysql.
dockbdd
;bdd
;passbdd
;/var/lib/mysql
du docker avec le répertoire /home/ubuntu/docker/data/
de la VM3).172.18.100.10
;bdd
;owncloud
dont le mot de passe est passowc
;owncloud
.dockowncloud
owncloud/server
;OWNCLOUD_DB_TYPE
, OWNCLOUD_DB_HOST
, OWNCLOUD_DB_NAME
, OWNCLOUD_DB_USERNAME
et OWNCLOUD_DB_PASSWORD
- attention, les 5 variables doivent être remplies pour que cela fonctionne); admin
de mot de passe est passadmin
;172.18.100.15
;owncloud
dans le réseau;http://IPDEVOTREVM:8080/
attention, il est long à démarrer car le premier démarrage met en place le partage de fichier.
Certaines configurations ne sont pas proposées par le docker owncloud. Par exemple, celui-ci ne dispose pas de la commande sudo
, or cette commande est utile pour la suite du TP4). Vous allez donc dans un premier temps modifier l'image owncloud/server
La modification d'une image se fait grâce à des fichiers de description Dockerfile. En fait, chaque création d'image correspond à un répertoire qui contient les données nécessaires à la modification ainsi que le fichier de description Dockerfile
. Vous pouvez noter que la plupart des documentations de dockers sont en fait constituées par un dépôt git correspondant à ce répertoire. Comme vous pouvez le voir ici.
Nous vous proposons de commencer par ce répertoire de travail.
owncloud-perso:0.1
basée sur ce Dockerfile.sudo
dans l'image.pinst.sh
du répertoire. Il faut simplement lui demander d'exécuter la commande sudo -u www-data php occ market:install calendar
automatiquement à la première installation du docker).owncloud-perso:0.2
.owncloud-perso:latest
.dockowncloud
identique au précédant en précisant l'image owncloud-perso
sans mentionner de version. Vérifiez que vous obtenez bien l'image 0.2
.Vous devez être capable de lancer un petit ensemble de services via des dockers. Mais cela n'est pas suffisant. En effet, avec la méthode actuelle, pour que le site fonctionne, il faut être capable de lancer les dockers avec les bonnes options, dans un ordre précis, avec des fichiers de configuration qui dépendent de ces options … Tout cela est difficile à faire pour un spécialiste et encore plus difficile à distribuer à des non spécialistes. Il est donc nécessaire de faire la même chose mais de manière automatique.
Pour automatiser les opérations sur les conteneurs, il est possible d'écrire une description des commandes utilisées dans un fichier, c'est le rôle de docker-compose
. Docker compose est capable de faire à votre place toutes les commandes docker nécessaire à partir de ce que vous avez décrit dans un fichier docker-compose.yml
.
Vous pouvez avoir une description de ces fichiers à cette adresse. Attention, l'api docker évolue rapidement, il est important de se limiter à une version pour travailler. De plus, il ne faut pas confondre la version de l'exécutable docker-compose
, celle du logiciel docker
et celle du fichier de description docker-compose.yml
.
La version la plus importante est celle du fichier de description, elle est écrite au début du fichier :
version: '2.4' services: foo: image: busybox
Nous vous conseillons d'utiliser pour ce TP la version de l'exemple : 2.4
. C'est la dernière de la version 2. En effet la version 3 est la version qui introduit l'utilisation de cluster ce qui sera vu plus tard. La documentation conseillée est donc celle de la version 2 et il est important de vérifier que la documentation que vous consultez est bien basée sur cette version pour expliquer les problèmes.
Dans la version 2, le fichier est composé de 3 sections correspondant aux sous-commandes docker utilisées :
services
est la section qui donne la liste des dockers et de leurs options, cela correspond aux commandes docker run …
ou docker create …
networks
est la section qui décrit les réseaux à utiliser. Cela correspond à la commande docker network …
volumes
est la section qui décrit les volumes à utiliser. Cela correspond à la commande docker volume …
Pour résumer, cette section correspond à la création de volumes en dehors des dockers. Jusqu'à présent, vous n'avez jamais utilisé la commande docker volumes …
ce qui signifie que vous n'aurez pas à utiliser la section pour ce TP. Tous vos volumes seront des volumes de type bind, c'est à dire créés lors du docker run
(section service) et partagée avec la machine hôte.
Les volumes sont des espaces de stockage persistants utilisés par les dockers. Vous pouvez les créer soit en les utilisant dans un docker soit en les créant à part via la commande docker volume…
. La description de la section volumes
d'un docker-compose est ici. Il faut aussi consulter la description de l'utilisation des volumes par les dockers grâce à la sous-section volumes
d'un service. La documentation est là.
Dans un fichier docker-compose.yml
volumes
globale vous permettra de créer un volume ou de déclarer un volume qui a été créé en dehors du docker compose. Elle permet aussi d'utiliser des drivers spéciaux.volumes
de la description d'un service est celle qui attachera effectivement le volume au docker créé, cela correspondra à l'option -v
de la commande docker-run
. C'est à cet endroit que vous pouvez associer un répertoire du docker avec un répertoire de la machine.
C'est la section qui vous permettra de créer et configurer le réseau. Correspondant à ce que vous avez fait via la commande docker network …
. Vous êtes invité à consulter cette documentation, notamment la partie ipam qui permet de gérer l'intervalle d'adresse utilisé.
Cette section décrit les dockers qui devront être créés. Pour cette version, chaque service correspond à un docker et une commande docker-run …
. La documentation est très fournie, vous aurez notamment besoin :
Vous devez créer un ensemble de fichiers et un docker-compose.yml
qui recrée l'architecture vue au début du TP.
Le répertoire doit être /home/ubuntu/compose/
et contenir tous les fichiers et partage nécessaires à cette architecture.
./compose/ |_ docker-compose.yml |_ data/ | |_ mysql/ | |_ owncloud/ | |_ onlyoffice/ |_ logs/ | |_ onlyoffice/ |_ nginx/ | |_ nginx.conf |_ owncloud/ |_ Dockerfile |_ pinst.sh
Vous devez faire un fichier compose qui crée des dockers équivalents aux 4 dockers et au réseau créé auparavant. Ces dockers utiliseront les mêmes ports que les précédant. Vous devez donc les éteindre (docker stop dockbdd docknginx dockpma dockowncloud
). Attention à ne pas les supprimer
Pour résumer il faut :
rescompose
172.18.200.0/24
;rescompose
: 172.18.200.5
;./compose/nginx/nginx.conf
;mysql
dans la version 5 ;./compose/data/mysql/
;rescompose
;mysql
, bdd
ou bd
;passbdd
;owncloud
de mot de passe passowc
et une base owncloud
.phpmyadmin/phpmyadmin
;rescompose
;phpmyadmin
ou pma
;./compose/owncloud/
;./compose/data/owncloud/
;rescompose
;owncloud
ou owc
;owncloud
;admin
a pour mot de passe passadmin
;calendar
. Vous constaterez que les dockers créés par compose n'ont pas le nom des services. En effet, s'il n'est pas précisé par le champ container_name, compose ajoute le nom du répertoire et un numéro unique. C'est utile pour que les noms de ces dockers soient différents de ceux que vous aviez crée auparavant. Gardez les noms par défauts.
Il est possible de donner à owncloud la possibilité d'éditer les documents en ligne. Pour cela, il faut utiliser un autre service : onlyoffice et ajouter le plugins onlyoffice à owncloud pour lui permettre de contacter ce dernier.
Pour faire fonctionner ce service de manière automatique, il faut savoir les choses suivantes :
settings→additionnal
.sudo -u www-data php occ config:list
sudo -u www-data php occ config:app:set
sudo su
occ
qui permet de piloter le logiciel owncloud via des scripts. Or il est important que les commandes occ
soient exécutées par l'utilisateur www-data
qui est aussi celui utilisé par le serveur web. L'utilisateur par défaut du docker est root
, sudo
nous permettra de changer cela.