Docker logo

Documentation utilisée

Docker est un service de conteneurs. Il fonctionne à base d'images qui vont être déployées dans des conteneurs.

Installation

Debian

Documentation utilisée

1 - Installer les paquets permettant à apt de passer au travers d'HTTPS et ainsi installer Docker :

sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common

2 - Ajouter la clé GPG officielle :

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

3 - Ajouter le dépôt Docker stable :

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

4 - Mettre à jour les paquets :

sudo apt-get update

5 - Installer Docker Engine Community :

sudo apt-get install docker-ce docker-ce-cli containerd.io

CentOS7

Documentation utilisée

1 - Installer les paquets nécessaires à l'installation de Docker et de Docker Compose :

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 epel-release python-pip

2 - Ajouter le dépôt Docker à la liste des dépôts :

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3 - Installer Docker-ce :

sudo yum install docker-ce

4 - Installer Docker Compose :

sudo yum install -y python2-pip
sudo pip install docker-compose

5 - Démarrer Docker et l'autoriser au démarrage du système :

sudo systemctl start docker
sudo systemctl enable docker

Droits

Par défaut, Docker n'est utilisable qu'en root. Pour pouvoir l'utiliser en simple utilisateur, il suffit d'ajouter cet utilisateur dans le groupe docker :

sudo usermod -aG docker utilisateur

Cependant, le démon Docker ayant les droits root sur la machine, il est déconseillé de le faire autrement que sur une machine test.

Images Docker

Les images Docker sont des conteneurs composés — la plupart du temps — d'un OS, d'un exécutable, et des bibliothèques nécessaires à son exécution. Pour voir quelles images sont disponibles sur la machine, faire :

sudo docker image ls

Le moyen le plus simple d'obtenir des images est de les récupérer sur des dépôts dédiés, le plus utilisé étant Docker Hub. Pour cela, il faut utiliser la commande docker pull. Par exemple, pour récupérer l'image alpine depuis Docker Hub, faire :

sudo docker pull alpine

Plus de détails sur la gestion des dépôts docker sont disponibles dans la documentation dédiée.

Conteneurs Docker

Un conteneur est une instance d'une image. Quand Docker crée un conteneur, il réplique la structure d'une image, puis exécute le programme associé. Pour lancer un conteneur :

sudo docker container run <image>

Par exemple, pour lancer l'image alpine

sudo docker container run alpine

Une fois l'exécutable terminé, le conteneur est stoppé par Docker. Dans le cas de l'image alpine, l'exécutable est un shell ( sh ). Ce dernier n'ayant pas de commande à traiter, il s'arrête aussitôt, et le conteneur est stoppé. Il est possible de changer l'exécutable lancé par un conteneur en spécifiant un autre exécutable ou une autre commande à lancer à la suite de la commande run. Par exemple :

sudo docker container run alpine echo "toto"

Ce conteneur va écrire "toto" dans un terminal, puis s'arrêter. Pour des programmes nécessitant une interaction avec l'utilisateur, on peut lancer un conteneur en mode interactif via l'option -it :

sudo docker container run -it alpine

Ici, on se retrouve dans un shell au sein du conteneur. De la même manière, pour un programme tel un serveur web censé se dérouler en tâche de fond, on peut lancer un conteneur de manière détachée via l'option -d :

sudo docker container run -d nginx

Pour voir les conteneurs en cours d'exécution, il faut exécuter :

sudo docker container ls

On peut y ajouter les conteneurs actuellement stoppés via l'option -a :

sudo docker container ls -a

Cela nous donne plusieurs informations sur les conteneurs, les principales étant leur id dans la première colonne, et leur nom dans la dernière colonne. En utilisant ceux-ci, nous pouvons interagir avec un conteneur existant.

  • Pour arrêter un conteneur :

    sudo docker container stop <id>
    
  • Pour supprimer un conteneur arrêté :

    sudo docker container rm <id>
    
  • Pour exécuter un programme au sein d'un conteneur :

    sudo docker container exec [-it|-d] <id> <executable> [argument1] [argument2] [argument...]
    

À noter que ces commandes sont toutes exécutables en remplaçant l'id par le nom du conteneur. On peut d'ailleurs spécifier le nom d'un conteneur lors de sa création via l'option --name :

sudo docker container run --name <nom> <image>

