DÉCOUVERTE DE DOCKER

1. Présentation de docker

Docker est un logiciel open source (sous licence Apache 2.0) et un service en ligne optionnel (Docker.io) permettant de gérer des conteneurs (« dockers »). C’est un produit développé par la société de même nom. Initialement développé par un ingénieur français (Solomon HYKES), le produit a été dévoilé en mars 2013.

Docker est une application disponible aussi bien sous Windows que sous Linux. Il va vous permettre d’empaqueter d’autres applications et leurs dépendances dans un conteneur que l’on pourra ensuite déplacer et faire fonctionner sur n’importe qu’elle serveur fonctionnant sous Linux ou sous Windows (les conteneurs Linux vers des Linux et des Windows vers des Windows). Contrairement aux solutions de machines virtuelles (VM) classiques qui comprennent un système hôte (« guest OS ») et les librairies/applications utilisées par le ‘‘guest OS’’ ou l’application finale, les conteneurs ne contiennent, au maximum, que les applications/librairies finales. Cela permet donc d’avoir des conteneurs qui sont moins gourmands en ressource (HDD – CPU – RAM) que des machines virtuelles.

2

De plus une copie d’un conteneur qui ne change que la partie application ne contiendra que les différences par rapport au conteneur initial. Plusieurs conteneurs peuvent être des copies du même conteneur parent, ce qui vous permet de faire un gros gain en espace.

3

Le système qui héberge les conteneurs (l’hôte) est ainsi géré directement par le Docker Engine (en vert dans le premier schéma plus haut). Nous avons ainsi une mutualisation qui permet de lancer les conteneurs de manière presque instantanée, aussi rapide que le lancement d’une simple application. Vu que les conteneurs n’ont pas de système d’exploitation propre et utilisent celui de l’hôte, il n’y a plus de phase de démarrage et d’initialisation du système d’exploitation.

Il faut garder à l’esprit que même si l’on n’est pas dans une machine virtuelle, on dispose tout de même d’un environnement isolé (processus, système de fichier, ports réseau). L’utilisateur n’a qu’à se préoccuper que de ce qu’il veut virtualiser (les applications/services) et ne s’occupe pas du reste. Mais il est aussi possible de configurer manuellement la charge (IPs, ports, ram, processeur …) des conteneurs. La taille des conteneurs est considérablement réduite et ils sont aussi portables d’une machine docker a une autre sans configuration particulière.

2. Installation de docker

Pour faire fonctionner correctement la version actuelle de docker sous Linux, il est conseillé d’avoir un système 64bits et un kernel en version 3.10 minimum. Notre Debian 8 en version 64 bits possède toutes ces caractéristiques.

ouvrir la liste des dépôts

nano  /etc/apt/sources.list

Pensez à ajouter si vous ne les avez pas déjà, les dépôts suivants dans le fichier sources.

deb http://ftp.debian.org/debian jessie-backports main
deb-src http://ftp.debian.org/debian jessie-backports main
deb http://ftp.debian.org/debian jessie main contrib
deb-src http://ftp.debian.org/debian jessie main contrib 

Ensuite taper les commandes suivantes pour mettre à jour la liste de paquet et installer le paquet docker.

sudo apt update 
sudo apt install docker.io

NB: Toutes les manipulations faites avec les commandes docker doivent être faites avec le compte administrateur ayant le maximum de droit root. Ou alors vous pouvez ajouter votre compte utilisateur normal au groupe docker pour ne pas avoir à utiliser le compte root ou la commande sudo a tous les coups.

Maintenant pour vérifier que tout fonctionne correctement taper cette commande qui devrait lancer le conteneur hello-world qui affiche un message dans l’invite de commande avant de s’arrêter.

Vous devriez avoir ceux-ci comme résultat

sudo docker run hello-world
root@sw:/home/arsene# sudo docker run hello-world

Hello from Docker!

This message shows that your installation appears to be working correctly.



To generate this message, Docker took the following steps:

The Docker client contacted the Docker daemon.
The Docker daemon pulled the "hello-world" image from the Docker Hub.
The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.

The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.



To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash



Share images, automate workflows, and more with a free Docker Hub account:

 https://hub.docker.com



