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