Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
docker_lamp [Le 12/04/2019, 14:45]
176.168.104.44 [Méthode simple]
docker_lamp [Le 20/12/2023, 18:08] (Version actuelle)
krodelabestiole [Méthode simple] màj en volume nommé pour ne pas écraser phpmyadmin
Ligne 1: Ligne 1:
-{{tag>​Trusty Xenial serveur tutoriel}} +{{tag>​Trusty Xenial serveur tutoriel ​obsolete}} 
-----+
 {{ :​docker_conteneur_engine_logo.png?​200|}} {{ :​docker_conteneur_engine_logo.png?​200|}}
 +
 ====== Monter un serveur LAMP grâce à Docker ====== ====== Monter un serveur LAMP grâce à Docker ======
 +
 +<note warning>
 +Cet tutoriel est âgé (pour ce type de technologie) et mériterait au minimum une bonne mise à jour.
 +
 +Voir [[https://​forum.ubuntu-fr.org/​viewtopic.php?​pid=22729269#​p22729269|ce message]] sur le forum.
 +</​note>​
  
 [[:Docker]] permet d'​installer les logiciels de son choix, dans les versions de son choix quelle que soit notre version de Linux. Pour cela il isole les logiciels qu'on souhaite utiliser les uns des autres avec chacun leurs dépendances dans des "​conteneurs"​. Mais il permet aussi d'​éviter les inconvénients de la [[:​virtualisation]] (fichiers lourds, ressources machines divisées, lenteurs, etc.).\\ ​ [[:Docker]] permet d'​installer les logiciels de son choix, dans les versions de son choix quelle que soit notre version de Linux. Pour cela il isole les logiciels qu'on souhaite utiliser les uns des autres avec chacun leurs dépendances dans des "​conteneurs"​. Mais il permet aussi d'​éviter les inconvénients de la [[:​virtualisation]] (fichiers lourds, ressources machines divisées, lenteurs, etc.).\\ ​
Ligne 10: Ligne 17:
 Pour cet exemple nous allons installer PHP 5.6 qui n'est pas disponible sur [[:​Xenial]]. Pour cet exemple nous allons installer PHP 5.6 qui n'est pas disponible sur [[:​Xenial]].
  
-Nous allons considérer 2 méthodes : une simple, l'​autre plus avancée.\\ +Nous allons considérer 2 méthodes : une simple, l'​autre plus avancée.
 La [[#méthode simple]] consiste à installer un seul conteneur avec toute la pile [[:​LAMP]].\\ ​ La [[#méthode simple]] consiste à installer un seul conteneur avec toute la pile [[:​LAMP]].\\ ​
 Avec la [[#méthode avancée]] on installera le serveur web ([[:​Apache]] et [[:PHP]]) séparément du serveur de base de données, dans 2 conteneurs différents. C'est la méthode conseillée par [[:​Docker]],​ qui recommande de séparer chaque processus / service dans un conteneur différent. Cela rend effectivement notre environnement de travail extrêmement modulaire et permet par ex. de switcher de PHP 5.6 à PHP 7 ou de [[:MySQL]] à [[:​MariaDB]] en un claquement de doigt ! Avec la [[#méthode avancée]] on installera le serveur web ([[:​Apache]] et [[:PHP]]) séparément du serveur de base de données, dans 2 conteneurs différents. C'est la méthode conseillée par [[:​Docker]],​ qui recommande de séparer chaque processus / service dans un conteneur différent. Cela rend effectivement notre environnement de travail extrêmement modulaire et permet par ex. de switcher de PHP 5.6 à PHP 7 ou de [[:MySQL]] à [[:​MariaDB]] en un claquement de doigt !
Ligne 16: Ligne 23:
 <note tip>De nombreuses images crées par la communauté sont disponibles sur le [[https://​hub.docker.com/​|Docker Hub]] et d'​autres plus officielles sur le [[https://​store.docker.com/​|Docker Store]].</​note>​ <note tip>De nombreuses images crées par la communauté sont disponibles sur le [[https://​hub.docker.com/​|Docker Hub]] et d'​autres plus officielles sur le [[https://​store.docker.com/​|Docker Store]].</​note>​
  
-<note warning>​À l'​heure actuelle, Docker n'est [[https://​github.com/​Microsoft/​WSL/​issues/​575|pas compatible]] avec [[:​wsl|Windows Subsystem for Linux]]. Donc ne tentez pas cette installation si vous utilisez Ubuntu on Windows. (voir [[https://​forum.ubuntu-fr.org/​viewtopic.php?​id=2023871|ce sujet]] sur le forum)</​note>​ 
 ===== Installation de Docker ===== ===== Installation de Docker =====
  
Ligne 31: Ligne 37:
 ===== Mise en place des répertoires de travail ===== ===== Mise en place des répertoires de travail =====
  
-Par défaut les modifications apportées aux fichiers d'un conteneur ne sont pas persistantes (tout est réinitialisé à chaque lancement du conteneur). L'​intérêt de l'​option **-v** (volume) de Docker est de créer une sorte de lien symbolique entre le conteneur et le système hôte, ainsi les fichiers modifiés par le conteneur ​seront persistés ​sur le système.+Par défaut les modifications apportées aux fichiers d'un conteneur ne sont pas persistantes (tout est réinitialisé à chaque lancement du conteneur). L'​intérêt de l'​option **-v** (volume) de Docker est de créer une sorte de lien symbolique entre le conteneur et le système hôte, ainsi les fichiers modifiés par le conteneur ​persisterons ​sur le système.
  
 Commençons donc par créer des répertoires pour le contenu que l'on souhaite modifier et conserver, en l'​occurrence les fichiers du site et les bases de donnés : Commençons donc par créer des répertoires pour le contenu que l'on souhaite modifier et conserver, en l'​occurrence les fichiers du site et les bases de donnés :
Ligne 39: Ligne 45:
 <​code>​chmod 777 ~/​.docker/​www ~/​.docker/​mysql</​code>​ <​code>​chmod 777 ~/​.docker/​www ~/​.docker/​mysql</​code>​
  
-Pour la suite, à vous de choisir entre les deux méthodes en fonction de vos besoins. ​+Pour la suite, à vous de choisir entre les deux méthodes en fonction de vos besoins.
  
  
 ===== Méthode simple ===== ===== Méthode simple =====
  
-Pour cette méthode, choisissons une image contenant la pile LAMP complète.\\ +Pour cette méthode, choisissons une image contenant la pile LAMP complète.
 Celle-ci est basée sur [[:​debian_ubuntu_comparaison|Debian Jessie]], [[:php|PHP 5]], [[:​apache|Apache 2]], et [[:MySQL]] : [[https://​hub.docker.com/​r/​lioshi/​lamp/​]] Celle-ci est basée sur [[:​debian_ubuntu_comparaison|Debian Jessie]], [[:php|PHP 5]], [[:​apache|Apache 2]], et [[:MySQL]] : [[https://​hub.docker.com/​r/​lioshi/​lamp/​]]
  
 Lançons donc un conteneur avec cette image : Lançons donc un conteneur avec cette image :
-<​code>​docker run -v ~/​.docker/​www:​/​var/​www/​html -v ~/​.docker/​mysql:/​var/​lib/​mysql -p 80:80 -p 3306:3306 --restart=always lioshi/​lamp:​php5</​code>​ +<​code>​docker run --mount type=volume,​src=web_data,​dst=/​var/​www/​html,​volume-driver=local,​volume-opt=device=${HOME}/​.docker/​www,​volume-opt=o=bind,​volume-opt=type=none ​-v ~/​.docker/​mysql:/​var/​lib/​mysql -p 80:80 -p 3306:3306 --restart=always lioshi/​lamp:​php5</​code>​ 
-L'option **-v** (volume) ​relie les répertoires locaux ​**~/​.docker/​www** et **~/​.docker/​mysql** aux répertoires ​**/​var/​www/​html** et **/​var/​lib/​mysql** de l'​image Debian dans le conteneur.\\  +Les options ''​%%--%%mount''​ et ''-v'' ​(volume) ​relient ​les répertoires locaux ​''​~/​.docker/​www'' ​et ''​~/​.docker/​mysql'' ​aux répertoires ​''​/​var/​www/​html'' ​et ''​/​var/​lib/​mysql'' ​de l'​image Debian dans le conteneur. 
-L'​option ​**-p** (port) relie les ports qui nous intéressent du conteneur aux ports de notre machine locale. Ici le port 80 (HTTP) et le port 3306 (MySQL).\\  +L'​option ​''​-p'' ​(port) relie les ports qui nous intéressent du conteneur aux ports de notre machine locale. Ici le port 80 (HTTP) et le port 3306 (MySQL). 
-L'​option ​**--restart=always** permet de relancer le conteneur à chaque démarrage de Docker (donc au démarrage de l'​ordinateur).+L'​option ​''​%%--%%restart=always'' ​permet de relancer le conteneur à chaque démarrage de Docker (donc au démarrage de l'​ordinateur).
  
 La première fois qu'on lance le conteneur, Docker télécharge toutes les librairies nécessaires,​ ce qui prend un peu de temps. La première fois qu'on lance le conteneur, Docker télécharge toutes les librairies nécessaires,​ ce qui prend un peu de temps.
Ligne 58: Ligne 64:
 À partir de là notre serveur tourne. À partir de là notre serveur tourne.
  
-Les bases de données seront sauvegardées dans notre répertoire ​**~/mysql**.\\ +Les bases de données seront sauvegardées dans notre répertoire ​''​~/.docker/mysql''​.
 [[:​PhpMyAdmin]] est accessible sur [[http://​localhost/​phpmyadmin]]\\ ​ [[:​PhpMyAdmin]] est accessible sur [[http://​localhost/​phpmyadmin]]\\ ​
-Avec cette image Docker l'​utilisateur par défaut pour les bases de données ​devrait être **admin** avec le mot de passe **admin** (hôte ​**localhost**).+Avec cette image Docker l'​utilisateur par défaut pour les bases de données ​sera ''​admin'' ​avec le mot de passe ''​admin'' ​(hôte ​''​localhost''​).
  
-On peut mettre les fichiers de son site dans notre répertoire ​**~/www**. On pourra ensuite y accéder sur [[http://​localhost]]+On peut mettre les fichiers de son site dans notre répertoire ​''​~/.docker/www''​. On pourra ensuite y accéder sur [[http://​localhost]]
  
  
Ligne 72: Ligne 78:
   * Pour **phpMyAdmin**,​ nous pouvons aussi choisir l'​[[https://​hub.docker.com/​r/​phpmyadmin/​phpmyadmin/​|image officielle]].   * Pour **phpMyAdmin**,​ nous pouvons aussi choisir l'​[[https://​hub.docker.com/​r/​phpmyadmin/​phpmyadmin/​|image officielle]].
  
-Pour la suite nous allons nous servir d'un outil bien pratique pour lancer plusieurs conteneurs en évitant les lignes de commandes à rallonge : **docker-compose**.\\ +Pour la suite nous allons nous servir d'un outil bien pratique pour lancer plusieurs conteneurs en évitant les lignes de commandes à rallonge : **docker-compose**.
 Il faut tout d'​abord l'​installer : Il faut tout d'​abord l'​installer :
 <​code>​sudo apt install docker-compose</​code>​ <​code>​sudo apt install docker-compose</​code>​
Ligne 86: Ligne 92:
             - "​80:​80"​             - "​80:​80"​
         volumes:         volumes:
-            - ~/​www:/​var/​www/​html+            - ~/.docker/​www:/​var/​www/​html
         links:         links:
             - db:db             - db:db
Ligne 92: Ligne 98:
         image: mysql:5.5         image: mysql:5.5
         volumes:         volumes:
-            - ~/​mysql:/​var/​lib/​mysql+            - ~/.docker/​mysql:/​var/​lib/​mysql
         ports:         ports:
             - "​3306:​3306"​             - "​3306:​3306"​
Ligne 104: Ligne 110:
             - db:​db</​code>​             - db:​db</​code>​
  
-Les **services** sont des conteneurs.\\ +Les **services** sont des conteneurs.
 **web**, **db** et **myadmin** sont les noms qu'on décide de leur donner. Ces noms sont utilisés pour créer des liens - **links** - entre les différents conteneurs. Par ex. **db:db** signifie que notre conteneur **db** (du nom de notre conteneur MySQL) correspondra à l'​hôte **db** dans notre conteneur **web**. Pour se connecter au serveur [[:MySQL]] il faudra donc entrer **db** comme nom d'​hôte.\\ ​ **web**, **db** et **myadmin** sont les noms qu'on décide de leur donner. Ces noms sont utilisés pour créer des liens - **links** - entre les différents conteneurs. Par ex. **db:db** signifie que notre conteneur **db** (du nom de notre conteneur MySQL) correspondra à l'​hôte **db** dans notre conteneur **web**. Pour se connecter au serveur [[:MySQL]] il faudra donc entrer **db** comme nom d'​hôte.\\ ​
 On peut également passer des variables d'​environnements à nos conteneurs. Ici nous définissons le mot de passe de l'​utilisateur [[:MySQL]] **root** comme étant **root**.\\ ​ On peut également passer des variables d'​environnements à nos conteneurs. Ici nous définissons le mot de passe de l'​utilisateur [[:MySQL]] **root** comme étant **root**.\\ ​
-De la même manière que l'​options **-v** de la ligne de commande, le paramètre **volumes** relie les répertoires locaux **~/www** et **~/mysql** aux répertoires **/​var/​www/​html** de l'​image Apache/PHP et **/​var/​lib/​mysql** de l'​image MySQL dans nos conteneurs.\\  +De la même manière que l'​options **-v** de la ligne de commande, le paramètre **volumes** relie les répertoires locaux **~/.docker/www** et **~/.docker/mysql** aux répertoires **/​var/​www/​html** de l'​image Apache/PHP et **/​var/​lib/​mysql** de l'​image MySQL dans nos conteneurs. 
-Et le paramètre **ports** de la même manière que l'​options **-p**, relie les ports qui nous intéressent de nos conteneurs aux ports de notre machine locale. Ici le port 80 (HTTP) et le port 3306 (MySQL).+Et le paramètre **ports** de la même manière que l'​options **-p**, relie les ports qui nous intéressent de nos conteneurs aux ports de notre machine locale. Ici le port 80 (HTTP) et le port 3306 (MySQL), ce dernier peut-être et même doit-être supprimé si vous avez déjà un LAMP sur votre machine locale (hôte).
  
 Une fois ce fichier mis en place on peut lancer tous nos conteneurs avec un simple Une fois ce fichier mis en place on peut lancer tous nos conteneurs avec un simple
 <​code>​docker-compose up</​code>​ <​code>​docker-compose up</​code>​
  
-Il faut attendre ​une peu que les images soient téléchargées,​ et c'est tout ! Notre serveur est en route.+Il faut attendre ​un peu que les images soient téléchargées,​ et c'est tout ! Notre serveur est en route.
  
-De la même manière qu'​avec la [[#méthode simple]] les bases de données seront sauvegardées dans notre répertoire **~/​mysql**.\\ +De la même manière qu'​avec la [[#méthode simple]] les bases de données seront sauvegardées dans notre répertoire **~/.docker/mysql**.
 [[:​PhpMyAdmin]] est cette fois accessible sur le port 8080 : [[http://​localhost:​8080]]\\ ​ [[:​PhpMyAdmin]] est cette fois accessible sur le port 8080 : [[http://​localhost:​8080]]\\ ​
 Et cette fois l'​utilisateur par défaut pour les bases de données sera **root** avec le mot de passe **root** (hôte **db**). Et cette fois l'​utilisateur par défaut pour les bases de données sera **root** avec le mot de passe **root** (hôte **db**).
  
-On peut mettre les fichiers de notre site dans notre répertoire **~/www**. On pourra ensuite y accéder sur [[http://​localhost]].+On peut mettre les fichiers de notre site dans notre répertoire **~/.docker/www**. On pourra ensuite y accéder sur [[http://​localhost]].
  
 Pour passer de MySQL 5.5 à MySQL 5.7 par ex. il suffit de remplacer **image: mysql:5.5** par **image: mysql:5.7** et de relancer **docker-compose up**. Pour passer de MySQL 5.5 à MySQL 5.7 par ex. il suffit de remplacer **image: mysql:5.5** par **image: mysql:5.7** et de relancer **docker-compose up**.
Ligne 127: Ligne 133:
 ==== Configuration de PHP, d'​Apache et de MySQL ==== ==== Configuration de PHP, d'​Apache et de MySQL ====
  
-Pour ajuster les configurations des différents services, le mieux est aussi d'​utiliser la fonctionnalité **volume** (qu'on peut utiliser comme des liens symboliques entre les conteneurs et l'​exterieur,​ aussi bien pour des répertoires que pour des fichiers).\\  +Pour ajuster les configurations des différents services, le mieux est aussi d'​utiliser la fonctionnalité **volume** (qu'on peut utiliser comme des liens symboliques entre les conteneurs et l'​exterieur,​ aussi bien pour des répertoires que pour des fichiers). 
-Ainsi on peut facilement éditer ou modifier les fichiers de config sur notre système. C'est très facile, à condition de savoir où doivent se trouver ces fichiers de config sur nos images.\\ +Ainsi on peut facilement éditer ou modifier les fichiers de config sur notre système. C'est très facile, à condition de savoir où doivent se trouver ces fichiers de config sur nos images.
 Pour stocker nos configs personnalisées on peut créer un répertoire : Pour stocker nos configs personnalisées on peut créer un répertoire :
 <​code>​mkdir ~/​config</​code>​ <​code>​mkdir ~/​config</​code>​
Ligne 156: Ligne 162:
 Le [[https://​hub.docker.com/​|Docker Hub]] et le [[https://​store.docker.com/​|Docker Store]] fournissent une quantité impressionnante d'​images toutes faites. Mais parfois il est nécessaire de modifier ces images, par ex. pour installer une extension exotique à PHP. Le [[https://​hub.docker.com/​|Docker Hub]] et le [[https://​store.docker.com/​|Docker Store]] fournissent une quantité impressionnante d'​images toutes faites. Mais parfois il est nécessaire de modifier ces images, par ex. pour installer une extension exotique à PHP.
  
-La plupart des images disponibles sur ces hubs fournissent un fichier [[docker#​automatisation_avec_un_dockerfile|Dockerfile]]. [[https://​hub.docker.com/​r/​lioshi/​lamp/​~/​dockerfile/​|exemple]].\\  +La plupart des images disponibles sur ces hubs fournissent un fichier [[docker#​automatisation_avec_un_dockerfile|Dockerfile]]. [[https://​hub.docker.com/​r/​lioshi/​lamp/​~/​dockerfile/​|exemple]]. 
-Ce fichier est une liste d'​instructions qui permettent de construire une image. Il définit une image de base (par ex. Debian:​telle_version) et contient ensuite une série de commandes telles que **apt install ...**.\\ +Ce fichier est une liste d'​instructions qui permettent de construire une image. Il définit une image de base (par ex. Debian:​telle_version) et contient ensuite une série de commandes telles que **apt install ...**.
 On peut également créer ce fichier sur notre machine pour créer une image Docker qui corresponde exactement à nos besoin (pour plus de facilité on peut évidemment partir d'un Dockerfile existant). On peut également créer ce fichier sur notre machine pour créer une image Docker qui corresponde exactement à nos besoin (pour plus de facilité on peut évidemment partir d'un Dockerfile existant).
  
-Voici un site qui explique plus en détail comment s'y prendre : [[http://​putaindecode.io/​fr/​articles/​docker/​dockerfile/​]].+Voici un site qui explique plus en détail comment s'y prendre : [[https://​putaindecode.io/​fr/​articles/​docker/​dockerfile/​]].
  
 Une fois notre [[docker#​automatisation_avec_un_dockerfile|Dockerfile]] créé, par ex. à l'​emplacement **~/​webserver/​Dockerfile**,​ on peut construire notre image avec la commande : Une fois notre [[docker#​automatisation_avec_un_dockerfile|Dockerfile]] créé, par ex. à l'​emplacement **~/​webserver/​Dockerfile**,​ on peut construire notre image avec la commande :
Ligne 169: Ligne 175:
  
 Certaines commandes sont très utiles pour manipuler nos images et nos conteneurs : Certaines commandes sont très utiles pour manipuler nos images et nos conteneurs :
-\\ \\ +\\
 <​code>​docker ps -a</​code>​ <​code>​docker ps -a</​code>​
 Lister les conteneurs. Pour chaque conteneur on récupère ainsi un id comme **fc2ff39a9270** Lister les conteneurs. Pour chaque conteneur on récupère ainsi un id comme **fc2ff39a9270**
-\\ \\ +\\
 <​code>​docker rm fc2</​code>​ <​code>​docker rm fc2</​code>​
 Supprimer un conteneur. les 3 premiers caractères de l'id suffisent à l'​identifier. Supprimer un conteneur. les 3 premiers caractères de l'id suffisent à l'​identifier.
-\\ \\ +\\
 <​code>​docker images</​code>​ <​code>​docker images</​code>​
 Lister les images installées. On récupère aussi leurs ids. Lister les images installées. On récupère aussi leurs ids.
-\\ \\ +\\
 <​code>​docker rmi e15</​code>​ <​code>​docker rmi e15</​code>​
 Supprimer une image dont l'id commence par **e15**. Supprimer une image dont l'id commence par **e15**.
-\\ \\ +\\
 <​code>​docker exec -ti fc2 bash</​code>​ <​code>​docker exec -ti fc2 bash</​code>​
 Se connecter au terminal d'un conteneur dont l'id commence par fc2 pour en explorer les entrailles. Souvenez-vous que les modifications disparaîtront au prochain démarrage du conteneur. Se connecter au terminal d'un conteneur dont l'id commence par fc2 pour en explorer les entrailles. Souvenez-vous que les modifications disparaîtront au prochain démarrage du conteneur.
Ligne 203: Ligne 209:
             - "​./​timezone.ini:/​usr/​local/​etc/​php/​conf.d/​timezone.ini"</​code>​             - "​./​timezone.ini:/​usr/​local/​etc/​php/​conf.d/​timezone.ini"</​code>​
  
-Ne pas oublier d'​arrêter le conteneur simplement par la combinaison de touche **CTRL+C** dans la fenêtre de terminal ayant lancé Docker et le relancer et ça fonctionne ! +Ne pas oublier d'​arrêter le conteneur simplement par la combinaison de touche **CTRL+C** dans la fenêtre de terminal ayant lancé Docker et le relancer et ça fonctionne !
  
 Merci à Emilyshepherd du forum Docker pour son excellente solution. Merci à Emilyshepherd du forum Docker pour son excellente solution.
  • docker_lamp.1555073150.txt.gz
  • Dernière modification: Le 12/04/2019, 14:45
  • par 176.168.104.44