Formation PUB030 : Laravel, 2019 Les outils de Laravel

2.12 Docker


Docker est une plateforme qui permet de lancer des applications dans des conteneurs isolés afin de permettre leur exécution dans différents environnements.

Contrairement aux machines virtuelles, les applications qui roulent sous Docker utilisent le système d'exploitation de l'hôte, ce qui permet aux conteneurs Docker d'être légers.

Concepts

Image

Une image Docker est un fichier qui contient les instructions pour créer un conteneur.

L'image contient tout ce qu'il faut pour exécuter l'application : son code, ses configurations, ses dépendances, etc.

L'image est créée en couches. Elle peut être basée sur une image existante ou à partir de rien. Dans tous les cas, c'est le fichier Dockerfile qui dicte comment bâtir l'image.

Les images Docker sont souvent comparées aux snapshots d'une machine virtuelle.

Conteneur

Un conteneur Docker est une image en cours d'exécution.

Volume

Les volumes Docker sont un mécanisme qui permet de partager de l'information entre plusieurs conteneurs ou encore de faire persister des informations, par exemple une base de données.

Fichiers pour configurer les images Docker

Dockerfile

Dockerfile est un fichier texte qui contient la liste des commandes requises pour créer une image. Plus précisément, c'est lui qui définit l'environnement dans lequel l'application tournera.

Parmi les configurations intéressantes, notons :

  • FROM : permet de créer l'image à partir d'une autre image existante.
    Fichier Dockerfile

    FROM php:8.0-apache

  • RUN : exécute une commande.
    Fichier Dockerfile

    RUN apt-get update -y && apt-get install -y openssl zip unzip git

  • COPY : copie des fichiers entre l'ordinateur hôte et le conteneur.
    Fichier Dockerfile

    COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

  •  ...

docker-compose.yml (ou .yaml)

Alors que le fichier Dockerfile est utilisé pour bâtir une image, le fichier docker-compose.yml est utilisé pour configurer les conteneurs. C'est dans ce fichier qu'on spécifiera notamment quelle image doit rouler dans chacun des conteneurs définis, par exemple celui du serveur HTTP et celui du serveur de bases de données.

Pour travailler avec le fichier docker-compose.yml, on utilisera docker-compose, un outil qui permet de configurer et d'exécuter un groupe de conteneurs.

Le fichier docker-compose.yml peut contenir les sections suivantes :

  • version
  • services : définit chacun des conteneurs. L'image du conteneur peut être tirée d'un répertoire d'images ou encore être définie dans le fichier Dockerfile.
  • ...

Commandes utiles

Voici une liste non-exhaustive de commandes utiles avec docker et docker-compose.

Commande Utilité Exemple

docker ps

docker-compose ps

Affiche la liste des conteneurs Docker, c'est-à-dire les images en cours d'exécution.

Utile notamment pour connaître le nom des conteneurs et leur identifiant.

Avec docker ps, l'option -a permet de lister toutes les images, qu'elles soient présentement exécutées ou non.

Avec docker ps, l'option -f  permet de lister les conteneurs avec un statut particulier (ex : running, paused, exited). Utile notamment pour supprimer des conteneurs qui ne sont plus fonctionnels (dead).

docker ps

docker ps -a

docker-compose ps

Pour obtenir la liste des conteneurs morts puis les supprimer :

docker ps -f status=dead
docker rm -f nom-conteneur

docker-compose up

Crée et démarre une série de conteneurs à partir du fichier docker-compose.yml.

L'option -d permet de lancer le conteneur en mode détaché. Ceci permettra notamment de continuer à utiliser le terminal dans lequel les conteneurs ont été lancés.

docker-compose up

docker-compose up -d

docker-compose up nom-service

docker run

docker-compose run

Crée un ou plusieurs conteneurs à partir d'images puis démarre ces conteneurs.

docker run est l'équivalement de docker create suivi de docker start.

docker-compose run est généralement utilisé pour lancer une tâche ad-hoc sur un conteneur. Permet d'utiliser des configurations différentes de celles précisées dans docker-compose.yml.

docker run nom-service

docker-compose run --service-ports nom-service

