Docker/Docker compose

Un livre de Wikilivres.
(Redirigé depuis Docker/Docker-compose)
Aller à la navigation Aller à la recherche

La commande docker compose est un utilitaire généralement fourni avec Docker, permettant d'orchestrer plusieurs images et conteneurs avec la même commande[1]. Pour ce faire, les paramétrages de l’ensemble des conteneurs doit être définit dans le fichier docker-compose.yml à la racine du projet. Toutefois il est possible de surcharger des parties de ce fichier au lancement des conteneurs, pour chaque environnement[2].

Commandes[modifier | modifier le wikicode]

version[modifier | modifier le wikicode]

Version de Docker Compose[3]. Exemple en 2019 :

version: '3.7'

networks[modifier | modifier le wikicode]

Définition du réseau des VM Docker.

services[modifier | modifier le wikicode]

Liste des conteneurs à construire.

image[modifier | modifier le wikicode]

Nom de l'image à télécharger (sur https://hub.docker.com/ ou un dépôt privé). Elle peut être suivie d'un tag pour en indiquer la version.

Exemples :

    image: 'mariadb'

    image: 'mariadb:latest'

    image: 'mariadb:10.4'

extends[modifier | modifier le wikicode]

"image" permet donc de lancer un groupe d'applications, qui sont par ailleurs lançables individuellement. Mais pour partager des configurations on peut aussi utiliser "extends"[4] :

  extends:
    file: webapp/docker-compose.yml
    service: webapp

build[modifier | modifier le wikicode]

Alternativement à l'image, on peut indiquer le chemin d'un dockerfile pour construire son propre conteneur.

Si le conteneur ne partage aucun fichier avec d'autres, indiquer simplement le nom du dossier contenant le dockerfile :

        build: './php8.1-fpm'

Sinon, préciser le contexte où le conteneur devra récupérer les fichiers partagés nécessaires à son build :

        build:
            context: .
            dockerfile: './php8.1-fpm/Dockerfile'

volumes[modifier | modifier le wikicode]

Mapping des répertoires partagés entre la machine hôte et le conteneur :

        volumes:
            - '$HOME/www:/var/www'

La variable $HOME vaut "~" par défaut (dossier de l'utilisateur courant), mais peut être remplacée dans le fichier .env.

ports[modifier | modifier le wikicode]

Mapping du partage des ports. Ex :

        ports:
            - '3306:3306'

environment[modifier | modifier le wikicode]

Injecte des variables d'environnement dans le conteneur. Très utile pour que les conteneurs soient à l'heure de la machine hôte :

        environment:
            TZ: Europe/Paris

Logo

environment: n'accepte pas les sous-tableaux : il faut les convertir en JSON.

env_file[modifier | modifier le wikicode]

Définit le nom d'un fichier contenant des variables d'environnement récupérables dans docker-compose.yml, avec la syntaxe "${ma_variable}". Exemple :

    env_file: .env
    environment:
        HOST_UID: "${UID}"

Logo

Sur Windows le changement de l'UID entraine une modification des droits de tous les fichiers.

depends_on[modifier | modifier le wikicode]

Permet de spécifier qu'un conteneur doit en attendre un autre pour être lancé.

restart[modifier | modifier le wikicode]

Indique si le conteneur doit se lancer au démarrage du daemon Docker (donc de la machine hôte). Vaut "no" par défaut. Ex :

        restart: always

Autre valeur possible : unless-stopped

container_name[modifier | modifier le wikicode]

Permet de forcer un nom de conteneur.

hostname[modifier | modifier le wikicode]

Permet de forcer un nom de machine dans le conteneur. Utile si on a une application qui doit pointer dessus dans son .env (car "localhost" fonctionne quand le serveur était installé directement sur la machine hôte mais pas dans un conteneur).

network[modifier | modifier le wikicode]

Permet de forcer une adresse IP pour le conteneur.

Logo

Dans docker-compose.yml, il faut toujours remplir le paramètre "default" de "networks" pour ne pas qu’il prenne une plage utilisée.

extra_hosts[modifier | modifier le wikicode]

Remplit le /etc/hosts du conteneur. Ex :

extra_hosts:
    - 'mon_serveur_local.localhost:172.20.0.2'

command[modifier | modifier le wikicode]

Pour exécuter un script à chaque lancement du conteneur.

    command: ls -alh

ou en multiligne :

    command: |
        ls -alh

ou :

    command: ['ls', '-alh']

ou si la commande est dans un fichier :

    command: /bin/ls.sh

entrypoint[modifier | modifier le wikicode]

Pour définir le dernier script exécuté à chaque lancement du conteneur.

Exemples[modifier | modifier le wikicode]

Minimal[modifier | modifier le wikicode]

Exemple de docker-compose.yml contenant un seul conteneur CentOS, qui a le droit d'accéder au dossier ~/www :

version: '3.2'
services:
  centos:
    image: 'centos/systemd'
    volumes:
        - '$HOME/www:/var/www'

Complet[modifier | modifier le wikicode]

version: '3.2'

networks:
    default:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 172.170.0.0/16

services:
    mariadb:
        hostname: 'mariadb'
        image: 'mariadb:10.4'
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: 'wikibooks'
        # Partage pour les commandes SQL "into outfile" et "load data infile"
        volumes:
            - '$HOME/www:/var/www'
        restart: always
        networks:
            default:
                ipv4_address: 172.170.0.3

    adminer:
        hostname: 'adminer'
        image: 'adminer'
        ports:
            - 8080:8080
        restart: always
        networks:
            default:
                ipv4_address: 172.170.0.4


 une alternative aux IP fixes (permettant des noms de domaines personnalisés) et de passer par des ports (comme pour Adminer ci-dessus, qui est accessible sur http://localhost:8080).

Gestion[modifier | modifier le wikicode]

Pour relancer le conteneur (sur Windows ou Linux) :

docker compose stop; docker compose build; docker compose up -d

Pour rentrer dedans :

docker compose exec centos bash

Ou le lancer et rentrer dedans en même temps :

docker compose run centos bash

Ou exécuter une seule commande shell dedans avant de revenir à la machine hôte :

docker compose exec centos sh -c 'ls -alh'

Logs[modifier | modifier le wikicode]

Pour voir les logs de tous les conteneurs en live :

 docker compose logs -f

Pour voir les logs d'un seul conteneur :

 docker compose logs nom_du_conteneur


Supprimer les logs[modifier | modifier le wikicode]

L'emplacement des logs d'un conteneur est visible avec :

 docker inspect --format='{{.LogPath}}' nom_du_conteneur

Sur Linux[modifier | modifier le wikicode]

Tous les conteneurs[modifier | modifier le wikicode]

Pour supprimer les logs de tous les conteneurs sur Linux :

docker compose stop
 find /var/lib/docker/containers/ -type f -name "*.log" -delete
docker compose up -d
Un seul conteneur[modifier | modifier le wikicode]

Pour ne supprimer les logs que d'un seul conteneur :

docker compose stop mon_conteneur
sudo rm $(sudo docker inspect --format='{{.LogPath}}' mon_conteneur)
docker compose up -d mon_conteneur

Sur Windows[modifier | modifier le wikicode]

Sur Windows, comme les logs sont dans le fichier C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx, il faut d'abord se connecter à la VM Docker pour exécuter cette commande[5]. Exemple en DOS :

docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock jongallant/ubuntu-docker-client 
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
chroot /host

Références[modifier | modifier le wikicode]