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
Prochaine révision Les deux révisions suivantes
docker_lamp [Le 22/01/2018, 22:03]
yoritomo [Voir aussi]
docker_lamp [Le 12/04/2019, 14:44]
176.168.104.44 [Mise en place des répertoires de travail]
Ligne 1: Ligne 1:
 {{tag>​Trusty Xenial serveur tutoriel}} {{tag>​Trusty Xenial serveur tutoriel}}
 ---- ----
-{{ :docker_container_engine_logo.png?200|}}+{{ :docker_conteneur_engine_logo.png?200|}}
 ====== Monter un serveur LAMP grâce à Docker ====== ====== Monter un serveur LAMP grâce à Docker ======
  
-[[: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 "containers". 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.).\\ ​
 C'est donc une solution extrêmement pertinente lorsqu'​il s'agit de déployer une plateforme de développement (afin de reproduire n'​importe quel environnement de production),​ ou d'une manière générale de déployer des applications ou des versions de logiciels non supportées par le système courant. De plus cela confère une portabilité très aisée et une grande souplesse à sa configuration. C'est donc une solution extrêmement pertinente lorsqu'​il s'agit de déployer une plateforme de développement (afin de reproduire n'​importe quel environnement de production),​ ou d'une manière générale de déployer des applications ou des versions de logiciels non supportées par le système courant. De plus cela confère une portabilité très aisée et une grande souplesse à sa configuration.
  
Ligne 11: Ligne 11:
  
 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 container ​avec tout le stack [[:​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 containers ​différents. C'est la méthode conseillée par [[:​Docker]],​ qui recommande de séparer chaque processus / service dans un container ​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 !
  
 <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 22: Ligne 22:
 <​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 containers ​+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 devienten effetpossible 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>​
 <​code>​sudo usermod -aG docker $USER</​code>​ <​code>​sudo usermod -aG docker $USER</​code>​
  
Ligne 31: Ligne 31:
 ===== 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 ​container ​ne sont pas persistantes (tout est réinitialisé à chaque lancement du container). L'​intérêt de l'​option **-v** (volume) de Docker est de créer une sorte de lien symbolique entre le container ​et le système hôte, ainsi les fichiers modifiés par le container ​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 ​seront persistés 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 :
-<​code>​mkdir ~/www ~/​mysql</​code>​+<​code>​mkdir ​-p ~/.docker/www ~/.docker/​mysql</​code>​
  
 Rendons les lisibles et modifiables par Docker : Rendons les lisibles et modifiables par Docker :
-<​code>​chmod 777 ~/www ~/​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. ​
Ligne 44: Ligne 44:
 ===== Méthode simple ===== ===== Méthode simple =====
  
-Pour cette méthode, choisissons une image contenant ​le stack LAMP complet.\\ +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 container ​avec cette image :+Lançons donc un conteneur ​avec cette image :
 <​code>​docker run -v ~/​www:/​var/​www/​html -v ~/​mysql:/​var/​lib/​mysql -p 80:80 -p 3306:3306 --restart=always lioshi/​lamp:​php5</​code>​ <​code>​docker run -v ~/​www:/​var/​www/​html -v ~/​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 **~/www** et **~/mysql** aux répertoires **/​var/​www/​html** et **/​var/​lib/​mysql** de l'​image Debian dans le container.\\  +L'​option **-v** (volume) relie les répertoires locaux **~/www** et **~/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 container ​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 container ​à 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 container, 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.
  
 Et c'est tout ! Et c'est tout !
Ligne 72: Ligne 72:
   * 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 ​containers ​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 104: Ligne 104:
             - db:​db</​code>​             - db:​db</​code>​
  
-Les **services** sont des containers.\\  +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 ​containers. Par ex. **db:db** signifie que notre container ​**db** (du nom de notre container ​MySQL) correspondra à l'​hôte **db** dans notre container ​**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 containers. 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 containers.\\  +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.\\  
-Et le paramètre **ports** de la même manière que l'​options **-p**, relie les ports qui nous intéressent de nos containers ​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).
  
-Une fois ce fichier mis en place on peut lancer tous nos containers ​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>​
  
Ligne 127: Ligne 127:
 ==== 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 containers ​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 :
Ligne 164: Ligne 164:
 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 container ​:+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 ====
  
-Certaines commandes sont très utiles pour manipuler nos images et nos containers ​:+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 containers. Pour chaque ​container ​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 container. 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>​
Ligne 183: Ligne 183:
 \\ \\  \\ \\ 
 <​code>​docker exec -ti fc2 bash</​code>​ <​code>​docker exec -ti fc2 bash</​code>​
-Se connecter au terminal d'​un ​container ​dont l'id commence par fc2 pour en explorer les entrailles. Souvenez-vous que les modifications disparaîtront au prochain démarrage du container.+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 =====
Ligne 190: Ligne 190:
 <​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 container ​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.
Ligne 203: Ligne 203:
             - "​./​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 container ​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 20/12/2023, 18:08
  • par krodelabestiole