For more examples and ideas, visit:

 https://docs.docker.com/engine/userguide/


root@sw:/home/arsene#

Maintenant nous pouvons procéder à la configuration de nos conteneurs. Si vous n’avez aucun résultat rassurez-vous que le service docker est bien lancé avec la commande :

service docker status

Elle vous affichera l’état du service docker. S’il n’est pas lancé, démarrez-le avec la commande :

service docker start

3. Configurer des conteneurs sur docker

Mise en service d’un conteneur : NGINX

On commence par télécharger le conteneur :

sudo docker pull nginx

Ensuite on lance le conteneur, j’ai créé un dossier Webstack : /data/webstack/www qui va contenir les fichiers de configuration de mon serveur et les fichiers de configurations des sites web.

sudo docker run --name webstack_nginx -d -p 80:80 -p 443:443 -v /data/webstack/www:/usr/share/nginx/html/  nginx

Explication :

–name permet de donner un nom à notre conteneur

-d permet de lancer notre conteneur en tâche de fond.

-p permet de spécifier les ports ouverts Port-Hôte : Port-Conteneur  c’est-à-dire les ports de l’hôte qui seront matché avec certains ports du conteneur.

-v permet de monter un dossier ou un fichier de l’hôte vers le conteneur. Ce fichier ou dossier sera vu par le conteneur comme le fichier / dossier de départ.

/data/webstack/www : répertoire de l’hôte ou seront hébergé les sites web que nous allons créer

     /usr/share/nginx/html/ : répertoire par défaut NGINX où sont hébergé les sites.

NGINX est tout simplement le nom de l’image docker que l’on veut démarrer.

Avec la commande précédente le répertoire  /data/webstack/www  est monté en tant que répertoire  /usr/share/nginx/html/ dans notre conteneur. Le conteneur a donc un accès en lecture et en écriture à ce répertoire et nous aussi depuis la machine hôte nous pouvons modifier le contenu de ce répertoire.

Si vous ne souhaitez pas que le conteneur est un accès en écriture, mais uniquement en lecture au dossier ou au fichier que vous allez lui passer en paramètre (généralement utilisé pour des fichiers de conf. Ou même pour des sites web en fonction de vos besoins), il vous faut juste ajouter le paramètre :ro à la fin du chemin.

sudo docker run --name webstack_nginx -d -p 80:80 -p 443:443 -v  /data/webstack/www:/usr/share/nginx/html/:ro  nginx

:ro :  Read Only : il permet de monter le répertoire en mode lecture seul pour le conte

NB : Si nous n’avions pas encore téléchargé l’image nginx avec la commande docker pull, docker aurait téléchargé cette image pour nous directement avant de la monter.

Ici on peut utiliser le répertoire /usr/share/nginx/html parce qu’il a été déclaré en tant que volume dans le Dockerfile de l’image Nginx.

Liaison entre 2 conteneurs 

PhpMyAdmin et MySql

On lance tous d’abord le 1er conteneur celui auquel le second va se lier conteneur MySQL :

sudo docker run --name webstack_mysql -d -v /data/webstack/bdd/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=docker2016 mysql

Explication :

-e MYSQL_ROOT_PASSWORD=docker2016   on fixe la variable MYSQL_ROOT_PASSWORD qui contient le mot de passe qu’on décide d’attribuer au compte root de MySql au démarrage.

Ici, vous pouvez remarquer que nous n’avons spécifié aucun port pour la communication extérieure cela veut dire que seuls la machine hôte et les conteneurs qui sont liés au conteneur MySQL pourront communiquer avec lui (ceux-ci est partiellement vrais, car nous verrons que tous les conteneurs peuvent communiquer entre eux par défaut via leur IP. Mais cette fonctionnalité peux être désactivé en passant le paramètre –icc a false cette manipulation est expliquée dans le chapitre sur les bonnes pratiques de docker). Ce qui peut s’avérer être un gros avantage au niveau sécurité.

Ensuite on lance le conteneur PhpMyAdmin et on le relit au conteneur MySql.

sudo docker run --name webstack_phpmyadmin -d --link webstack_mysql:db  -p 2000:80 phpmyadmin/phpmyadmin

