Utilisation de docker-compose

On continu la série Docker avec un article entièrement consacré à l’outil docker-compose.

Installation

Comme pour les articles précédents, toutes les commandes seront faites sur un serveur CentOs 7.
Le seul prérequis sera d’avoir une installation fonctionnelle de Docker sur le serveur.

Via les gestionnaires de paquets

yum install epel-release
yum upgrade python*
yum install -y python-pip
pip install docker-compose

Vérification

Avec ces commandes vous devriez voir apparaitre la version de docker-compose.

cyklo@testmachina:~$ docker-compose -v
docker-compose version 1.11.2, build dfed245

Quelques explications

DockerFile vs (Docker) Compose

Si le DockerFile permet de construire une image, il a le désavantage d’être « statique », à chaque changement de code dans les sources de l’image, il faut la reconstruire (build).

On va prendre l’exemple d’un serveur web:

En mode DockerFile, on va faire un ADD pour mettre le contenu d’un répertoire local dans le conteneur, par exemple /var/www (au hasard). Après la phase de build, les contenus des 2 répertoires /var/www sont les même. Mais si je modifie un des 2 répertoires, l’autre ne change pas. Pire si je change le répertoire dans le conteneur, au prochain rebuild le contenu sera écrasé !!!

En mode Compose, ce n’est pas un ajout du répertoire qui sera fait, mais un partage ce qui implique:

  1. un synchronisation bidirectionnelle : je change dans le conteneur, ça change en dehors et inversement
  2. une étape de rebuild en moins à chaque modification dans le répertoire en question
  3. une persistance des données après un build

Le fichier docker-compose.yml

Gardons l’exemple de ce serveur web (disponible ici) et voici comment on peut définir le fichier Compose

cyklo@testmachina:~$ mkdir ckd-api && cd ckd-api
cyklo@testmachina:~$ cat docker-compose.yml
version: '2'

services:

  php7:
    image: cyklodev/php7:0.0.1
    build: .
    ports:
      - "802:80"
    volumes:
     - ./pimpage:/pimpage
     - ./app:/app
    command: sh /pimpage/entrypoint.sh
    tty: true

On va nommer le répertoire ckd-api, l’image php7 et on va partir d’une image  déjà faite sur DockerHub qui embarque php7 et une page d’information.

On spécifie le port publique 802 et nos 2 répertoires persistants qui contiennent la routine d’installation dans le répertoire pimpage (le point d’entrée) et l’application dans /app.

L’instanciation et utilisation

On va utilisé ce nouveau fichier pour démarrer notre instance en mode détaché (-d).

cyklo@testmachina:~$ docker-compose up -d

Regardons de plus prêt le conteneur qui est en cours d’exécution.

cyklo@testmachina:~$ docker-compose ps
    Name                   Command               State          Ports
----------------------------------------------------------------------------
ckdapi_php7_1   docker-php-entrypoint sh / ...   Up      0.0.0.0:802->80/tcp

On voit que le nom est composé du nom du répertoire ainsi que du nom qu’on a donné à la première section suivi du numéro d’instance ici 1.

Enchainons les commandes stop et start pour voir les changement d’état.

cyklo@testmachina:~$ docker-compose stop php7
Stopping ckdapi_php7_1 ...
Stopping ckdapi_php7_1 ... done

cyklo@testmachina:~$ docker-compose ps
    Name                   Command                State     Ports
-----------------------------------------------------------------
ckdapi_php7_1   docker-php-entrypoint sh / ...   Exit 137
cyklo@testmachina:~$ docker-compose start php7
Starting php7 ... done
cyklo@testmachina:~$ docker-compose ps
    Name                   Command               State          Ports
----------------------------------------------------------------------------
ckdapi_php7_1   docker-php-entrypoint sh / ...   Up      0.0.0.0:802->80/tcp

Compose pour aller plus loin

Fichier multi conteneurs

L’outil docker-compose permet surtout de construire un « pool » de conteneurs qui vont fonctionner ensemble.
Prenons l’exemple de 2 conteneurs : une base de données et un scanneur (nmap).

 
cyklo@testmachina:~$ cat docker-compose.yml
version: '2'

services:

  php:
    image: cyklodev/php7:0.0.1
    volumes:
      - ./pimpage:/pimpage
    command: sh /pimpage/entrypoint-php.sh
    tty: true


  nmap:
    image: cyklodev/alpine:0.0.3
    volumes:
      - ./pimpage:/pimpage
    command: sh /pimpage/entrypoint-nmap.sh
    tty: true
cyklo@testmachina:~$ docker-compose up
cyklo@testmachina:~$ docker-compose ps
       Name                     Command               State   Ports
-------------------------------------------------------------------
testnetwork_nmap_1   sh /pimpage/entrypoint-nmap.sh   Up
testnetwork_php_1    docker-php-entrypoint sh / ...   Up

Compose et son réseau implicite

On a bien nos 2 conteneurs présents, et direction le conteneur nmap

 cyklo@testmachina:~$ docker exec -ti 0d2048ad722f sh
/ # nmap -sS 172.27.0.0/16

Starting Nmap 7.40 ( https://nmap.org ) at 2017-04-25 17:48 UTC

Nmap scan report for testnetwork_php_1.testnetwork_default (172.27.0.3)
Host is up (0.000093s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 02:42:AC:1B:00:03 (Unknown)

On détecte le conteneur php ! Les conteneurs qui sont dans le même Compose partage le même réseau !
Avec ça à l’esprit, vous pouvez mettre en place des agrégations de conteneurs pour les faire fonctionner ensemble.

Pour être un peu plus propre on va déclarer nous même le réseau.

 
cyklo@testmachina:~$ cat docker-compose.yml
version: '2'

services:

  php:
    image: cyklodev/php7:0.0.1
    volumes:
      - ./pimpage:/pimpage
    networks:
      - test-network
    command: sh /pimpage/entrypoint-php.sh
    tty: true


  nmap:
    image: cyklodev/alpine:0.0.3
    volumes:
      - ./pimpage:/pimpage
    networks:
      - test-network
    command: sh /pimpage/entrypoint-nmap.sh
    tty: true

networks:

  test-network:
    driver: bridge

 

Ces exemples ne font qu’effleurer les possibilités de Compose, il y a bien plus à découvrir, notamment dans le cadre de l’intégration continue.

Vous trouverez tout cas dans les features du site officiel.

Pour marque-pages : Permaliens.

Laisser un commentaire

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