Débuter avec Docker et les containers sous Debian 8

I. Présentation de Docker

Aujourd'hui, nous allons parler container avec la solution Docker. L'objectif de Docker n'est pas la création de machines virtuelles, il s'agit là de la création de container, mais alors quelle est la différence ? Nous verrons cela en début d'article, pour que tout cela soit clair dès le départ.

docker0En fait, Docker a pour objectif de faciliter le déploiement d'applications, d'avoir plusieurs versions d'une même application sur un son serveur (phase de développement, tests), mais aussi d'automatiser le packaging d'applications. Avec Docker, on s'oriente vers de l'intégration et du déploiement en continu grâce au système de container.

De plus, Docker permet de garder son système de base propre, tout en installant de nouvelles fonctionnalités au sein de containers. En quelque sorte, on part d'une base qui est le système d'exploitation et on ajoute différentes briques conteneurisées qui sont les applications.

Dans ce tutoriel, nous verrons ce qu'est Docker, la différence entre une VM et un container, mais également comment installer Docker et comment créer son premier container avec Docker. Pour ma part, je me trouve sur une machine virtuelle sous Debian 8 Jessie.

Note : Docker nécessite une installation 64 bits de votre distribution pour fonctionner.

II. Entre virtualisation et container

De nos jours, les machines virtuelles sont très répandues et de nombreux logiciels (hyperviseurs) de virtualisation existent : Hyper-V, VMware Workstation, VMware ESXi, VirtualBox, Proxmox, etc. Pour ne citer qu'eux.

Avec une machine virtuelle, on propose une couche d'abstraction au-dessus d'un système d'exploitation existant. Il s'agit de simuler l'exécution de très bas niveau d'un système d'exploitation par-dessus un système d'exploitation existant, sans créer de liaison entre les deux. Finalement, une machine virtuelle est tout simplement la simulation d'une machine physique sur une machine physique déjà installée, et ce grâce à un hyperviseur.

Par ailleurs, un container s'appuie sur le système d'exploitation de l'hôte pour fonctionner. Il s'agit de simuler un ensemble applicatif au sein de l'OS de l'hôte, cela de façon isolée au sein d'un container. Un container est léger, performant et peut être déployé rapidement, car il partage ses ressources avec le système d'exploitation de l'hôte physique : kernel, périphériques, processeur, RAM, etc.

Docker - Container VS VM
Source : Docker.io - CONTAINER vs VM

III. Installation de Docker

Étant sous Debian 8, il est possible d'installer Docker directement grâce au paquet "docker.io" disponible dans les dépôts Debian :

apt-get update
apt-get install docker.io

Comme le montre la copie d'écran ci-dessous, Docker nécessite moins de 50 Mo pour l'installation.

docker1

Note : Avec Debian 7, il est nécessaire d'ajouter la source "deb http://http.debian.net/debian wheezy-backports main" dans le fichier sources.list. On pourra ensuite exécuter la commande "apt-get update" pour mettre à jour notre liste de source. Ensuite, exécutez la commande "apt-get install -t wheezy-backports linux-image-amd64" et installez Docker grâce à la commande d'exécution d'un script suivante "curl -sSL https://get.docker.com/ | sh".

Lorsque l'installation sera terminée, il suffit de démarrer le service Docker comme un quelconque service :

service docker start

Nous pouvons passer à l'utilisation d'un container, nous prendrons un container LAMP comme exemple.

IV. Utilisation d'un container Docker

Docker propose de nombreux templates qui permettent de déployer des applications en container, très rapidement. La communauté est très active, ce qui permet aux utilisateurs de disposer de nombreux containers applicatifs préfaits.

Docker est basé sur LXC (Linux Containers) qui est une référence sous Linux quant à l'utilisation des containers. Par ailleurs, Docker intègre les éléments suivants :

- cgroups (Control Groups) : Fonctionnalité du noyau Linux pour limiter, compter et isoler les ressources (CPU, RAM, etc.) utilisées par un groupe de processus.

- AppArmor et SElinux : Gestion avancée des permissions aussi bien au niveau des applications qu'au niveau du système de fichiers.

- Kernel namespace : Fonctionnalité du noyau Linux qui permet l'isolation, afin de s'assurer qu'un container ne puisse pas en affecter un autre.

- chroot : Fonctionnalité qui permet de changer la racine d'un processus, afin de l'isoler sur un système par mesure de sécurité.

Docker propose des services pour effectuer facilement différentes actions : créer, éditer, publier et exécuter des containers. Vous entendrez souvent parler de containers, d'images et de DockerFile :

  • DockerFile : Fichier source qui contient les instructions, éléments à installer, c'est un fichier de configuration.
  • Image : Compilation d'un fichier DockerFile pour former une image portable, prête à être déployée
  • Container : Exécution d'une image, mise en container d'une image.

