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
docker_lamp [Le 20/12/2023, 18:08]
krodelabestiole [Méthode simple] màj en volume nommé pour ne pas écraser phpmyadmin
docker_lamp [Le 02/07/2025, 17:28] (Version actuelle)
krodelabestiole mise en forme
Ligne 25: Ligne 25:
 ===== Installation de Docker ===== ===== Installation de Docker =====
  
-Pour installer [[:Docker]] sous Ubuntu, ​cliquez sur **[[apt>​docker.io]]** ou en ligne de commande :+Pour installer [[:Docker]] sous Ubuntu, ​installez le paquet ''​[[apt>​docker.io]]'',​ soit en ligne de commande :
 <​code>​sudo apt install docker.io</​code>​ <​code>​sudo apt install docker.io</​code>​
  
-Ajoutez votre utilisateur au groupe ​**docker** afin de pouvoir manipuler les conteneurs : +Ajoutez votre utilisateur au groupe ​''​docker'' ​afin de pouvoir manipuler les conteneurs : 
-<note important>​Cette méthode pose un problème de sécurité. Il devient, en effet, possible d'​élever les privilèges de l'​utilisateur sans entrer à nouveau de mot de passe. Si vous êtes sur un serveur en production n'​entrez pas cette commande et utilisez la commande ​**sudo docker** au lieu de **docker** pour la suite des opérations.</​note>​+<note important>​Cette méthode pose un problème de sécurité. Il devient, en effet, possible d'​élever les privilèges de l'​utilisateur sans entrer à nouveau de mot de passe. Si vous êtes sur un serveur en production n'​entrez pas cette commande et utilisez la commande ​''​[[:​sudo]] docker'' ​au lieu de simplement ''​docker'' ​pour la suite des opérations.</​note>​
 <​code>​sudo usermod -aG docker $USER</​code>​ <​code>​sudo usermod -aG docker $USER</​code>​
  
 Finalement **redémarrez votre ordinateur**. Finalement **redémarrez votre ordinateur**.
- 
  
 ===== 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 persisterons 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 46: Ligne 45:
  
 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 =====
Ligne 68: Ligne 66:
 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''​). 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 ''​~/​.docker/​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]]''​.
  
 ===== Méthode avancée ===== ===== Méthode avancée =====
  
 Pour cette méthode nous avons besoin d'une image pour [[Apache]] avec [[:PHP]], une image pour [[:MySQL]] et une image pour [[:​phpMyAdmin]]. Pour cette méthode nous avons besoin d'une image pour [[Apache]] avec [[:PHP]], une image pour [[:MySQL]] et une image pour [[:​phpMyAdmin]].