Par exemple, pour qu'un conteneur faisant tourner alpine soit accessible via le nom "mon_alpine" :

sudo docker container run --name mon_alpine alpine

Il est aussi possible de dire à un conteneur de se supprimer automatiquement une fois terminé via l'option --rm :

sudo docker container run --rm alpine

Volumes

Bien que chaque conteneur tourne dans son environnement séparé, on peut avoir envie de partager des fichiers entre plusieurs conteneurs, ou entre le conteneur et la machine hôte. Cela se fait via des volumes.

On peut créer un volume Docker via la commande :

sudo docker volume create <volume name>

Et voir les volumes créés via :

sudo docker volume ls

On peut supprimer un volume via :

sudo docker volume rm <volume name>

On peut aussi automatiquement supprimer tous les volumes non-utilisés via :

sudo docker volume prune

Les volumes permettent d'avoir une résilience de données même si des conteneurs sont supprimés. Ils sont utilisés comme point de montage pour certains dossiers du conteneurs via l'argument -v :

sudo docker container run -v <volume name>:<chemin vers dossier> <image>

Par exemple, si on veut créer un conteneur alpine dont le répertoire /tmp est dans un volume vol :

sudo docker volume create vol
sudo docker container run -v vol:/tmp alpine

À noter que la création d'un volume n'est pas forcément nécessaire, on peut monter un dossier du conteneur dans le dossier de la machine hôte :

sudo docker container run -v <dossier hôte>:<dossier conteneur> <image>

Par exemple, pour monter le /tmp de notre conteneur alpine sur un dossier test dans un répertoire personnel :

sudo docker container run -v ~/test:/tmp alpine

Ports

Certaines images peuvent être accédées via des ports. Par exemple, un conteneur d'une image nginx est intéressant s'il est accessible via son port 80. Dans ce cas, on peut avoir envie de rediriger un port de la machine hôte vers un port du conteneur. Cela est faisable via l'option '-p' :

sudo docker container run <port hôte>:<port conteneur> <image>

Par exemple, pour rediriger le port 80 d'une image nginx vers le port 3000 de la machine locale :

sudo docker container run 3000:80 nginx

Cela permet d'accéder à nginx via l'adresse http://localhost:3000.

Logs

Pour regarder les logs d'un conteneur détaché, utiliser la commande : 

sudo docker logs <id|nom>

Docker Build

Documentation utilisée

On peut avoir envie de créer nos propres images. Cela se fait via un fichier Dockerbuild qui contient les différentes étapes. La création d'une image se fait toujours en partant d'une image existante, et en y ajoutant des fichiers ou en y executant des commandes. Voici les commandes disponibles :

  • FROM <image> : indique sur quelle image se baser ;
  • RUN <commande> : exécute une commande sur l'image ;
  • COPY <source> <destination> : copie un fichier depuis source sur la machine hôte vers destination vers l'image ;
  • WORKDIR <dossier> : indique au conteneur de se placer dans le dossier dossier au démarrage ;
  • CMD ["<cmd>","<arg1>","<arg2>","<arg...>"] : définit la commande à exécuter au lancement du conteneur.

Par exemple, voici un Dockerfile prenant une image debian, y installant zsh, y copiant un script mon_script à la racine puis définissant la commande à exécuter au lancement du conteneur comme zsh mon_script :

FROM debian
RUN apt-get install zsh
COPY mon_script /scripts/
WORKDIR /scripts
CMD ["zsh","./mon_script"]

Pour construire une image à partir d'un Dockerfile, se placer dans le dossier contenant le fichier Dockerfile et exécuter :

sudo docker build [-t <image name>]

Docker Compose

Pour faciliter la configuration de conteneurs, il est possible d'utiliser un fichier de configuration écrit en YAML, nommé docker-compose.yaml, et de démarrer ou de stopper un service existant avec, respectivement :

sudo docker-compose start
sudo docker-compose stop

Pour construire, recréer, démarrer et attacher tous les conteneurs d'un service :

sudo docker-compose up -d

L'option -d permettant de lancer le conteneur en mode détaché, ce dernier étant autrement en mode interactif.

Pour arrêter un service et supprimer les conteneurs, images et données associées :

sudo docker-compose down

Pour plus d'informations sur la syntaxe des fichiers docker-compose, voir la documentation officielle.