Les trois termes ci-dessus sont importants, notamment si vous souhaitez vous lancer dans la création de votre propre ensemble Docker.

Le saviez-vous ? Docker est développé avec le langage Go

Passons à la pratique ! Dans ce premier tutoriel, nous allons déployer un container LAMP (Linux Apache MySQL PHP) afin de déployer un serveur web grâce à Docker.

A. Rechercher un container Docker

Nous souhaitons obtenir un container LAMP, pour cela nous allons regarder les images dans les dépôts Docker :

docker search lamp

docker2

La liste que l'on obtient est longue... Il y a de la concurrence et du choix ! Pour faire votre choix, appuyez-vous sur trois critères principaux : la description, la popularité du container (stars) et le fait que ce soit un container officiel ou non.

Vous pouvez aussi consulter au préalable le repository de Docker : Docker Browser

Pour ma part, je pars sur l'image "tutum/lamp" qui est à l'heure actuelle l'image container de LAMP la mieux notée.

B. Installer un container Docker

La commande pour installer (récupérer, déployer) une image de container sur sa machine est la suivante :

docker pull tutum/lamp

Il suffit de remplacer tutum/lamp par le nom de l'image choisie.

docker3

C. Démarrer le container Docker "LAMP"

Le démarrage d'un container s'effectue grâce à "docker run", comme ceci :

docker run -d -p 80:80 -p 3306:3306 tutum/lamp

Ce container écoute sur deux ports : le 80 pour le HTTP, le 3306 pour les connexions MySQL. On peut alors accéder à notre serveur web :

docker5

Il faut savoir que chaque container peut disposer de ces options d'exécution et de configuration. Pour cela, il faut consulter la "fiche" du container concerné sur le repository de Docker.

L'option -p permet d'indiquer les ports d'écoutes du container et fonctionne sous cette forme :

docker run -p <hôte_port1>:<container_port1> -p <hôte_port2>:<container_port2>

Le port d'hôte correspond au port sur lequel vous devez contacter l'hôte pour accéder au service, le port container correspond au port vers lequel sera redirigée la requête au niveau du container. Il y a en fin de compte un "NATage" de ports.

Si l'on regarde les ports listen sur notre serveur Debian 8, on remarque qu'il y a "docker-proxy" en écoute sur les deux ports que nous avons indiqués précédemment (80 et 3306) :

netstat -petula

docker6

V. Redémarrer et arrêter un container

Démarrer un container c'est bien, savoir l'arrêter et le redémarrer c'est encore mieux. Pour cela, deux commandes sont à connaître :

  • Docker : Redémarrer un container
docker start <container-id-ou-container-name>
  • Docker : Arrêter un container
docker stop <container-id-ou-container-name>

Note : Le fait de redémarrer un container (d'ailleurs, c'est bien start et non restart), ne réinitialise pas ses options il sera exécuté avec les mêmes options que l'exécution initiale.

Comment savoir le nom ou l'ID d'un container ? Réponse à l'étape suivante.

VI. Quels sont les containers Docker en cours ?

Un container par ci, un container par là... L'exécution des containers peut vite se multiplier. Pour visualiser quels sont les containers en cours d'exécution, on utilisera la commande suivante :

docker7