Explication :

–link webstack_mysql:db : il créer un lien entre le conteneur webstack_mysql (celui que nous avons créé précédemment avec MySQL) et PhpMyAdmin. PhpMyAdmin verra le nom d’hôte db dans son fichier hôte pointé sur le conteneur  webstack_mysql. Dans ce cas-ci, veillez à bien spécifier db sinon cela pourrait ne pas fonctionner. Bien évidemment, si vous avez spécifié un autre nom à MySql au lieu de (webstack_mysql) vous devez spécifier le bon nom.

Connecté vous ensuite sur : votre_ip :2000     En utilisant le compte root et le mot de passe que vous avez précédemment mis dans mysql.

5

Mysql et WordPress

docker run --name webstack_wordpress --link webstack_mysql:mysql -v /data/webstack/wordpress/:/var/www/html/ -p 3001:80 -d wordpress

Dans ce cas il utilisera les options par défaut. Pour configurer vous-même les variables utilisées, vous devez faire :

docker run --name webstack_wordpress_2  --link webstack_mysql:mysql  -p 3006:80 -e WORDPRESS_DB_USER=wordpress1 -e WORDPRESS_DB_PASSWORD=wordpress1 -e WORDPRESS_DB_NAME=wordpress1 -d  wordpress

Vous devez bien évidemment avoir créé sur votre serveur MySql l’utilisateur wordpress1 et la base de données wordpress1.

4. Arrêter / Supprimer des conteneurs et des images docker

Lorsque vous utilisé docker, différent cas de figure peuvent se poser.

  • Lister les conteneurs en court d’exécution
sudo docker ps
root@sw:/home/arsene# docker ps

CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS               NAMES

8dbb57d6f332        wordpress:latest               "/entrypoint.sh apac   4 days ago          Up 4 days           80/tcp              webstack_wordpress_atomit
6c0f15270888        wordpress:latest               "/entrypoint.sh apac   5 days ago          Up 5 days           80/tcp              webstack_wordpress_1
39ee17373646        phpmyadmin/phpmyadmin:latest   "/run.sh phpmyadmin"   9 days ago          Up 9 days           80/tcp              webstack_phpmyadmin
0aac8e893ab1        mysql:latest                   "docker-entrypoint.s   9 days ago          Up 9 days           3306/tcp            webstack_mysql

root@sw:/home/arsene#
  • Vous souhaitez stopper un conteneur docker temporairement.

Docker stop ID_conteneur ou Nom_Conteneur :

sudo docker stop webstack_wordpress_1
root@sw:/home/arsene# docker stop webstack_wordpress_1
webstack_wordpress_1

Cette commande arête juste le serveur donc si vous faite un sudo docker ps pour lister les images en cours vous ne la verrez plus. Mais l’instance existe toujours la preuve c’est que si vous tentez de lancer un conteneur avec le même nom docker va refuser.

Pour voire la liste de tous les conteneurs docker (même ceux qui sont arrêtés), vous faite

sudo docker ps -a

Cette commande est aussi particulièrement utilise lorsqu’un conteneur refuse de se lancer (il faut noter que docker auras créé tout de même une instance).

root@sw:/home/arsene# docker ps -a

CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS                      PORTS               NAMES

94f49f7fcf81        hello-world:latest             "/hello"               11 minutes ago      Exited (0) 11 minutes ago                       desperate_jones         
8dbb57d6f332        wordpress:latest               "/entrypoint.sh apac   4 days ago          Up 4 days                   80/tcp              webstack_wordpress_atomit
6c0f15270888        wordpress:latest               "/entrypoint.sh apac   5 days ago          Exited (0) 2 minutes ago                        webstack_wordpress_1    
  • Pour supprimer un conteneur docker qui a été lancé, il faut :

Arrêter le conteneur et ensuite taper la commande :  sudo docker rm ID_conteneur ou nom

root@sw:/home/arsene# sudo docker rm webstack_wordpress_1
webstack_wordpress_1

Pour supprimer l’ensemble des conteneurs docker qui sont à l’arrêt :

docker rm  $(docker ps -a  -q --filter "status=exited")

