Docker Avancé - Les instances
Les instances
Le cycle de vie des instances Docker
Debugger Docker
Les instances Docker sont des processus standards lancés dans un host.
On dispose des moyens classiques pour suivre son activité :
- Logs
- Strace
On peut également bénéficier des outils spécifiques aux conteneurs
- Modifier la manière de lancer le container (ex: donner les droits root)
- Exec dans le même espace de conteneurisation
Comment faire quand on utilise des images distroless i.e. sans Shell ?
- Disposer d'une image non-distroless
- Utiliser l'API debug de l'orchestrateur k8s
Les volumes Docker
Rappel : à quoi servent les volumes dans les environnements de conteneurs ?
Les instances Docker sont... des processus standards lancés dans un host.
On peut monter des volumes selon les méthodes usuelles de Linux :
- mount bind
- mount tmpfs
- mount spécifiques Docker (ex: /var/lib/docker/xxx)
Plugins de volumes
On peut utiliser d'autres systèmes de stockage en installant de nouveau plugins de driver de volume. Par exemple, le plugin vieux/sshfs
permet de piloter un volume distant via SSH.
Exemples:
- SSHFS (utilisation d'un dossier distant via SSH)
- NFS (protocole NFS)
- BeeGFS (système de fichier distribué générique)
- Amazon EBS (vendor specific)
- etc.
# Installation du plugin SSHFS
$ docker plugin install vieux/sshfs
# Création du volume
$ docker volume create -d vieux/sshfs -o sshcmd=<sshcmd> -o allow_other sshvolume
# Montage du volume
$ docker run -p 8080:8080 -v sshvolume:/path/to/folder --name test someimage
Les réseaux Docker
Les réseaux Docker sont automatisés : DNS, IP Address Management, et plus.
La solution basique est de faire un bridge local.
La solution Docker Swarm utilise un réseau spécial nommé overlay.
La solution Kubernetes apporte des composants qui permettent de résoudre plus habilement les problèmes réseaux.
On accède aux réseaux dans Docker avec la ligne de commande et le verbe network
Ex: docker network ls
TP : Lancer deux instances Docker avec un volume et un réseau nommés partagés
Objectif : vous devez lancer deux instances Docker
- avec une image alpine
- nommées container_1 et container_2
- dans le même réseau
test
- avec le même volume
test
monté sur /data
Vous devriez pouvoir afficher et modifier le contenu d'un même fichier.
Vous devriez également pouvoir faire un ping de la machine 1 vers la machine 2.
Correction
docker network create test
docker volume create test
docker run -d --rm -v test:/data --network test --name container_1 alpine:latest sh -c "while true; do read /dev/null; done"
docker run -d --rm -v test:/data --network test --name container_2 alpine:latest sh -c "while true; do read /dev/null; done"
docker exec -it container_1 sh
/ # echo container_1 > /data/info
docker exec -it container_2 sh
/ # cat /data/info
/ # ping container_1