Docker et l’utilisation de containers

Récemment, j’ai décidé d’apprendre à développer avec Symfony. Pour avoir un bon aperçu de son fonctionnement, j’ai décidé de suivre les étapes de « The Fast Track » – un tuto disponible sur le site de Symfony. Celui-ci utilise Docker pour la base de données et pour Redis. J’ai donc décidé d’en apprendre davantage sur le fonctionnement de Docker avant d’aller plus loin avec Symfony.

Qu’est-ce que Docker ?

Docker est un logiciel créé par Solomon Hykes et développé par Docker, Inc. Il permet de créer des environnements – appelés « containers » – permettant d’isoler des applications. Il est sorti en mars 2013 et continue d’évoluer en 2020. Docker est actuellement disponible pour Linux, Mac et Windows.

Docker

Sa licence, quant à elle, peut paraître moins claire. En 2013, il est sorti en tant que logiciel open-source sous Apache License 2.0. Depuis, son code source utilise toujours la même licence, mais certaines éditions peuvent intégrer des binaires qui ne le sont pas. Ainsi, les éditions communautaires disponibles sur Linux sont open-source, tandis que d’autres éditions communautaires (comme celles pour Mac et Windows) peuvent intégrer des composants qui ne le sont pas.

D’accord, mais… qu’est-ce qu’un « container » ?

Un « container », ou conteneur en français, est une enveloppe virtuelle qui regroupe tous les fichiers nécessaires à l’exécution d’une application. Le principe est proche des machines virtuelles que vous pouvez gérer avec Virtualbox tout en fonctionnant différemment.

Une machine virtuelle embarque un système d’exploitation et ses propres ressources. Elle isole l’ensemble de la machine hôte. Il faut donc lui attribuer des ressources comme du stockage ou de la RAM. En revanche, un conteneur s’appuie directement sur le système d’exploitation depuis lequel il est déployé (la machine hôte). Il n’embarque pas de système d’exploitation et il va partager les ressources de la machine hôte. Il va uniquement isoler les fichiers nécessaires à l’application qu’il doit exécuter.

Différence entre conteneur et machine virtuelle
Source : Docker – https://www.docker.com/resources/what-container

Ainsi, Docker consomme moins de ressources qu’une machine virtuelle. Il est donc possible de lancer plusieurs conteneurs en même tant sans ralentir la machine hôte. Docker accélère également le déploiement d’une application tout en améliorant sa portabilité puisqu’un conteneur va regrouper tous les fichiers nécessaires à son exécution.

Comment gérer des containers avec Docker ?

N’ayant pas testé sur Windows ni Mac, ici je m’attarderai à l’utilisation de Docker sur Linux, et plus précisément Manjaro.

Installation et configuration de Docker

Docker est certainement disponible dans les dépôts de votre distribution Linux, vous pouvez donc utiliser votre gestionnaire de paquet pour l’installer. Sur Manjaro :

sudo pacman -S docker

Pour pouvoir l’utiliser, à la manière d’Apache, il faut démarrer le service. Pour cela :

sudo systemctl start docker

// Si vous souhaitez arrêter le service :
sudo systemctl stop docker

// Si vous souhaitez qu’il démarre au démarrage de votre machine :
sudo systemctl enable docker

Si vous souhaitez utiliser Docker sans sudo, il faut ajouter votre utilisateur au groupe docker puis redémarrer le service. En revanche, si vous le faîtes, sachez que cela peut poser des problèmes de sécurité.

Utiliser Docker : les commandes utiles

Pour vous familiariser avec Docker, vous pouvez suivre le tutoriel proposé sur leur site. Vous y trouverez ainsi les commandes de base aussi bien pour utiliser une image que pour en créer une. Pour un usage plus avancé, le site propose également une documentation. Ici, je vais me restreindre à l’utilisation de conteneurs. Si vous souhaitez créer une image, consultez plutôt la documentation ou le tutoriel.

Gérer les images

  • Rechercher une image

