Qu’est-ce que Docker, comment cela fonctionne-t-il ?
Docker est un logiciel libre qui permet de facilité le déploiement d’applications isolées dans des containers logiciels pour être exécutées dans des environnements variés. Docker est un outil très utilisé dans des environnements de développement pour résoudre les problématiques d’intégration (CI) et de déploiement continu (CD).
Présentation Docker
Contrairement aux machines virtuelles reposant sur une infrastructure physique, Docker permet de mutualiser la couche physique et la couche système d’exploitation en empaquetant l’application et ses dépendances (librairies, fichiers de configuration …).
Avantages : un seul OS à administrer, tous les containers sont isolés.
Voici en images la différence entre Container et VM:
Un registre public maintenu par une communauté active permet à Docker de mettre à disposition des containers prêt à être exécutés très rapidement.
Docker est basé sur LXC (Linux Containers) et intègre les éléments suivants :
Fonctionnalité du noyau Linux pour limiter, compter et isoler les ressources (CPU, RAM, etc.) utilisées par un groupe de processus.
Gestion avancée des permissions aussi bien au niveau des applications qu’au niveau du système de fichiers.
Fonctionnalité du noyau Linux qui permet l’isolation, afin de s’assurer qu’un container ne puisse pas en affecter un autre.
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 :
Fichier source qui contient les instructions, éléments à installer, c’est un fichier de configuration.
Compilation d’un fichier DockerFile pour former une image portable, prête à être déployée
Exécution d’une image, mise en container d’une image.
Installation Docker
Pour installer Docker sous Debian 8, il vous suffira de passer par l’outil de gestion des paquets :
apt-get update apt-get install docker.io
Sous 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 les commandes suivantes pour mettre à jour notre liste de source, installer wheezy-backports :
apt-get update apt-get install -t wheezy-backports linux-image-amd64
Installez Docker grâce à la commande d’exécution d’un script suivante :
curl -sSL https://get.docker.com/ | sh
Une fois Docker installé, il vous suffira de lancer le service :
service docker start
Création d’un container Docker
Dans cet exemple, nous installerons un container Nginx depuis les images disponibles dans les dépôts Docker :
# docker search nginx
Pensez à orienter votre choix entre la description, la popularité et le fait que ce soit un container officiel ou non.
Nous allons rapatrier l’image container Nginx officielle :
# docker pull nginx
On vérifie notre liste d’image:
# docker images
On peut constater qu’elle a été bien rapatriée :
REPOSITORY TAG IMAGE ID nginx latest cc1b61406712
On installe le container :
# docker run -d -name=MonServeurNginx nginx:latest
On vérifie que le container est bien installé :
# docker ps -a
Vous pouvez voir votre container ainsi exécuté (retrouvez le détail de la commande docker ps plus bas) puis on démarre notre container :
# docker start
Par défaut, Docker utilise du NAT pour faire correspondre des ports d’entrée sur le serveur renvoyés vers les ports d’écoute des différents containers avec l’option -p :
# docker run -p <hôte_port1>: -p <hôte_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.
Nous allons créer un second container en rajoutant cet argument :
# docker run -d -p 1234:80 -name=MonServeurNginx2 nginx:latest
Vous pourrez voir que le service est actif en ouvrant votre navigateur sur http://IP_HOTE:1234
DockerFile
Vous pouvez créer votre propre container à partir d’un fichier de configuration nommé Dockerfile.
Nous allons créer un container Debian et installer un serveur apache2 accessible depuis l’extérieur.
Voici le contenu du fichier Dockerfile :
### Image FROM debian:stable ### Information sur le propriétaire du container MAINTAINER votreadresse@mail.com ### Commande RUN utilisé uniquement lors de la création du container (nécessite un docker build) RUN apt-get update && apt-get upgrade -y && apt-get install -y apache2 ### Creation variable ENV VARIABLE ma-variable ### PORT 80 Ouvert EXPOSE 80 ### On expose le port SSH pour pouvoir se connecter sur la machine EXPOSE 22 ### Commande passé une fois le container créé (ne nécessite pas un docker build juste un run) ### Commande 1er arg 2eme arg CMD [« /usr/sbin/apache2ctl », »-D », »FOREGROUND »]
Nous pouvons maintenant créer notre container depuis le Dockerfile avec cette commande :
# docker build -t MonApache
On installe notre container en mappant le port 5555 de l’hôte vers le port http du container :
# docker run -d -p 5555:80 -name=MonServeurApache MonApache:latest
Vous pouvez désormais vérifier que le serveur apache est accessible depuis cette URL : http://IP_HOTE:5555
Commandes utiles pour Docker
La commande suivante permet d’afficher la liste des containers en cours d’exécution :
docker ps
Identifiant du container.
Identifiant nominatif de l’image du container.
Commande passée en paramètre lorsque le container a été créé.
Date de création du container.
État du container.
Les différentes redirections de ports configurées.
Nom aléatoire donné au conteneur, ceci est personnalisable grâce à l’option -name lors de l’exécution docker run.
Voici quelques autres commandes utiles :
### Redémarrer un container docker start ### Stopper un container docker stop ### Lister vos images rapatriées docker images ### Afficher les informations du container, dont l'interface IP virtuelle du container par exemple docker inspect ### Supprimer tous les containers actifs docker rm $(docker ps -a -q) ### Supprimer une image docker (vérifiez qu'aucun container n'est actif) docker rmi ### Pour vous connecter directement sur votre container docker run -it /bin/bash
Vous pouvez trouver toutes les images docker sur https://hub.docker.com/explore/
Retrouvez toutes les commandes liées à docker dans l’aide :
man docker