Introduction sur Docker et la gestion des conteneurs

Il y a 6 mois


Voici un petit schéma sur la virtualisation par Hyperviseur et Docker:

Afficher l'image d'origine

Docker utilise le noyau de notre système linux. Si le système hôte est MAC ou WINDOWS, il faut installer une VM contenant un noyau linux. A priori, aujourd’hui ce serait géré de manière quasi transparente avec ces deux OS. Il faut également savoir que Docker n’est compatible qu’avec une architecture 64bits.

Docker c’est un démon et un client :

  • Le démon docker qui s'exécute en arrière-plan et qui s'occupe de gérer les conteneurs.
  • Le client Docker qui permet d'intéragir avec le démon via la socket dans /lib/systemd/system/docker.socket

Docker c’est une communauté active et en pleine croissance. Le docker hub permet de récupérer des images officielles ou non, correspondant à un besoin spécifique (ex: créer un environnement LAMP). (https://hub.docker.com)

Docker c’est aussi une philosophie orientée micro service. Pour un environnement LAMP on évitera d'avoir un conteneur avec Apache, Mysql, Php. On préférera un conteneur par service pour séparer les responsabilités.

 

Pour l’installation de Docker on aura besoin d’installer plusieurs outils :

 

La solution la plus éfficace pour créer une image Docker est d’utiliser un fichier Dockerfile. Attention, la syntaxe du fichier "Dockerfile" est importante et ne contient pas d'extension.

Un exemple de Dockerfile :

FROM nginx

COPY host_nginx.conf /etc/nginx/sites-available/ 
COPY nginx.conf /etc/nginx/nginx.conf

RUN mkdir -p /etc/nginx/sites-enabled/ && \
      ln -s /etc/nginx/sites-available/host_nginx.conf /etc/nginx/sites-enabled/host_nginx 

RUN rm /etc/nginx/conf.d/default.conf 

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"] 

 

FROM nginx : il s’agit de l’image de base utilisée pour construire notre nouvelle image. Ici ce sera nginx:latest.

COPY arg1 arg2 : Copie le fichier ou dossier arg1 de l’hôte dans le chemin indiqué en arg2 dans le conteneur.

RUN cmd : Commande executée lors de la construction de l’image.

EXPOSE 80: Ouvre le port 80 du containeur.

CMD cmd: Cette instruction n’est pas jouée lors de la construction de l’image, mais lors de l’exécution du conteneur. C’est la commande qui va fournir le contexte d’utilisation du conteneur.

 

Ensuite pour construire l’image il suffit d’exécuter la commande :

docker build -t nom_image .

Attention le “.” à la fin est important, il indique où trouver le fichier Dockerfile.

 

Les commandes de base à savoir :

  • docker images : permet de lister les images docker disponibles sur votre machine.
  • docker ps : affiche les conteneurs en cours d’exécution.
  • docker ps -a : affiche les conteneurs arrêtés. Il peuvent être redémarrés grâce à la commande “docker start name”.

Avec cette solution, il faut gérer chaque conteneur de maniàre indépendante, ce qui peut vite devenir compliqué lorsque l'architecture va se compléxifier. Avec docker compose, il est possible possible d’orchestrer nos conteneurs et par conséquent de les gérer d’un bloc. On parle alors d'orchestrateur, pratique pour deployer d’un seul coup plusieurs instances et les manipuler. Nous allons donc utiliser un fichier docker-compose.yml qui servira pour cette orchestration.

Exemple d’un docker-compose.yml pour un environnement de type : Nginx/Php-fpm/MySql :

 

version: '2'
services:
  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravel
      MYSQL_ROOT_PASSWORD: to_rename

  php-fpm:
    build:
      context: ./php-fpm/
    container_name: php-fpm
    ports:
      - 9000:9000
    volumes_from:
      - project

  nginx:
    build:
      context: ./nginx/
    container_name: nginx
    ports:
      - 8080:80
    volumes_from:
      - project

  project:
    build:
      context: ./volumes/project/
    container_name: project
    volumes:
      - $HOME/web/folder_test_docker:/var/www/html

 

Chaque service représente une future instance docker. Il existe plusieurs solutions pour créer l’image. Soit on utilise l’attribut “image” avec comme paramètre le nom de l’image (de la même manière que le FROM dans le Dockerfile). Ou alors, on utilise un Dockerfile. Dans ce cas il faudra utilisé l’attribut “build” et “context” pour définir le chemin du dossier contenant le fichier.

L’attribut “ports” permet de gérer le mapping des ports entre le conteneur et la machine hôte. Par exemple pour Nginx on EXPOSE le port 80 et celui-ci est mappé sur le port 8080 de l’hôte.

Le conteneur project est un peu spécifique car il s’agit uniquement d’un conteneur de volume de données. Cela permet de pouvoir le monter sur plusieurs conteneurs, NGINX (pour les fichiers statiques) et PHP-FPM (pour les .php) dans notre cas. Le Dockerfile contient l’image busybox qui est une image ultra légere parfaite pour cette utilisation, ainsi que l’instruction volume pour créer un point de montage dans l’image qui pourra être appelé dans l’hôte ou tout autre conteneur.

 

FROM busybox:glibc

VOLUME /var/www

Pour lancer nos conteneurs il suffit d’exécuter :

$ docker-compose up -d

-d” pour detach, cela permet de lancer les conteneurs en arrière plan.

--build” lorsque l’on relance la commande pour prendre en compte les modifications apportées à nos fichiers.

A savoir : lorsque l'on relance la commande seule, les conteneurs modifiés seront rebuildés. Ce qui est efficace face à des outils comme vagrant où il faut rejouer l'ensemble du fichier de provisionning.

 

Pour supprimer nos conteneurs, il suffit d'exécuter la commande down. Cela laissera tout de même les images créés visibles avec la commande "docker ps".

$ docker-compose down

Lors de l’utilisation d’un docker-compose.yml , nous créons également un network spécifique à l’ensemble des conteneurs, que l’on peut voir avec la commande :

$ docker network list

docker network list

Pour obtenir plus d'information sur ce réseau vous pouvez taper la commande suivante qui vous renverra un JSON avec notamment les ip associés à chaque conteneur.

$ docker network inspect network_name

 

J'espère que cette courte introduction sur docker et l'orchestration vous sera utile et vous donnera envie de vous pencher sur cette technologie. Par ailleurs, je vous conseille vivement de lire le livre suivant que je trouve vraiment bien sur l'univers et l'utilisation de Docker.

Livre docker