Pour trouver une image, vous pouvez utiliser le site DockerHub. Il permet de rechercher des images par mots-clés, mais également en utilisant des filtres comme les catégories. Vous pourrez également filtrer les images en les limitant aux images officielles et aux éditeurs vérifiés, ce qui est utile pour limiter les risques. Vous pouvez également utiliser votre terminal grâce à la commande :

sudo docker search <mot-clé>
  • Télécharger une image
sudo docker pull <image>
  • Lister les images téléchargées
sudo docker images

Si vous vous demandez où se trouvent ces images, il faut se rendre (en root) dans le dossier /var/lib/docker/image/overlay2/. Vous y trouverez d’ailleurs un fichier repositories.json qui liste ces images.

Gérer les conteneurs

  • Démarrer un nouveau conteneur
sudo docker run -d -p 80:80 <image>

// Que fait cette commande ?
run : permet de démarrer un nouveau conteneur
-d : indique de lancer le conteneur en arrière plan
-p 80:80 : indique les ports à utiliser
<image> : indique le nom de l’image à utiliser
  • Lister les conteneurs actifs
sudo docker ps

// ou

sudo docker container ls
  • Arrêter un conteneur
sudo docker stop <container-id>

// <container-id> peut être obtenu grâce à la commande précédente
  • Supprimer un conteneur après l’avoir arrêté
sudo docker rm <container-id>
  • Démarrer un conteneur arrêté
sudo docker start <container-id>
  • Redémarrer un conteneur
sudo docker restart <container-id>

Docker-compose pour une gestion facilité

Qu’est-ce que docker-compose ?

Docker-compose est un outil pour définir et lancer de multiples conteneurs Docker. Grâce à un fichier YAML, il est possible de définir les différents services dont nous avons besoin et, avec une seule commande, de créer les conteneurs. Ce fichier contiendra le nom de l’image et les différentes configurations associées. Par exemple, pour une base de données il sera possible de préciser le nom d’utilisateur, le mot de passe et le nom de la base.

Il est possible de faire la même chose en ligne de commande, mais vous devrez le faire pour chaque conteneur. Maintenant, imaginez que vous êtes plusieurs à travailler sur un projet et vous souhaitez que chaque collaborateur utilise les mêmes conteneurs avec les mêmes configurations. En les listant dans un fichier docker-compose.yml vous pouvez facilement les partager.

Comment ça fonctionne ?

Pour commencer, il faut installer docker-compose :

sudo pacman -S docker-compose

Ensuite, il suffit de créer un fichier docker-compose.yml à la racine de votre projet. Vous pourrez par exemple y définir :

version: "3"

services:
  database:
    image: postgres:11-alpine
    environment:
      POSTGRES_USER: main
      POSTGRES_PASSWORD: main
      POSTGRES_DB: main
    ports:
      - 5432:5432
  pgadmin:
    restart: always
    image: dockage/phppgadmin:latest
    environment:
      PHP_PG_ADMIN_SERVER_HOST: database
      PHP_PG_ADMIN_SERVER_PORT: 5432
    ports:
      - 8080:80
  redis:
    image: redis:5-alpine
    ports: [6379]

Cet exemple provient du tutoriel Symfony, j’y ai rajouté phppgadmin pour l’interface d’administration de postgres. Je précise, vu que j’ai laissé le numéro de version à 3 et qu’il est préférable d’utiliser la dernière version supportée (actuellement 3.8).

Maintenant, il ne reste plus qu’à démarrer ces 3 conteneurs (postgres, phppgadmin et redis) :

docker-compose up -d

// Que fait cette commande ?
up : crée et démarre les conteneurs
-d : indique de lancer le conteneur en arrière plan

Docker + docker-compose : en résumé

Une fois les deux logiciels installés, il suffit de :

  • démarrer le service Docker
  • créer un fichier docker-compose.yml avec les conteneurs à démarrer
  • exécuter docker-compose up -d

Vos conteneurs sont maintenant utilisables !

Dans cet article, je me suis limité à un usage basique de Docker. Il est par exemple possible de créer ses propres images. Les deux logiciels proposent également d’autres commandes que je n’ai pas citées ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.