Créer un container Lamp sous debian:jessie

Bonjour,

Pour mon stage, je dois mettre un place Docker, précisément un sous Debian:jessie, intégrent Lamp à l’intérieur même de se container.

après nombreuses recherche sur les commande de base afin de comprendre le fonctionnement de Docker, (images, container, port d’écoute…)

je fais appel à vous car je n’arrive pas à installer correctement mon container LAMP dans mon image Debian:jessie.

pouvez vous m’aidez SVP?

Matt90

Bonjour @matt90,

Note: I don’t know if there’s a policy about language here, but I speak French and I figured I might as well answer this one.


LAMP comme dans Linux Apache MySQL PHP? Ça à l’encontre des principes de Docker qui est de rouler un seul processus (ou un seul “service” - Apache fork plusieurs processus et cela est OK) à l’intérieur d’un container.

Normalement, avec Dcker, vous devriez avoir :

Avec ces images, vous devriez être capable d’y copier votre code PHP (dans le premier container) et vos données (dans le deuxième). Pour que PHP puisse communiquer à MySQL, vous aurez peut-être besoin d’ouvrir des ports et tout.

Déjà, laissez-moi savoir si cela vous aide. Il me fera plaisir de répondre à vos questions.

Alexandre

Bonjour Alexandre,
merci tout d’abord pour votre réponse.

Je me suis moi même posé la question par rapport à la politique de language, je comprend l’anglais mais c’est plus facile pour moi le français.

Oui on parle bien de Linux Apache MySQL PHP.

Après 3 semaines à travailler sur Docker, étant parti de 0, je m’étais dit que peut être il fallait créer un dockerfile afin de faire tourner LAMP dans une seul même image mais j’ai du prendre la mauvaise voix…

Si je suis votre explication, dans un premier temps il faut que je monte les 2 images, et à l’intérieur de ma 1er image j’y rentre mon code PHP et que je “commit” et dans ma 2eme image j’y intègre mes données MySQL.

et par la suite il faudra faire communiquer les deux containers ensemble.( en ouvrant des port d’écoute)
Si j’ai bien compris c’est sa.

dans un premier temps il faut que je monte mon image apache et à l’interieur y mette PHP
" # docker pull HTTPD" ?

Matthieu

Les pages Docker Hub pour MySQL et PHP contiennent quelques exemples, mais je vais élaborer un peu pour vous donner une piste pour démarrer.

#MySQL

L’image MySQL est en soi très bien et vous ne devriez pas avoir besoin d’y installer de logiciel supplémentaire. Cela veut dire que vous pouvez juste lancer le container avec les bons arguments et votre MySQL sera prêt :

docker run \
    --name mon-mysql \
    -v /votre/PC:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=my-secret-pw \
    -d \
    mysql:5.7

Explications :

  • --name mon-mysql = nomme le container. Visible lorsque qu’on fait docker ps
  • -v /votre/PC:/var/lib/mysql = Docker gardera le répertoire /votre/PC sur votre poste en synchro avec le répertoire /var/lib/mysql du container. Cela veut dire que les données vont survivre à la destruction / recréation du container. C’est parfait pour la persistance.
  • -e MYSQL_ROOT_PASSWORD=my-secret-pw = est utilisé par l’image MySQL pour changer le mot de pass du user root de MySQL
  • -d = démarre le container en deamon
  • mysql:5.7 = utilise l’image mysql, version 5.7
  • De plus, l’image mysql expose déjà le port 3306, aucune action supplémentaire requise.

Une fois cette commande docker run lancée, le code PHP devrait pouvoir s’y connecter avec quelque chose comme ceci :

new mysqli(192.168.99.100:3306, "root", "my-secret-pw");

À noter que cette ligne suppose que le code PHP est à l’extérieur du host Docker. Par exemple, si vous êtes sur Windows, votre machine Docker est à l’intérieur de VirtualBox, accessible au 192.168.99.100 (par défaut) alors que votre code est pour l’instant dans votre IDE.

#Apache et PHP
Reste à créer le serveur Apache+PHP. Ici vous avez deux choix :

  1. Créer une nouvelle image à partir de php:5.6-apache et y copier votre code.
  2. Prendre l’image php:5.6-apache et utiliser les volumes.

Nouvelle image

Dans le cas #1, voici à quoi ça ressemble :
mon-php/Dockerfile:

FROM php:5.6-apache
COPY dist/ /var/www/html/php/
COPY mon-php.ini /usr/local/etc/php/php.ini

