« Docker/Docker compose » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Balise : Révocation manuelle
Ligne 180 : Ligne 180 :
<syntaxhighlight lang=bash>
<syntaxhighlight lang=bash>
docker-compose stop; docker-compose build; docker-compose up -d
docker-compose stop; docker-compose build; docker-compose up -d
</syntaxhighlight>

Pour rentrer dedans :
<syntaxhighlight lang=bash>
docker-compose exec centos bash
</syntaxhighlight>
</syntaxhighlight>



Version du 6 juillet 2021 à 15:47

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.

Installation

Linux

Lancer[2] :

curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Commandes

version

Version de docker-compose[3]. Exemple en 2019 :

version: '3.7'

networks

Définition du réseau des VM Docker.

services

Liste des conteneurs à construire.

image

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

Exemples :

    image: 'mariadb'
    image: 'mariadb:latest'
    image: 'mariadb:10.4'

extends

"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

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: './php7.3-fpm'

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

        build:
            context: .
            dockerfile: './php7.3-fpm/Dockerfile'

volumes

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

Mapping du partage des ports. Ex :

        ports:
            - 3306:3306

environment

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"

env_file

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

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

restart

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

Permet de forcer un nom de conteneur.

hostname

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

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

Remplit le /etc/hosts du conteneur. Ex :

extra_hosts:
    - "mon_serveur_local.localhost:172.20.0.2"

Exemples

Minimal

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

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

Gestion

Pour relancer le conteneur sur Linux :

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

Pour relancer le conteneur sur Windows :

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 :

sudo docker-compose run centos bash

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

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

Logs

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

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

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

Sur Linux

Pour supprimer les logs de tous les conteneurs sur Linux :

 find /var/lib/docker/containers/ -type f -name "*.log" -delete

Puis redémarrer les conteneurs pour qu'ils recréent des logs.

Sur Windows

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