mod_deflate.conf

Dans le dossier .devcontainer/docker/ vous avez créez un fichier vide mod_deflate.conf. Voici le contenu à saisir dans ce fichier :

<filesMatch "\.(js|html|css)$">
    SetOutputFilter DEFLATE
</filesMatch>

Nous expliquerons son utilité dans le chapitre « Dockerfile » juste après la définition du fichier Dockerfile.

Ce fichier est purement facutaltif, il suffit de supprimer la ligne lui faisant référence dans le Dockerfile si vous ne souhaitez pas l’inclure.

Dockerfile

Objectif : obtenir une image docker permettant de créer un conteneur avec Linux, Apache, et PHP. MySQL fera l’objet d’un conteneur distinct.

Tout d’abord nous allons construire une image Docker à partir de laquelle nous créerons un conteneur.

Une image est construite à partir d’un Dockerfile.

FROM centos:7


RUN yum update -y
RUN yum install -y wget
RUN wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
RUN yum install -y yum-utils
RUN yum-config-manager --enable remi-php73
RUN yum install -y \
        php php-common php-opcache php-cli php-gd php-curl php-mysql php-xdebug \
        mod_ssl \
        openssl \
        mysql \
        mlocate \
        vim \
        iproute \
        php-intl

# le package client "mysql" est installé pour permettre, si l'on veut tester, de se connecter depuis ce container à mysql en ligne de commande


# Activation xdebug + définition timezone + installation apache avec http2 activé
RUN echo "zend_extension=/usr/lib64/php-zts/modules/xdebug.so" >> /etc/php.ini && \
        echo "xdebug.remote_enable=1" >> /etc/php.ini && \
	echo "xdebug.remote_autostart=1" >> /etc/php.ini && \
	echo "xdebug.remote_host=localhost" >> /etc/php.ini && \
	echo "xdebug.remote_port=9000" >> /etc/php.ini && \
	sed -i 's,^;date.timezone =.*,date.timezone = "Europe/Paris",' /etc/php.ini && \
	# Following line permit us to install a recent version of httpd which comes with http2 mod
	cd /etc/yum.repos.d && wget https://repo.codeit.guru/codeit.el`rpm -q --qf "%{VERSION}" $(rpm -q --whatprovides redhat-release)`.repo && \
	yum install -y httpd



#
# xdebug.remote_host=<ip-of-debug-client-machine>
# xdebug.remote_host to IP of your host machine, from where you would remote debug the application
# xdebug.remote_port=9000 => This port is important, it will be used by Visual Studio Code

# Clean all yum cache in order to reduce image size (must be done after all yum instructions)
RUN yum clean all
# COPY effectue une copie de fichier depuis le "build" path, donc relatif au build path
# Celui ci est défini soit par la commande build (simple build d'image), soit par l'instruction "build: context:" dans le docker-compose.yml
COPY ./docker/mod_deflate.conf /etc/httpd/conf.d/mod_deflate.conf


EXPOSE 80
# ENTRYPOINT ["executable", "param1", "param2"] =>
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

Notre Dockerfile est créé.

Nous pouvons construire notre image à partir de ce Dockerfile.

Comme vous pouvez le constatez, ce Dockerfile fait référence au fichier .devcontainer/docker/mod_deflate.conf, ce fichier est copié dans le dossier de configuration d’apache. Il sera pris en compte et chargé automatiquement par apache. Cette configuration active la compression dans apache pour le transfert de contenu de type *.js, *.css et *.html. Ceci est facultatif mais nous l’activons pour être dans un environnement proche d’une production (la compression est généralement activée en production).

Maintenant, placez vous dans le dossier où se trouve ce fichier Dockerfile, soit le dossier docker.ltb.com/.devcontainer/ et exécutez la commande de build suivante :

docker image build -f Dockerfile --no-cache -t lampx:v1.0 .

Explications :

  • tout d’abord n’oubliez pas le « . » à la fin de la commande, il s’agit du buid path, et dans notre cas ce « . » désigne le dossier courant
  • lampx:v1.0 => lampx est le nom que nous donnons à l’image construire et v1.0 est le tag que nous donnons à ce build. Un tag est un peu similaire à un tag sur un repository git, cela permet d’identifier une version de votre image. Nous l’expliquerons en toute fin d’article dans la partie « Pour aller plus loin »

A noter ici que le nom « lampx » est un petit peu abusif puisque le serveur MySQL n’est pas embarqué dans cette image.

Vous pouvez vérifier que votre image a bien été créée :

docker image ls

Vous pouvez démarrer un conteneur à partir de cette image :

docker run --name dockerltb -d -p 7080:80 lampx:v1.0 

-p 7080:80 signifie que le port 7080 de votre PC « mappe » le port 80 du conteneur, vous pouvez essayer d’accéder à l’url http://localhost:7080/

Et ensuite vous connecter à ce conteneur :

docker exec -it dockerltb /bin/bash

Vous êtes alors connecté en invite de commande à l’OS de votre conteneur. Vous pouvez exécuter les commandes linux habituelles.

Pour sortir du conteneur tapez : exit

Il est important de noter l’intérêt de pouvoir se connecter au conteneur : cela peut vous permettre de débugger dans certaines situations.

Arrêtons maintenant le conteneur et supprimons le :

