Utilisation de docker-compose
On continu la série Docker avec un article entièrement consacré à l’outil docker-compose.
[cyklodev_summary]
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:
- un synchronisation bidirectionnelle : je change dans le conteneur, ça change en dehors et inversement
- une étape de rebuild en moins à chaque modification dans le répertoire en question
- 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.