Docker
Introduction
docker --help | more
Cycle de vie de base :
- Créer le conteneur à partir d'une image
- Exécuter le conteneur avec un processus spécifié
- Détruire le contenuer une fois le processus terminé
Cycle de vie avancée :
- Créer le conteneur à partir d'une image
- Exécuter le conteneur avec un service spécifié
- Interagir avec le service
- Arrêt et redémarrage possible du conteneur
Recherche des images sur Docker Hub
Une recherche standard s'effectue par la commande docker search
. Si on souhaite avoir la description de l'image, on utilise --no-trunc
:
docker search --no-trunc nginx
Aborder les conteneurs
Exécuter un conteneur
docker run -it ubuntu
(commande par défaut de l'image)
docker run -it ubuntu ps
docker run -it ubuntu bash
Exécuter en mode attaché et détaché
docker run --name=nom1 --hostname=host01 -it ubuntu
docker run -d -it centos ping 127.0.0.1 (d = mode détaché)
docker ps
docker logs containerID
docker attach containerID
Autres modes d'éxécution
docker run -d -P nginx
docker ps
pour connaitre le mapping des ports
docker stop containerID
docker start containerID
docker kill containerID
docker exec
pour exécuter un autre processus dans un conteneur, ne pas lancer comme application principale (docker run)
ps -ef
pour visualiser les processus
Inspecter un conteneur
docker inspect containerID
docker inspect --format='{{.State.Status}}' containerID
docker inspect --format='{{json .State}}' containerID
Lister et supprimer des conteneurs
docker ps
docker ps --filter status=exited
docker ps --filter exited=137
exemple : suppression des conteneurs arretés
docker rm $(docker ps -aq --filter status=exited)
Employer les images docker
Espace de nommage :
- racine (root) : ex. ubuntu:20.04
- utilisateur ou organisation : ex. masociete/monappli:1.0
- autohebergé : registry.masociete.com;5000/monappli
Visualiser les différences :
docker diff containerID
Valdier les modifications
docker commit containerID masociete\monos:1.0
docker images
docker history masociete\monos:1.0
Créer une image à partir d'un Dockerfile
docker build -t masociete/monos:1.0 .
Get-Content Dockerfile | docker build -
Chaque modification du fichier Dockerfile permet de générer une version à jour, les modifications sont visible via docker history
Pour tagger une image
docker tag containerID sulian/test:1.0
docker tag containerID sulian/test:latest
Bonnes pratiques dans un Dockerfile
(i.e visiblité et performance)
- Chaque ligne crée une nouvelle couche
- Equilibre entre la lisibilité et le nombre de couches
- Un ENTRYPOINT par Dockerfile
- Combiner les commandes avec " && " et " \ "
Apréhender les volumes
Générer des volumes
docker volume create vol1
docker volume ls
docker run -it -v vol1:/www/html centos bash
de façon anonyme :
docker run -it -v vol1:/www/html centos bash
docker volume inspect vol1
Monter un fichier :
docker run -d --name=nginx2 -v /home/user1/nginx/nginx.conf:/etc/nginx/nginx.conf
Partager les volumes
Astuce :
Si docker run -d --name=host1 it <image> bash
, on peut rentrer dans le conteneur avec docker attach host1
-d
= detach
Créer et partager un conteneur de données
docker run --name=datas -v /data busybox true
Va créer un volume /data que l'on réutilise dans un autre conteneur en passant le nom du conteneur
docker run -it --volumes-from datas --name=host1 centos bash
Mettre en réseau
-> Pas d'adresse réseau publique
Installer le package bridge-utils
pour la commande brctrl
afin de voir les interfaces de Docker.
brctl show addrIP
docker network ls
- bridge = pont entre conteneurs
- host = pile réseau de l'hôte
- none/null = pas de pile réseau
docker network create --driver bridge --subnet 10.1.0.0/16 --gateay 10.1.0.1 prod
docker network create --driver bridge --subnet 10.2.0.0/16 --gateay 10.2.0.1 dev
docker network inspect prod
docker run -d -it --net prod --name=cont1 --hostname=host1 alpine
docker run -d -it --net prod --name=cont2 --hostname=host2 alpine
La résolution de nom ne fonctionne que sur les noms des conteneurs
Pas de résolution de nom sur le réseau par défaut (sans --subnet)
docker network connect prod host3
pour connecter une machine à un réseau