Stopper tous les conteneurs qui tourne d’un coup :

sudo docker stop $(docker ps -q)

Lancer ensemble tous les conteneurs docker qui ont été stoppés :

 sudo docker start $(docker ps -q)

Pour se connecter à l’interface de commande d’un conteneur par exemple pour faire des mises à jour ou installer un paquet :

 sudo docker exec -it webstack_nginx /bin/bash 

10

Pour vous déconnecter un simple exit suffit

11

NB : Lorsque vous stoppez un conteneur, les mises à jour que vous aviez installées dessus vont rester. Lorsque vous allez le relancer, vous retrouverez les mises à jour. Par contre si vous supprimez un conteneur sans avoir créé une image avec ce dernier afin de sauvegarder vos modifications vous perdez automatiquement toutes les modifications que vous aviez apportées au conteneur.

5. Liste des commandes DOCKER CLI

Je vais rapidement lister les commandes Docker disponibles, en expliquant leurs rôles (informations issues des manpages Docker). Vous pouvez obtenir ces informations depuis l’invite de commande en tapant : docker -h (résultat en anglais). Vous pouvez aussi obtenir les informations sur une commande particulière en tapant : docker [commande] –help

docker attach : Joindre à un conteneur en cours d’exécution
docker build : Construire une nouvelle image à partir du code source dans le PATH
docker commit : Créer une nouvelle image à partir des changements d’un conteneur
docker cp : Copier des fichiers ou des dossiers depuis le PATH d’un conteneur vers le HOSTDIR ou vers STDOUT
docker create : Créer un nouveau conteneur
docker diff : Inspectez changements sur le système de fichiers d’un conteneur
docker events : Obtenir des événements en temps réel depuis le serveur
docker exec : Exécuter une commande dans le conteneur en cours d’exécution
docker export : Exporter le contenu d’un système de fichiers d’une archive tar vers STDOUT
docker history : Afficher l’historique d’une image Docker
docker images : Lister des images
docker import : Créer une image de système de fichiers vide et y importer le contenu d’une l’archive (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz), puis éventuellement y ajouter une étiquette (tag)
docker info : Afficher l’ensemble des informations système
docker inspect : Afficher les informations de bas niveau sur un conteneur ou une image Docker
docker kill : Tuer un conteneur en cours d’exécution en utilisant SIGKILL ou un signal spécifié
docker load : Chargez une image à partir d’une archive tar sur STDIN
docker login : Inscrivez-vous ou connectez-vous à le Docker Register (HUB)
docker logout : Déconnexion du Docker Register (HUB)
docker logs : Fetch des journaux d’un conteneur
docker pause : Mettre en pause tous les processus dans un conteneur
docker port : Liste les ports d’un conteneur, ou rechercher les ports “public” naté vers un PRIVATE_PORT
docker ps : Liste de conteneurs
docker pull : Récupérer une image ou un repository à partir du Docker HUB
docker push : Publier une image ou un repository vers le Docker HUB
docker rename : Renommer un conteneur Docker
docker restart : Redémarrez un conteneur en cours d’exécution
docker rm : Supprimer une ou plusieurs conteneurs
docker rmi : Supprimer une ou plusieurs images
docker run : Exécuter une commande dans un nouveau conteneur
docker save : Enregistrer une image dans une archive tar (streaming vers STDOUT par défaut)
docker search : Rechercher des images sur le Docker Hub
docker start : Lancer un ou plusieurs conteneurs arrêtés
docker stats : Afficher l’utilisation des ressources d’un ou plusieurs conteneurs sous la forme d’un flux
docker stop : Arrêtez un conteneur en cours d’exécution en envoyant SIGTERM et SIGKILL après une période de grâce
docker tag : Étiqueter une image dans un repository
docker top : Afficher les processus en cours d’exécution d’un conteneur
docker unpause : Réactiver tous les processus dans un conteneur
docker version : Afficher les informations de version Docker
docker wait : Bloquer jusqu’à l’arrêt du conteneur, puis imprime son code de sortie

6. Webographie

Wanadev

Le Blog Nicolargo

 

2 réflexions au sujet de « DÉCOUVERTE DE DOCKER »

Laisser un commentaire

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