Par T.Asnar – TheExpert Virtual Infrastructure chez SQUAD
La virtualisation des infrastructures est omniprésente. Les besoins et les méthodes de travail évoluant, les conteneurs ont pris de plus en plus d’importance. Notamment très populaire chez les développeurs et leur méthode AGILE, Docker permet facilement de partager les applications entre les équipes, de les tester simplement dans n’importe quel environnement et de les publier versionnées sur le cloud (contrôle, agilité et portabilité).
Par exemple, Google exécute environ 3300 conteneurs à la seconde ! Everything at Google, from Search to Gmail, is packaged and run in a Linux container. Each week we launch more than 2 billion container instances.
Après une légère introduction, je vous montrerai un exemple d’utilisation avec Docker Compose.
Introduction à Docker
Docker propose plusieurs produits pour construire, déployer et exécuter des conteneurs. La plupart du temps, on associera le terme de conteneur à une application ou à un espace de travail avec toutes les librairies, dépendances et outils nécessaires.
Notez que la notion de conteneur n’est pas toute jeune (voir les zones Solaris par exemple, ou namespace + cgroups linux pour isoler). Mais, selon moi, la grande force de Docker est sa facilité d’utilisation et une documentation en ligne vraiment riche en exemples et explications.
Le plus facile pour l’appréhender est de comprendre la différence entre une machine virtuelle et un conteneur.
Différences entre les VM’s et les Conteneurs
VMs
Conteneurs
Les machines virtuelles ont leur propre système d’exploitation et ressources allouées (CPU, mémoire, stockage, etc.) C’est un avantage car on a ce que l’on paye (ressources réservées). Pourtant, c’est aussi un inconvénient : d’une part, la limite de ressources à allouer est vite atteinte, et, d’autre part, les VM’s en exécution sont bien souvent sous-exploitées (gaspillage).
Les conteneurs Docker, eux, se basent sur le système d’exploitation du host (noyau linux > à 3.10). On peut lancer des milliers d’applications hétérogènes (serveur web, serveur d’application, big data, etc.) sur la même machine ; et cela, sans la complexité ni la lourde charge d’un hyperviseur (comme par exemple un gros vCenter pour VMWare).
Un autre avantage des conteneurs : ils garantissent que le code qui a été écrit et testé directement chez les Dev’ sera exécuté de la même manière une fois déployé ailleurs. Que ça soit sur le cloud, sur des VM’s ou sur une infrastructure complètement différente, l’application dispose déjà dans son conteneur des librairies dont elle a besoin.
Une autre différence de taille (si je puis dire) : le poids du conteneur. Contrairement aux VMs qui embarquent le SE et qui pèsent plusieurs dizaines de Giga Octets, les conteneurs sont très légers et leurs poids dépendent des librairies qui font tourner l’application (en général quelques centaines de Méga Octets)
Les PCA et PRA (Plan de Continuité d’Activité ou Plan de Reprise d’Activité) deviendraient presque un jeu d’enfant (réplication et déploiement facilités)
Exemple pour récupérer une image de serveur web nginx : je vous laisse juger de la simplicité des commandes
12345678910111213 | # pull de l'image depuis Docker Hub$ docker pull nginxUsing default tag: latestlatest: Pulling from library/nginx...Digest: sha256:46a1b05e9ded54272e11b06e13727371a65e2ef8a87f9fb447c64e0607b90340Status: Downloaded newer image for nginx:latest # liste des images locales$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 3edcc5de5a79 3 days ago 182.8 MB |
Produits Docker
Docker Engine est le moteur qui tourne sous Linux et permet la gestion/exécution des conteneurs.
Docker Machine permet de configurer et d’exécuter Docker Engine sur une machine virtuelle linux très légère. Indispensable sous Windows.
Docker Compose permet de définir la configuration d’un ou plusieurs conteneurs en un seul fichier puis, de les exécuter en une seule commande.
Docker Hub permet de publier sur le cloud (privé ou public) vos conteneurs versionnés.
D’autres produits existent mais font l’objet d’une utilisation plus poussée (voir #pour-aller-plus-loin)
Principe de fonctionnement
Les images
Elles sont construites comme une succession de couches avec pour base, une distribution linux (type debian, ou fedora par exemple).
Toutes les couches (exécution, ajout de fichier, variables d’environnement) peuvent être décrites comme des instructions dans un fichier Dockerfile
qu’on peut utiliser comme template pour construire notre image.
Autre possibilité pour construire votre image : exécutez une image de distribution de base (un conteneur donc), installez vos librairies et votre application puis perpétrez votre conteneur en image commit
Avantages de cette construction en couches : si vous avez deux images basées sur deux ubuntu par exemple, la couche « ubuntu » ne prendra qu’une fois la place sur disque.
Le conteneur
C’est l’image exécutée avec docker run
. Pour que le conteneur puisse « vivre » et l’image étant en lecture seule, des couches systèmes supplémentaires sont allouées comme UnionFS en écriture pour le filesystem ou une interface réseau par exemple.
A noter : le conteneur se basant sur l’image, toutes les modifications qu’on effectuera dans le conteneur seront « perdues » à la prochaine exécution (à moins de commit le conteneur en image)
Les volumes
Indispensable pour la persistance de la donnée, on peut monter des volumes accessibles dans les conteneurs.
Exemple d’utilisation avec Docker Compose
Et si on exécutait un wordpress ? Rien de plus simple :
Créons un fichier wordpress-compose.yml
123456789101112 | wordpress: image: wordpress links: - db:mysql ports: - 8080:80 db: image: mariadb environment: MYSQL_ROOT_PASSWORD: example |
Lançons maintenant ces deux conteneurs. Vous allez voir, c’est très très dur ! Ou pas, en fait, docker-compose s’occupe de tout.
Soit les images définies existent en local, soit il va les chercher sur Docker Hub. On peut aussi définir une commande build avec son propre Dockerfile pour construire l’image si elle n’existe pas. Par exemple, l’image wordpress
ci-dessus est issue du Dockerfile suivant
Il créé les dépendances, les ouvertures de ports, les variables d’environnement, etc.
Petit bonus, lorsque Docker Compose redémarre les services, s’il trouve des conteneurs déjà existants, et s’il n’y a pas d’update à faire, il reprend les anciens.
12345678910111213141516 | $ docker-compose -f wordpress-compose.yml upPulling db (mariadb:latest)...latest: Pulling from library/mariadbDigest: sha256:648500ff8eb35b9967a5e77735d0f66fefb8a48377a65312a375a944cdcfda0aStatus: Downloaded newer image for mariadb:latestCreating compose_db_1Pulling wordpress (wordpress:latest)...latest: Pulling from library/wordpressDigest: sha256:282b474f38ef7c79b50ac45d7430a7c1851db54ccdd134472ad200fab405587eStatus: Downloaded newer image for wordpress:latestCreating compose_wordpress_1Attaching to compose_db_1, compose_wordpress_1db_1 | Initializing database... |
En aparté : Sauvegarde, déploiement
1234567891011 | $ docker save -o monImageNginx.tar nginx$ ls -lh-rw-r--r-- 1 thoma 197609 182M mai 7 22:12 monImageNginx.tar # la compression fonctionne très bien sur les conteneurs$ zip monImageNginx.tar.zip monImageNginx.tar adding: monImageNginx.tar (172 bytes security) (deflated 63%)$ ls -lh-rw-r--r-- 1 thoma 197609 69M mai 7 22:14 monImageNginx.tar.zip |
Il n’y a plus qu’à transférer la sauvegarde et à la recharger sur n’importe quelle plateforme :
12 | $ docker load -i monImageNginx.tar |
On peut aussi pousser son image sur le cloud (Docker Hub) en s’authentifiant sur son login
Pour aller plus loin
Documentation officielle : comment installer, utiliser les commandes en détails etc.
Doker Swarm : Docker en mode cluster
Kubernetes : Automatisation des opérations d’exploitation de conteneurs à travers le cloud et clusters de machines
et d’autres Docker Cloud, Datacenter, Kinematic etc. voir tous les produits
Openshift de RedHat. Plateforme d’hébergement basée sur Docker et Kubernetes qui propsent différents plans (dont un gratuit) pour développer et exécuter vos applications sur le cloud
J’adore les tutoriels Grafikart et c’est en français :