docker container stop dockerltb
docker container rm dockerltb

docker compose pour orchestrer vos conteneurs

docker-compose.yml

# version définit le file format accepté, cf. https://docs.docker.com/compose/compose-file/compose-versioning/
version: '3.7'
services:
    dockerltb:
      image: lampx:v1.0
      # /var/www/docker-lampx.lateambichon.com/ est le dossier contenant les sources de votre projets au sein du conteneur
      volumes:
       - ./docker/docker-lampx.lateambichon.conf:/etc/httpd/conf.d/docker-ltb.conf # chargement de votre propre VirtualHost
       - ../:/var/www/docker-lampx.lateambichon.com/
      ports:
       - "7080:80"
       - "7443:443"
      networks:
        - mynetwork

    mysql:
      image: mysql:8
      command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-authentication-plugin=mysql_native_password']
      ports:
       - "33070:33060"
       - "3307:3306"
       # 3307 est le port accessible par l'hôte (notre ordinateur)
       # 3306 lui sera accessible par les containers sur le network mynetwork, donc par les autre conteneurs utilisant ce network (c'est le cas du conteneur docker-ltb)
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=dockerltb
        - MYSQL_USER=dockerltb
        - MYSQL_PASSWORD=password
      volumes:
        - ./docker/dump_database.sql:/docker-entrypoint-initdb.d/dump_database.sql
      networks:
        mynetwork:
          aliases:
            - "dockerltb.mysql.db"
            - "docker-mysql"
            - "mysql"
            - "db"


# On déclare ici le network mynetwork permettant aux 2 containers "isolés" de communiquer entre eux
# On peut vérifier la création de ce réseau via la ligne de commande : docker network ls 
# REMARQUE : sur internet on trouvera le mot clef "links" permettant également de faire communiquer des contenurs, mais il s'agit
# d'un mot clef "legacy", préférez l'utilisation de network aujourd'hui       
networks:
  mynetwork:

Au sein de ce fichier docker-compose.yml on peut remarquer le mot clef « services » qui permet d’introduire le nom des conteneurs que nous allons démarrer.

Le premier conteneur est le conteneur dockerltb, et dans le paramétrage de ce conteneur vous pouvez observer la définition de volumes :

  • nous mappons notre fichier local ./docker/docker-lampx.lateambichon.conf au fichier /etc/httpd/conf.d/docker-ltb.conf au sein du conteneur
  • nous mappons le dossier source de notre projet sur le dossier /var/www/docker-lampx.lateambichon.com au sein du conteneur

docker-lampx.lateambichon.conf

Notre docker-compose.yml fait référence à un fichier docker-lampx.lateambichon.conf. Ce fichier va contenir la définition apache de notre VirtualHost :

<VirtualHost *:80>
    DocumentRoot "/var/www/docker-lampx.lateambichon.com"
    ServerName localhost
	
    <Directory /var/www/docker-lampx.lateambichon.com>
        Options -Indexes -MultiViews -FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Démarrez vos conteneurs : docker-compose up

Placez vous dans le dossier .devcontainer/ et exécutez la commande :

docker-compose up

Vous allez observer un ensemble de logs statuant de l’état du démarrage des différents conteneurs précisés dans votre docker-compose.yml.

Lorsque le démarrage est terminé, vous pouvez vérifier que vous pouvez vous connecter avec votre navigateur internet sur le port 7080. Car rappelez vous la définition du service dockerltb, nous avons indiqué un mapping de port 7080:80 qui signifie que toutes actions réalisées sur le port 7080 de notre host (votre PC) seront exécutées sur le port 80 du conteneur dockerltb, et cela est bidirectionnel.

Si vous descendez plus bas dans la page, vous pourrez vérifier que xdebug est bien activé :

Arrêtez vos conteneurs

Un simple arrêt

Dans votre invite de commande dans laquelle vous avez exécuté docker-compose up, pressez 2 fois successivement Ctrl+C.

Patientez quelques secondes, tous les conteneurs démarrés vont être arrêtés.

Vous pouvez ensuite simplement redémarrer les conteneurs via :

docker-compose up

Un peu plus qu’un simple arrêt

Parfois, docker-compose part en couille de bichon. 😯

Les symptômes sont par exemple : vos conteneurs ne semblent plus fonctionner alors que ça avait toujours fonctionné auparavant, ou bien vous n’arrivez plus à connecter votre Visual Studio Code à un des conteneurs démarré par docker-compose…

Dans ce cas pas de panique, une sorte de « reset » consiste à exécuter la commande suivante après avoir stoppé les conteneurs via Ctrl+C Ctrl+C :

docker-compose down

Par défaut, sans option supplémentaires, la commande docker-compose down supprime :

  • les conteneurs définis pour les services dans votre fichier docker-compose
  • les réseaux définis dans la section networks du fichier docker-compose
  • Le réseau par défaut si un est utilisé

Je vous invite à vous référer à la documentation en ligne si vous désirez en savoir plus sur cette commande : https://docs.docker.com/compose/reference/down/

Pour redémarrer les conteneurs il suffit ensuite d’utiliser d’exécuter la commande :

docker-compose up

<<<< Retour sur la partie 2/5

Aller sur la partie 4/5 >>>>

Partager sur les réseaux