Table des matières

, , ,

Docker

Docker permet la création d'un environnement d’exécution isolé (appelé conteneur ou container) pour une application, un programme, une commande. Le conteneur, regroupe ou empaquette l'application et ses dépendances ainsi elle pourra être exécutée sur n'importe quel serveur/distribution Linux. Cette méthode étend la flexibilité, la portabilité de l'application.

Notions

Docker s'appuie sur des briques logicielles pérennes et des mécanismes internes au noyau Linux (LXC, les cgroups et namespaces). C'est un outil de haut niveau simplifiant la mise en place de l'isolation de processus.

Les conteneurs ne sont pas cross-plateforme: il y a des conteneurs pour Linux (Docker), des conteneurs BSD, des conteneurs Windows.

Le Docker hub: Dépôt externe sur lequel les utilisateurs/entreprises mettent à disposition des images.

Docker fonctionne en client/serveur: l'utilisateur via les commandes, lance le client qui contacte le serveur (service local ou daemon). Si l'image n'est pas présente sur le système local, le daemon télécharge l'image depuis le hub Docker (pull). Le daemon crée un nouveau conteneur depuis l'image et les paramètres de configuration fournis.

Par défaut, le container est une bulle fermée, la commande expose permet aux conteneur mapper un port du conteneur sur un port du host (publier) pour que le conteneur soit visible sur le réseau.

Cas d'utilisation

Installation

Sous Debian:

apt install docker.io
 docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Pour que l'utilisateur puisse créer un conteneur, il doit appartenir au groupe docker:

usermod --append --groups docker username
docker version
 
# afficher les paramètres de configuration de docker
docker info

Créer des images et instancier des conteneurs

On ne peut pas utiliser directement l'image iso d'un cd avec docker. docker n'est pas une vm. Les images sont des systèmes de fichiers intégrant toutes les dépendances nécessaires à l’exécution correcte de la commande ou du programme. Le container utilise l'image pour créer son environnement d'exécution, il dispose d'un ensemble de propriétés supplémentaires qui peuvent être listée via la commande:

docker container inspect container_name

avoir une image mise a dispo par docker (registry)



Gestion des images docker

Rechercher

Rechercher une image en ligne via le navigateur https://hub.docker.com/explore/

Depuis la ligne de commande:

docker search busybox

Pour limiter les résultats, un système de filtre est disponible:

docker search --filter=is-official=true --filter=stars=3 --limit 10 busybox

Ici on ne veut que les 10 premiers résultats avec deux critères: plus de 3 étoiles et image officielle.

Si l'on souhaite lister les révisions (tags) disponibles pour une image, docker ne propose pas d'option directement via la commande “docker search” mais on va pouvoir s'appuyer sur l'API avec une commande de la forme:

wget -q https://registry.hub.docker.com/v1/repositories/busybox/tags -O - | jq -r '.[].name'

Récupérer

Pour récupérer une image, utiliser la commande “docker pull”:

docker pull busybox:1.24-glibc
Lorsqu'une image est récupérée localement, elle est disponible pour tous les utilisateurs.
Si aucun tag n'est spécifié, le tag lastest est utilisé.

Lister

Lister les images disponibles localement:

# équivalents
docker image list
docker image ls
docker images

Supprimer

Supprimer une image stockée localement:

docker image rm label_image:revision

# équivalent
sudo docker rmi label_image:revision
On peut également désigner une image via l'IMAGE ID

Suppression des images non utilisée

Pour supprimer toutes les images non utilisées par les conteneurs existants:

docker image prune -a

Gestion des conteneurs

Un conteneur peut être créé, exécuté, relancé, supprimer.

Un conteneur ne peut se lancer que s'il a une commande à exécuter. Une fois la commande exécutée, le conteneur s' arrête.

Exécuter un conteneur

Dans sa forme la plus épurée, la commande docker container run permet de lancer l'exécution d'une commande dans un nouveau conteneur:

docker container run hello-world

Si l'image n'est pas présente localement, Docker essaye de la télécharger puis crée le conteneur et lance l’exécution de la commande.

La commande run possède de nombreux arguments. Une présentation plus détaillé dans le wiki.

Lister les conteneurs

Par défaut la commande docker container ls liste les conteneurs en cours d’exécution:

# équivalents
docker container ls
docker ps

Pour lister l'ensemble des conteneurs existants:

docker container ls -a
docker ps -a

On remarque que la commande retourne:

Relancer un conteneur

Une fois le conteneur identifié, on peut relancer son exécution:

docker container start label_conteneur

Le conteneur est exécuté mais contrairement a la commande “docker container run”, aucun message n'est affiché car par défaut le conteneur est ré-exécuté en arrière plan. Pour altérer se comportement utiliser l'option -a, –attach:

docker container start --attach label_conteneur

Relancer en arrière plan:

docker container restart label_conteneur

Lister les processus d'un conteneur

Pour visualiser l'ensemble des processus s'exécutant au sein du conteneur:

docker container top container_name

Arrêter l’exécution d'un conteneur

docker container stop label_conteneur

# Instancier une image (créer un conteneur)

docker run -t -i --env="" --name=busybox busybox 'echo hello world'

logs d'un conteneur

toutes les sorties (stdout et stderr) d'un conteneur produisent le log. Pour consulter le log d'un conteneur:

docker container logs label_conteneur

Pour n'afficher que les dernières sorties produites par le conteneur, utiliser l'option –tail

docker container logs --tail 10 label_conteneur

Pour suivre les sorties produites par un conteneur en temps réel, on peut utiliser l'option –follow, -f:

docker container logs --follow label_conteneur

Supprimer un conteneur

docker container rm label_container 

conteneur enveloppe, environnement pour exécuter un programme.

docker utilise des systèmes de fichiers

J'ai fait une image, j'ai fait une instance, je les modifiée, et je fais une nouvelle image qui intègre ces modifications avec la commande docker commit

si je veux la partager docker push, pousse l'image sur la registry pour qu'elle soit disponible pour tous.

docker et granularité

Un gros conteneur application wordpress peut cotnenir beaucoup de composants: base de données serveur web)

La problématique de la data, elle évolue dans le conteneur. Le l'application externaliser la data: utilisation d'un conteneur de type data: ne portera pas de process

bien découper, maîtriser la granularité, maîtriser les flux et les Le Dockerfile donne l’enchaînement des commandes permettant de reconstruire le conteneur

documentation de référence: https://docs.docker.com/reference/builder/

Exemple

#on decide de partir de la dernière version Ubuntu
FROM ubuntu:latest
RUN apt-get install -y memcached

#expose le service aux autres conteneur
EXPOSE 11211
CMD ["/usr/bin/memcached"]

sur le site officiel, concept et vocabulaire de base dans la section référence, la syntaxe du docker file est détaillée: https://docs.docker.com/reference/builder/

Creer l'image sudo docker build -tag toto/monimage

Relations de dépendance

Variables d'environnement pour passer plein d'infos dans le containers. On les définies lors de l'instanciation du container avec docker run et l'option -e ou --env

Remarque: sur le site la registry, on voit les image et les docker file qui permettent de construire l'image. Tres bonne source d'inspiration.

lorsque j'instancie un contaienr, je precise qu'il a un lien avec un autre conteneur: sudo docker run –name –link=database_server -p 4000:8000 -d cree un environnement dans blog serveur avec les infos exportées par le container link

créer un script qui tient compte

logs

Chaque conteneur possède ses propres journaux. Il est possible de préciser le format des journaux, la taille maximale de ceux-ci, les paramètres de rotation etc.

Pour déterminer quel mode de journalisation est définit sur un conteneur:

docker inspect --format '{{.HostConfig.LogConfig.Type}}' container_name

La commande docker info retourne quel mode de journalisation est actif par défaut.

Quelques exemples pour spécifier le comportement des logs sur un conteneur:

# désactiver la journalisation
docker run -it --log-driver none alpine ash
 
# logs dans un fichier au format json
docker run -it --log-driver json-file --log-opt max-size=2m,max-file=5 alpine ash

De nombreuses options existent, la documentation officielle indique comment paramétrer la méthode de journalisation pour docker ou pour un conteneur https://docs.docker.com/config/containers/logging/configure/

Supprimer les logs

Les fichiers journaux sont stockés par docker dans un dossier dédié au conteneur. La commande docker container list affiche le début de l'ID de chaque conteneur. Cet ID est utilisé comme nom de dossier dans /var/lib/docker/containers/

# Recherche et affiche les fichiers de logs associés aux conteneurs
sudo find /var/lib/docker/containers/ -type f -iname \*.log -exec ls -lh {} \;

Références