Explications :

  • dist/ est un répertoire quelconque qui contient le code PHP. L’image php:5.6-apache va charger tout ce qui est dans /var/www/html/php/, donc c’est là qu’on copie notre code
  • COPY config/php.ini /usr/local/etc/php/ = est un exemple d’utilisation d’un fichier php.ini personnalisé.

Par contre, avant de créer l’image PHP, il faut ajuster la ligne de connection que j’ai donné ci-dessus. À partir de votre poste, l’IP 192.168.99.100 était fonctionnelle, mais une fois à l’intérieur du container ça ne fonctionnera plus. À la place, on va donner le nom du container MySQL (les containers peuvent communiquer les uns aux autres par leur noms) :

new mysqli(mon-mysql:3306, "root", "my-secret-pw");

Suite à cela, vous pouvez faire le build et run docker :

  1. docker build -t mon-image-php .
  2. docker run --name mon-php -d mon-image-php

Rendu ici, vous devriez avoir un container Apache et PHP qui écoute sur le port 80 et qui communique avec le container MySQL.

Par contre, le désavantage de cette technique est qu’il faut rebâtir et redémarrer l’instance à chaque changement de code. C’est OK lorsqu’on distribue l’image vers un environnement distant (il faut bien que l’image contienne le code), par contre c’est un peu chiant quand on est activement en train de développer le code. Pour cela, il y a une autre façon de faire :

Image de base et volumes

docker run \
   --name mon-php-lcx \
  -v dist:/var/www/html/php/
  -v mon-php.ini:/usr/local/etc/php/php.ini
   -d \
  php:5.6-apache

De cette façon, les changements de code que vous apporterez sur votre poste (dans le répertoire dist) seront visibles par le container qui aura une version à jour du code. Plus besoin de rebâtir et redémarrer le container.

Cette façon de faire requière, elle aussi, que la connection vers MySQL soit ajustée :

new mysqli(mon-mysql:3306, "root", "my-secret-pw");

Voilà!
Alexandre

it’s ok

mais j’ai pas bien saisie de quand vous parlez de "new mysqli(192.168.99.100:3306, “root”, “my-secret-pw”);

new mysqli(mon-mysql:3306, “root”, “my-secret-pw”);

???

donc j’ai bien verifier j’ai bien mais deux images présente et monté, maintenant il va falloir les faire communiquer ensemble (avec docker-compose)?

Matthieu

Votre code PHP, il se connecte comment à MySQL? Où inscrivez-vous le nom du host MySQL, username et password?

Dans le cas d’un Wordpress, par exemple, ça pourrait ressembler à ceci:

define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'root' );
define( 'DB_PASSWORD', 'my-secret-pw' );
define( 'DB_HOST', 'mon-mysql' );

Peut importe le framework ou produit utilisé le code PHP devra se connecter et s’authentifer avec MySQL.

Pour lier les containers ensemble, oui, vous pouvez utiliser compose.

Bonjour,

je suis un peu perdu là, désoler…

pour le moment mais deux container sous installé et tourne en boucle.

j’ai suivis la commande que vous m’avez marqué plus haut.

mon maitre de stage m’a dit que c’était pour faire tourner aussi du wordpress.

Bonjour @matt90,

Désolé du délais, j’étais en vacances.

Si la partie PHP servira à faire tourner un Wordpress, il y a des images Docker déjà toutes prête que vous pouvez utiliser : https://hub.docker.com/_/wordpress/

Je suppose qu’en 7 jours votre compréhension de Docker a évolué. Laissez-moi savoir si vous avez encore des questions.

Alexandre

Bonjour @aleveille,

Il y a aucun problème en ce qui concerne votre délai de réponse.

Il y a plusieurs services à mettre en place, du Apache-php avec mysql, il y a aussi du Wordpress,…

Oui en une semaine, j’ai pu évoluer un peu plus par rapport à mes connaissances que j’avais les semaines précédentes, depuis lundi, nous sommes moi et mon maître de stage passé en mise en production. nous comprenons mieux le principe des images, des Dockerfiles et des Docker-Compose qui simplifie beaucoup la mise en service.

Pour le moment, j’ai pas de questions particulière à vous poser, mais si à l’avenir, je suis amené à remettre en service Docker, et si je rencontre des problèmes, je vous en ferais pars. :wink:

Merci beaucoup de votre aide et merci d’avoir pris du temps pour moi.

Matthieu