Débuter avec Docker et les containers sous Debian 8
jeudi 23 octobre 2014 à 11:00I. 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.
En 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.
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.
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. 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
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.
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 :
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
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 vide se multiplier. Pour visualiser quels sont les containers en cours d’exécution, on utilisera la commande suivante :
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 comment :
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 !