docker-compose run nom-service bash

docker stop

docker-compose stop

Arrête le ou les conteneurs de façon douce en envoyant un signal SIGTERM (graceful shutdown).

docker stop -t 60 nom-conteneur

Pour arrêter tous les conteneurs : 

docker stop -t 60 $(docker ps -q)

ou

docker-compose stop

 
Ctrl + C (Mac, Linux et Windows)

Lorsque ces touches sont appuyées dans la fenêtre Terminal qui a servi à lancer les conteneurs, permet d'arrêter tous les conteneurs de façon douce à l'aide d'un signal SIGINT.

   

docker-compose down

Arrête et supprime les conteneurs. Les réseaux et images créés par docker-compose up seront également supprimés. Si l'option -v est utilisée, les volumes seront aussi supprimés.

Le tout pourra être recréé et redémarré avec docker-compose up mais si l'option -v a été utilisée, les informations contenues dans ces volumes seront perdues.

 

docker kill

docker-compose kill

Arrête un ou plusieurs conteneurs de façon brutale à l'aide d'un signal SIGKILL.

 

docker rm

docker-compose rm

Supprime un ou plusieurs conteneurs.

Avec docker rm, l'option -f permet de supprimer un conteneur pendant qu'il est démarré.

Avec docker-compose rm, les conteneurs doivent être arrêtés. L'option -f permet de ne pas demander de confirmation avant de procéder.

docker rm nom-conteneur

docker-compose rm -f

docker images

docker-compose images

Liste les images Docker.

La version docker-compose ne liste que les images en cours d'exécution.

   
docker info

Affiche les informations sur Docker, ses images et ses conteneurs.

 

docker exec

docker-compose exec

Donne accès à la ligne de commande d'un conteneur.

Avec docker exec, l' option -it permet d'avoir une fenêtre terminal interactive, c'est-à-dire que l'usager pourra y écrire des commandes et en voir le résultat.

docker exec -it nom-conteneur bash

docker-compose exec --user nom-usager alias-conteneur bash -l

docker inspect Retrouve de l'information sur un conteneur. 

Pour obtenir le plus d'informations :

docker-inspect nom-conteneur

Pour obtenir l'adresse IP d'un conteneur :

docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
nom-conteneur

 

Autre technique moins verbeuse pour obtenir l'adresse IP d,un conteneur :

docker inspect nom-conteneur | grep "IPAddress"

docker network ls

Affiche les réseaux virtuels actifs.

 

Accéder à une applicaton Web qui roule dans un conteneur Docker

L'adresse IP du conteneur du serveur HTTP peut être obtenue à l'aide de la commande docker ps.

Terminal

docker ps

Résultat à l'écran

monnom@MacBook-Pro-de-MonNom ~ %docker ps
CONTAINER ID    IMAGE           COMMAND             CREATED          STATUS         PORTS                           NAMES
7211ef67331a    sail-8.1/app    "start-container"    17 hours ago    Up 17 hours    0.0.0.0:80->80/tcp, 8000/tcp    mon-conteneur

Entrer l'adresse IP 0.0.0.0 dans le navigateur pour accéder à l'application Web.

Accéder à une base de données MySQL qui roule dans un conteneur Docker

Les informations pour configurer un logiciel tel que MySQL Workbench dépendent de ce qui a été configuré dans docker-compose.yml.

Par exemple, avec ce fichier :

Fichier docker-compose.yml

...
services:
    ...
    mysql:
        ...
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            ...
            MYSQL_USER: 'monusager'
            MYSQL_PASSWORD: 'monmotdepasse'

Il faut utiliser ces informations :

  • Hostname : 127.0.0.1
  • Port : 3306
  • Username : monusager
  • Password : monmotdepasse

Pour plus d'information

« Docker Cheatsheet ». Github -4loopltd. https://github.com/4loopltd/4loopltd/wiki/Docker-Cheatsheet

« Gracefully Stopping Docker Containers ». Lumen. https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/

« How to Get A Docker Container IP Address - Explained with Examples ». freeCodeCamp. https://www.freecodecamp.org/news/how-to-get-a-docker-container-ip-address-explained-with-examples/

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre