Pour commencer nous allons installer Docker sur Ubuntu :
Les droits root sont nécessaires
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
On peut installer une version spécifique de docker via la commande suivante :
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
On s'assure que tout fonctionne bien en lançant un container hello-world :
sudo docker run hello-world
Afin d'exécuter des commandes docker sans devoir utiliser sudo et donc sans avoir les droits root nous allons ajouter notre utilisateur au groupe docker.
Attention, ajouter uniquement les utilisateurs de confiance au groupe docker ! Ils peuvent exécuter des container avec les droits root (privileged
) et donc accéder au système entier :
sudo usermod -aG docker <username>
Une fois effectué, reloguez-vous sur la machine et vérifiez que vous pouvez utiliser Docker sans sudo :
docker version
Afin d'identifier un container Docker utilise ce qu'on appelle un UUID :
$ docker run -d -p 80:80 nginx
41ef0023720edsef56z1fds123ez54r6z4fs3
Un UUID est généré automatiquement (41ef0023720edsef56z1fds123ez54r6z4fs3 ici).
Si l’on fait un docker ps on peut voir dans “NAMES” qu’un nom au aléatoire est généré :
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41ef0023720e nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp busy_leakey
Ici, CONTAINER_ID est le UUID court (12 char).
Pour identifier son propre container on va pouvoir lui donner un nom :
$ docker run --name mynginx -d -p 800:80 nginx
5794134a5da726deafefe8dbf7b691bf86b611b2abfca200e817ee2bbf1c5831
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5794134a5da7 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:800->80/tcp mynginx
Si je veux stopper/démarrer un container je peux spécifier le Nom ou l’UUID (court ou long).
$ docker stop mynginx
mynginx
# OU
$ docker stop 5794134a5da7
5794134a5da7
Par défaut un container Docker peut accéder à l’internet mondial. Mais l’internet mondial ne peut pas y accéder. Pour se faire il faut alors faire du “port binding” (attacher un port de l'hote à un container) :
On va donc binder le port hote 8080 au port 80 du container :
docker run --name mynginx -p 8080:80 nginx
Nginx sera accessible sur le port 8080 de notre IP publique. Notre firewall système (iptables) autorise automatiquement les ports exposés par un container docker.
docker run --name attached -p 8080:80 nginx
Nous n’avons pas la main sur le tty, mais nous voyons les logs en live. CTRL+C va stopper (mais pas supprimer) le container.
docker run -d --name detached -p 8081:80 nginx
Ici, nous allons garder la main sur notre terminal et le container va s’exécuter en arrière plan.
Dorénavant la nouvelle manière d’utiliser la commande docker pour des containers est :
docker container | Docker Documentation
On va d’abord stopper un container :
docker stop mynginx
# OU
docker container stop mynginx
Puis stopper tous les containers
docker stop $(docker ps -aq)
# OU
docker container stop $(docker container ps -aq)
Le principe est le même pour effacer un container :
docker container rm mynginx
docker container rm $(docker container ps -aq)
Le PID (Processus ID) d'une commande par défaut est 1, cependant nous pouvons exécuter d'autres commandes dans le container (nginx ici) :
Le processus principal de nginx (1) est le lancement du serveur web. Cette commande est définie dans l’image (voir docker hub, voici le dockerfile de nginx).
docker container run -d --name mynginx nginx
On va exécuter la commande bash en interactif sur ce container :
docker container exec -it mynginx bash
apt get update
apt install netstat
On va donc avoir un shell. Il faut que bash soit dans le /bin pour pouvoir le faire. Certaines images n'auront que sh, ash...
En quittant, cela ne va pas stopper le container. On peut évidemment exécuter d’autres commandes.
La commande docker container exec ne fonctionne que si le process principal (nginx en l’occurrence) tourne (PID 1).
Si nginx se stoppe, le container s’arrête.
Petit rappel Linux :
Qu’est-ce que veut dire -i et -t exactement ?
docker container exec mynginx bash
, bash s’exécute et se referme tout de suite après.$ docker exec -i nice_nobel bash
ls
bin
boot
dev
...
$ docker container exec -t mynginx-exec bash
root@fb36fc8d70ea:/# ls
^C
# Rien ne ressort car pas de STDOUT
Pour se faire, 2 façons :
docker container run -d nginx sleep 500
Ici le container nginx va exécuter la commande “sleep 500” puis quitter (soit 500s plus tard).
Par défaut, les containers docker ne vont pas redémarrer quand ils seront quittés ou que le service docker redémarrera. Restart policies va résoudre ce “problème” :
Start containers automatically
En pratique :
docker container run -d --restart unless-stopped nginx
unless-stopped est le plus utilisé en production.
Pour connaitre la taille des images/containers/volumes etc… qu’occupent docker sur le disque :
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 4 1.178GB 367.8MB (31%)
Containers 5 4 321.4kB 1.114kB (0%)
Local Volumes 3 2 51.05MB 0B (0%)
Build Cache 0 0 0B 0B
Si on veut connaitre l’utilisation précise de chaque images :
$ docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
postgres 11-alpine ec1e25ef56d1 10 days ago 156.4MB 0B 156.4MB 1
nginx latest 62d49f9bab67 11 days ago 133.1MB 0B 133.1MB 2
requarks/wiki 2.5 6e5216a72c3a 3 weeks ago 429MB 0B 429MB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
fb36fc8d70ea nginx "/docker-entrypoint.…" 0 1.12kB 23 minutes ago Up 23 minutes mynginx-exec
Local Volumes space usage:
VOLUME NAME LINKS SIZE
projets_db-data 1 51.05MB
2637cbc61acdd739157c16fba974e27a5b1c36905ef90128e1da09bbb427511b 1 0B
e29b5356fbe2274a67a069aed11c9facefccbaab06b4e0d42dca2248a829cc89 0 0B
Build cache usage: 0B
En général utilisé pour éviter de prendre trop de place sur le disque.
Par exemple :
docker container run -d --name testcontainer busybox ping -c10 google.com
Ce container va pinguer 10x google.com puis quitter. Cependant si l’on fait un docker container ls -a
on le verra toujours (en statut exited).
Pour l’effacer totalement il faut lancer la commande suivante :
docker container run -d --rm --name testcontainer01 busybox ping -c10 google.com
Dans la prochaine partie, on traitera le sujet de la création, gestion et registre des images