Vous remarquerez sur la copie d'écran que le container tutum/lamp est bien en cours d'exécution (c'est celui que nous avons exécuté précédemment).

Voici la signification des différentes colonnes :

  • CONTAINER ID : Identifiant du container.
  • IMAGE : Identifiant nominatif de l'image du container, avec notamment la version comme ici "latest" puisque c'est la plus récente.
  • COMMAND : Commande passée en paramètre lorsque le container a été créé.
  • CREATED : Date de création du container, ici "Il y a 5 heures".
  • STATUS : État du container, ici "En cours d'exécution depuis 5 heures".
  • PORTS : Les différentes redirections de ports configurées, rappelez-vous l'option -p...
  • NAMES : Nom aléatoire donné au conteneur, ceci est personnalisable grâce à l'option -name lors de l'exécution docker run.

VII. Consulter l'aide

Pour vous guider, comptez sur la documentation officielle de Docker mais également sur les fichiers man :

man docker

Mais également plus précisément pour chaque commande :

man docker run

Ainsi, vous obtiendrez des informations précieuses quant à l'utilisation de certaines options, certaines commandes, si vous désirez déjà aller plus loin dans l'utilisation de Docker.

Documentation officielle : docs.docker.com

Ce premier tutoriel sur Docker touche à sa fin, il vous permettra de débuter sous Docker et de mieux comprendre la documentation officielle et les différents man fournis. N'hésitez pas à partager vos avis et expérience sur ce très bel outil !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5500.Voir tous les posts

22 thoughts on “Débuter avec Docker et les containers sous Debian 8

  • Salut Florian,

    Encore un très bon article bien rédigé et explicite !!
    Cependant il y a deux trois coquilles :
    – Dans la première partie, tu as écris « en part d’une base qui est … » ca ne serait pas « On part d’une base qui est … ».
    – Dans la 5eme partie, je pense que tu as inversé les deux lignes de commandes …

    Ceci dit, encore félicitations pour cet article et ton site !!

    Bonne continuation !

    Répondre
    • Salut Mathieu,

      Effectivement il y avait bien les deux erreurs que tu me signales, c’est corrigé, merci ! Comme quoi même après une relecture il peut rester encore des erreurs.

      Merci pour les compliments par rapport au site, c’est encourageant.
      A bientôt, j’espère.
      Florian

      Répondre
  • Article , très interessant , j’ai également lu dernièrement un article dans linux magazine N°174 sur Docker .

    Répondre
    • Ah, cela m’arrive d’acheter ce magazine mais là ça fait un moment que je ne l’ai pas pris, du coup pas vu cet article. Merci pour l’info.

      Florian

      Répondre
  • Article intéressant en effet. Je tiens à te dire que j’ai vu deux erreurs de français par contre!

    -1ère partie, 31er §: c’est « quelle est la différence? »

    -1ère partie, 3ème §: « tout en installation », ça doit être « tout en installant »

    Répondre
    • Bonjour Akiren,

      Merci pour la correction, j’ai rectifié l’article ! 🙂

      A bientôt,
      Florian

      Répondre
  • Une petite typo:
    VI. Quels sont les containers Docker en cours ?
    Un container par ci, un container par là… L’exécution des containers peut vi_d_e se multiplier.

    s/vide/vite/

    Répondre
    • Bonjour Lo,

      C’est corrigé, merci 🙂

      Bonne journée
      Florian

      Répondre
  • Tres bon article, je tiens cependant a preciser qu’une image et un conteneur sont deux chose differentes. L’article ne semble pas faire la difference de façon claire.

    Quand on fait un docker search, c’est pour chercher une image. Et quand on fait un docker pull, c’est pour recuperer une image.

    On demarre un conteneur a partir d’une image, docker run. On peut creer une image a partir d’un conteneur, docker commit.

    http://docs.docker.com/terms/image/

    Répondre
    • Salut LeMeteore,

      Merci pour les précisions apportées car il est vrai que je n’ai pas expliqué en détails la différence entre une image et un container.

      Bon week-end et à bientôt
      Florian

      Répondre
  • Merci pour cet article, c’est une bonne introduction au sujet.

    Répondre
  • Bonjour,
    Je suis novice et j’ai lu avec intérêt votre poste.
    J’ai une question, certes naïve, qui concerne l’utilisation du container sous la forme d’un « sous-serveur ». Peut-on utiliser Docker pour virtualiser son serveur avec des ip failover?
    Merci d’avance

    Répondre
  • Merci pour cette entrée en matière!
    Si je peux te donner un conseil, un lien en fin d’article vers l’épisode n°2 serait du meilleur effet et serait très pratique!

    Signé : un sysadmin amateur qui va pas dormir ce soir grâce/à cause de tes tutos! 😉

    Répondre
  • Excellent article qui permet de manière très brève de commencer sous docker et de comprendre le principe de fonctionnement.
    Super 🙂

    Répondre
  • Super ! Je comprend bien mieux le fonctionnement 🙂
    Par contre, je viens de lancer la commande : docker run -d -p 80:80….

    Cela veut bien dire que pour accéder à la page de mon serveur je peux aller sur localhost:8080 ?
    Merci ! 🙂

    Répondre
  • Hello,
    Merci pour ce tuto, néanmoins je bloque …
    je « search » des images LAMP, je prend la 1ère, je pull, je run (regarde les logs en dessous) mais ca ne fonctionne pas, aurais tu une idée ?

    root@sophie:/home/arnaud/Docker# docker pull linode/lamp
    Using default tag: latest
    latest: Pulling from linode/lamp
    a3ed95caeb02: Pull complete
    76a4cab4eb20: Pull complete
    d2ff49536f4d: Pull complete
    f94adccdbb9c: Pull complete
    808b5278afbb: Pull complete
    ab367f87d978: Pull complete
    Digest: sha256:4b7af614899c795aa30cb60b62c28b978201c2dca3fb1352a60fec206edb92de
    Status: Downloaded newer image for linode/lamp:latest
    root@sophie:/home/arnaud/Docker# docker run -d -p 80:80 -p 3306:3306 linode/lamp

    => localhost => rien du tout (site inaccessible)
    netstat => aucun service docker lancé (et surtout pas d’écoute sur les ports 80 / 3306)

    testé avec plusieurs images, toujours le même résultat 🙁

    Si tu as une idée … Merci d’avance 🙂

    Répondre

Répondre à Henri Pollet Annuler la réponse

Votre adresse e-mail 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.