-  * Pour **Apache/​PHP** nous allons choisir [[https://​hub.docker.com/​r/​lavoweb/​php-5.6/​|celle-ci]],​ basée sur l'​[[https://​hub.docker.com/​r/​library/​php/​|image fournie officiellement par PHP]], mais à laquelle on a ajouté quelques ​librairies ​bien utiles (**gd**, **zip**, **mcrypt**...).+  * Pour **Apache/​PHP** nous allons choisir [[https://​hub.docker.com/​r/​lavoweb/​php-5.6/​|celle-ci]],​ basée sur l'​[[https://​hub.docker.com/​r/​library/​php/​|image fournie officiellement par PHP]], mais à laquelle on a ajouté quelques ​[[:​PHP|modules]] ​bien utiles (**gd**, **zip**, **mcrypt**...).
   * Pour **MySQL**, nous pouvons prendre l'​[[https://​hub.docker.com/​_/​mysql/​|image fournie officiellement par MySQL]], en version 5.5 (une version un peu ancienne).   * Pour **MySQL**, nous pouvons prendre l'​[[https://​hub.docker.com/​_/​mysql/​|image fournie officiellement par MySQL]], en version 5.5 (une version un peu ancienne).
   * 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]].
Ligne 84: Ligne 81:
 Nous allons ensuite créer un fichier **docker-compose.yml** dans lequel nous allons définir notre environnement : Nous allons ensuite créer un fichier **docker-compose.yml** dans lequel nous allons définir notre environnement :
  
-<​code>​version: '​2'​ +<​code>​
 services: services:
     web:     web:
Ligne 110: Ligne 106:
             - 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 ​**~/​.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. +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), ce dernier peut-être et même doit-être supprimé si vous avez déjà un LAMP sur votre machine locale (hôte).+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 un 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 ​**~/​.docker/​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 ​**~/​.docker/​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''​.
  
 ===== Aller plus loin ===== ===== Aller plus loin =====
Ligne 133: Ligne 129:
 ==== 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'extérieur, 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>​
  
-Puis on créé notre fichier ​**~/​config/​php.ini** qui contient seulement les paramètres que l'on souhaite modifier, par ex. :+Puis on créé notre fichier ​''​~/​config/​php.ini'' ​qui contient seulement les paramètres que l'on souhaite modifier, par ex. :
 <​code>​short_open_tag = On <​code>​short_open_tag = On
  
Ligne 153: Ligne 149:
  
 date.timezone = "​Europe/​Paris"</​code>​ date.timezone = "​Europe/​Paris"</​code>​
-Finalement on relie ce fichier avec le paramètre **volume**, par ex. pour l'​image de notre [[#méthode simple]] : <​code>​-v ~/​config/​php.ini:/​etc/​php5/​apache2/​conf.d/​90-custom.ini</​code>​ Ainsi on garde la configuration par défaut de l'​image mais on ajoute notre config customisée en dernier, afin d'​écraser les valeurs prédéfinies (**conf.d/​90-custom.ini**, ces fichiers sont chargés par ordre alphabétique).\\  +Finalement on relie ce fichier avec le paramètre **volume**, par ex. pour l'​image de notre [[#méthode simple]] : <​code>​-v ~/​config/​php.ini:/​etc/​php5/​apache2/​conf.d/​90-custom.ini</​code>​ Ainsi on garde la configuration par défaut de l'​image mais on ajoute notre config customisée en dernier, afin d'​écraser les valeurs prédéfinies (''​conf.d/​90-custom.ini''​, ces fichiers sont chargés par ordre alphabétique).\\  
-Si on préfère on peut aussi écraser complètement le fichier ​**/​etc/​php5/​apache2/​php.ini**.+Si on préfère on peut aussi écraser complètement le fichier ​''​/​etc/​php5/​apache2/​php.ini''​.
  
-Pour Apache on peut si on le souhaite définir une liste de VirtualHosts (chacun dans un fichier ​**.conf** dans le répertoire ​**~/​config/​virtualhosts**) :+Pour Apache on peut si on le souhaite définir une liste de VirtualHosts (chacun dans un fichier ​''​.conf'' ​dans le répertoire ​''​~/​config/​virtualhosts''​) :
 <​code>​-v ~/​config/​virtualhosts:/​etc/​apache2/​sites-enabled</​code>​ <​code>​-v ~/​config/​virtualhosts:/​etc/​apache2/​sites-enabled</​code>​
 +
 ==== Création de Dockerfiles personnalisés ==== ==== Création de Dockerfiles personnalisés ====
  
Ligne 163: Ligne 160:
  
 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 : [[https://​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 :
 <​code>​docker build -t apache-php5.6 ~/​webserver/</​code>​ <​code>​docker build -t apache-php5.6 ~/​webserver/</​code>​
-après quoi on peut lancer notre image nommée ​**apache-php5.6** dans un conteneur :+après quoi on peut lancer notre image nommée ​''​apache-php5.6'' ​dans un conteneur :
 <​code>​docker run -v ~/​www:/​var/​www/​html -p 80:80 apache-php5.6</​code>​ <​code>​docker run -v ~/​www:/​var/​www/​html -p 80:80 apache-php5.6</​code>​
 +
 ==== Commandes utiles ==== ==== Commandes utiles ====
  
Ligne 177: Ligne 175:
 \\ \\
 <​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>​
Ligne 186: Ligne 184:
 \\ \\
 <​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.
  
 ===== Problèmes connus ===== ===== Problèmes connus =====
 +
 ==== Soucis de fuseaux horaire en PHP==== ==== Soucis de fuseaux horaire en PHP====
-Certains logiciels PHP n'​auront pas de mal à fonctionner tel quel, par exemple SMI(Services Maintenance Interventions) mais d'​autres s'en plaindront sans cesse avec ce genre de message, dans cet exemple il s'agit de Dolibarr :+ 
 +Certains logiciels PHP n'​auront pas de mal à fonctionner tel quel, par exemple SMI (Services Maintenance Interventions) mais d'​autres s'en plaindront sans cesse avec ce genre de message, dans cet exemple il s'agit de Dolibarr :
 <​code>​Warning:​ getdate(): It is not safe to rely on the system'​s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone '​UTC'​ for now, but please set date.timezone to select your timezone. in /​var/​www/​html/​dolibarr/​htdocs/​core/​lib/​functions.lib.php on line 1702</​code> ​ <​code>​Warning:​ getdate(): It is not safe to rely on the system'​s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone '​UTC'​ for now, but please set date.timezone to select your timezone. in /​var/​www/​html/​dolibarr/​htdocs/​core/​lib/​functions.lib.php on line 1702</​code> ​
  
 Ceci est dû au fait que le conteneur Docker ne donne pas accès par défaut a la configuration de fuseaux horaires définie dans le système hôte, ce problème peut facilement être résolu en deux étapes simples. Ceci est dû au fait que le conteneur Docker ne donne pas accès par défaut a la configuration de fuseaux horaires définie dans le système hôte, ce problème peut facilement être résolu en deux étapes simples.
  
-Le principe est de créer un fichier timezone.ini dans le même répertoire que le fichier docker-compose.yml contenant la ligne de commande de la timezone et d'en inclure la déclaration dans le fichier docker-compose.yml. +Le principe est de créer un fichier ​''​timezone.ini'' ​dans le même répertoire que le fichier ​''​docker-compose.yml'' ​contenant la ligne de commande de la timezone et d'en inclure la déclaration dans le fichier ​''​docker-compose.yml''​.
- +
-Pour cela créer un fichier timezone.ini et y mettre juste ceci : +
-<​code>​date.timezone=Europe/​Paris</​code>​+
  
-Insérer cette ligne dans le fichier docker-compose.yml pour déclarer la présence du fichier .ini  dans la section web:+Pour cela créer un fichier ​''​timezone.ini''​ et y mettre juste ceci : 
 +<​file>​date.timezone=Europe/​Paris</​file>​
  
-<code>​volumes:​+Insérer cette ligne dans le fichier ''​docker-compose.yml''​ pour déclarer la présence du ''​fichier .ini''​ dans la section ''​web''​ : 
 +<file>​volumes:​
             - ~/​www:/​var/​www/​html ​           ​             - ~/​www:/​var/​www/​html ​           ​
-            - "​./​timezone.ini:/​usr/​local/​etc/​php/​conf.d/​timezone.ini"</​code>+            - "​./​timezone.ini:/​usr/​local/​etc/​php/​conf.d/​timezone.ini"</​file>
  
-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.txt
  • Dernière modification: Le 02/07/2025, 17:28
  • par krodelabestiole