Docker Compose remplace fig

Révolution de l’année 2014, impossible de passer à côté du phénomène Docker et de ces containers. Lorsqu’on débute avec Docker en ligne de commande, le lancement des containers nécessite parfois des commandes interminables, c’est pour répondre à cette problématique que fig/compose a été développé.

Fig a été racheté par Docker il y a plusieurs mois, mais la première version officielle sous l’appellation Docker Compose est paru il y a quelques jours seulement. Pour ceux qui ont déjà utilisé Fig, cette version ne fait qu’un simple renommage (principalement du moins).

La commande pour lancer un ou plusieurs container est assez longue et il n’est pas toujours facile de se souvenir de tous les paramètres. Du coup, on fait souvent appelle à l’historique des commandes de Linux ou à un fichier texte pour retrouver la commande à lancer. Voici à quoi peux ressembler une commande Docker

docker run --name portail -d -p 80:80 -p 443:443 \
-v /var/www:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs \
-v <log-dir>:/var/log/nginx -v <html-dir>:/var/www/html dockerfile/nginx

 

Fig/Compose permet de mettre tous ces paramètres dans un fichier et d’en simplifier la commande. Au final, avec Compose, la seule commande à retenir sera celle-ci:

docker-compose up -d

Pour que cela fonctionne, il faut paramétrer un fichier appelé docker-compose.yml, dans lequels on va venir définir l’ensemble des paramètres que l’on passe habituellement à Docker

portail:
 image: dockerfile/nginx
 ports:
  - "80:80"
  - "443:443"
 volumes:
  - /var/www:/etc/nginx/sites-enabled
  - <certs-dir>:/etc/nginx/certs
  - <log-dir>:/var/log/nginx
  - <html-dir>:/var/www/html

docker-compose de charge de lire le fichier pour ensuite lancer le container avec les bons paramètres. La ligne de commande est ainsi beaucoup plus simple, mais elle a aussi un autre avantage. Vous pouvez ajouter dans le fichier autant d’image et de container que vous le souhaitez, vous pouvez ainsi lancer et gérer des dizaines de containers avec une seule commande.

Installation

L’installation se fait en 2 lignes de commande (si Docker est déjà installé)

curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Le fichier docker-compose.yml

La plupart des options de lancement d’un container de docker sont transposables dans le fichier yml, on retrouve donc

  • ports
  • volumes
  • volumes_from
  • links
  • environment
  • et pleins d’autres…

Par défaut, compose utilise toujours le fichier docker-compose.yml si il existe, mais vous pouvez changer le nom du fichier à l’execution en utilisant la commande suivante

docker-compose -f mon_fichier.yml up -d

Quelques commandes

docker-compose up

on l’as vu, la commande up permet de stopper et re-créer tous les containers présents dans le fichier

docker-compose up -d

L’option -d permet simplement de lancer les containers en arrière plan.

Attention, petite subtilité, fig/compose stoppe et supprime bien les containers pour les remplacer par des nouveaux containers. Par contre, fig/compose conserve les précédents volumes et options associé, même s’ils n’avaient pas été mappé explicitement dans le fichier yml.

Avec Docker en natif, pour chaque volume déclaré dans le fichier Dockerfile d’une image, Docker associe un volume temporaire. A chaque commande docker run, Docker créé un nouveau volume temporaire.
Avec fig/compose, la commande up de fig/compose réutilise le même volume temporaire que la fois précédente.

Pour forcer la suppression de ces volumes, il faut utiliser la commande suivante qui supprime tous les container et surtout leurs volumes.

docker-compose rm --force -v

 

docker-compose start/stop

la commande permet d’arrêter ou démarrer tous les containers.

docker-compose start

Elle peux aussi démarrer/arrêter un container spécifique (à partir du nom définit dans le fichier yml)

docker-compose start portail

 

Fig/Compose in Production

En production, Fig/Compose peux parfaitement répondre à certaine problématique d’Infrastructure As Code et être utilisé pour démarrer plusieurs dizaines de containers.
Il suffit pour cela de créer un fichier yml par serveur et d’y définir les containers à lancés. Ces fichiers ont l’immense intérêt de pouvoir être versionné dans un outil comme git.
L’installation d’une nouvelle machine se fait alors très simplement.

  1. Installer Docker et Docker Compose
  2. Copier le fichier yml
  3. Lancer la commande docker-compose up

Cette solution peux convenir à de nombreux besoins de base pour démarrer et gérer un parc serveur à taille humaine (comprendre <100 containers sur une dizaine de machine physique et/ou virtuelle).

Pour aller plus loin

Pour répondre à un besoin plus important en termes de containers et de scalabilité, il faudra alors se tourner vers des solutions plus complètes qui propose entre autre du provisionning et de l’orchestration.

Pour le provisionning de machines, on peux citer les anciens comme Chef, Puppet, ou plus récemment Ansible qui propose un module Docker. Les acteurs du cloud sont aussi très présent sur ce segment, puisque c’est leur cœur de métier.

Pour l’orchestration, ou l’administration à distance de plusieurs hôtes Docker, on peux citer Shipyard, Mesos, Maestro, Flynn. Google qui mise tout sur Docker pour rattraper Amazon propose aussi Kubernetes

Docker développe et/ou rachète ses propres outils pour venir compléter son propre écosystème. Annoncé en même temps que Fig/Compose, Docker Machine et Swarm vont s’occuper de ces problématiques.

Docker Machine devrait permettre une solution unique et standardiser pour provisionner des hôtes Docker auprès de différents fournisseurs (google, amazon, microsoft, openstack).

Pour Docker Swarm, son objectif est de regrouper plusieurs hosts Docker derrière un seul docker virtuel, ce qui devrait simplifier la gestion et la maintenance du parc de containers.