_
~ DAMOLAB - Les tambouilles textes, teks et hacks ~
"Entre l'arbre et l'écorce, il ne faut pas mettre le doigt." - proverbe
DAMOLAB (#TAGS) _./._ XBNF blog _./._ Blog _./._

Introduction à docker


| FR | par DAMO | | 02/06/2025 12h00 | (last update 21/12/2025 18h09) | Commentaires |
#DEV #LINUX #SOFTWARE #ARCHITECTURE
comprendre et débuter avec docker
|


Il existe plusieurs solutions logiciel autour de la contenerisation, orchstration, clustering, ...

Ce billet couvre docker uniquement.

1) Concepts



Docker est une architecture de conteneurs permettant
de déployer des images d'applications avec une version précise, la conteneurisation offre
une souplesse, légèreté et gestion d'un environnement pilotable à loisir.

La phylosophie autour des conteneurs est que les ressources sont cloisonnées,
chaque conteneur a son propre système de fichier, sa propre adresse IP, sa propre mémoire, ...

L' orchestration des conteneurs est abordé dans l'article sur Kubernetes.

La phylosophie autour des images est que seule les données nécessaires pour une application
sont fournis et surtout pour une version donnée ce qui permet d'éviter les problèmes de
dépendances entre librairies et executables sur un système classique.

/!\\ Une image n'est pas modifié par le conteneur, il possible de recréer l'image à partir d'un conteneur.

2) installation



Install Docker Engine

3) lignes de commandes



ref1
ref2
ref3
ref4

L'aide en ligne:
 docker --help 

 docker run --help 


Les dangers potentiels de chaque commande, si vous avez des données dans le conteneur ou l'image,
pensez à backuper ou dupliquer la machine pour ne pas perdre de données ou en cas de fausse manip.

/!\\ pour lancer les commandes docker, il faut être logué en tant que user docker, root ou appartenir au groupe docker.

Pour autoriser l'utilisateur user par exemple:
	vi /etc/group
	...
	docker:x:994:user

(remplacer user par votre utilisateur de votre choix.


3.1) générales


Vérifier l'état du daemon docker :
 service docker status 


La version du moteur:
 docker version 


Démarrage de docker:
 systemctl start docker 


Activation du démarrage automatique:
 systemctl enable docker 


Vérifier si le daemon est bien déclarré et activé au démarrage:
 systemctl list-unit-files | grep docker 



3.2) exemples


       
3.2.1) lancer un conteneur


Lancer un conteneur:
 docker run hello-world 


Le conteneur est crée avec un ID généré unique mais peut aussi être positionné:
 docker run --name my_first_hw hello-world 


Lister tous les conteneurs:
 docker ps -a 

Sans l'option -a, seuls les conteneurs démarrés sont affichés.

L'image hello-world est récupéré de dockerHub.
 docker images 


Ce conteneur est démarré et s'arrête dès que la commande lancée se termine,
si l'on souhaite que le conteneur reste allumé il va falloir configurer une commande qui garde la main,
par exemple:
 docker run ... tail -f /dev/null 


Pour relancer le conteneur:
 docker start my_first_hw 


Visualiser le résultat d'execution:
 docker logs my_first_hw |grep Hello


       
3.2.2) propriété d'un conteneur


L'ajout ou modification des propriétés suivantes nécessitent la recréation du conteneur pour être prose en compte.

       
       
3.2.2.1) Volumes


/!\\ Les volumes sont des "montages" de fichiers ou répertoires persistés même après suppression du conteneur.
Il est possible de créer un volume interne (comme un fileset) ou existant sur le host (en dehors).
  • Dans créer un un volume interne persisté:
     docker volume create my_vol 

en dehors du conteneur le volume est sous /var/lib/docker/volumes/my_vol/_data

Il s'utilise de cette façon:
 docker run ... -v my_vol:/point/de/montage/ ... 

  • Dans le cas d'un volume externe, il s'agit de l'arborescence existant sur le host.


Il s'utilise de cette façon:
 docker run ... -v /home/user/docker:/point/de/montage/ ... 


Lister les volumes internes:
 docker volume ls 



       
       
3.2.2.2) Ports TCP


Si un port d'écoute (daemon/service) à l'intérieur du conteneur doit pouvoir être accessible de l'extérieur:

Il s'utilise de cette façon:
 docker run ... -p 10000:443 ... 


Ici, si un apache écoute sur 443, il sera accessible via un browser avec une URL du type:
 https://localhost:10000 


/!\\ le démarrage du conteneur échoue si le port est déja utilisé sur la machine, pour le vérifier, en tant que root:
 netstat -nap|grep :10000 



       
3.2.3) image


Récupérer une images DockerHub:
 
	docker pull debian
	docker images


Le nommage d'une image est utile pour gérer les images que l'on crée ansi qu'avec un registre (i).
 docker tag {IMAGE ID image} {label repo}:{tag} 


Exemple de conteneur qui restera allumé:
	docker tag {ID image debian} my_deb:version
	docker run -d --name my_shell my_deb:version tail -f /dev/null
	docker exec -ti my_shell bash


Le docker exec ici permet de lancer ici un shell positionné dans le conteneur,
cela est indispensable pour mettre au point une image (debug, test) et l'architecture du conteneur qui l'utilise.
(avec docker-compose notament, (i).
Lancer des commandes de l'extérieur pour interroger le conteneur, exemple pour afficher l'adresse IP:
 docker exec my_shell hostname -I 


Le principe de l'image est d'avoir le strict nécessaire, il peut manquer des commandes comme ps, netstat, lsof, ...
Donc, pour la mise au point, on peut avoir besoin d'installer des packages manuellement pour tester puis
ne pas les conserver dans l'image qui sert au conteneur.

La suppression d'une image:
 docker rmi {IMAGE ID} 

Ne fonctionne pas si l'ID est référencé sous plusieurs tag, ici debian:latest et
my_deb:version, dans ce cas, il faut supprimer avec le tag:
 docker rmi my_deb:version 

ou
 docker untag my_deb:version 

Le tag est supprimé, il devrait rester encore l'image debian:latest.

Cela ne fonctionne pas non plus s'il existe des conteneurs basés dessus (ON ou OFF), arrêter et supprimer le conteneur:
 
	docker stop my_first_hw 
	docker rm my_first_hw 



4) registre/repository d'image lignes



Créer son propre registre permet de stocker les images et les metttre à jour sur un registre privée,
renomer l'image avec nom DNS de la machine qui fait tourne le conteneur registry.

Par defaut, l'image nommée sans nommage DNS, sera récupéré (docker pull) ou poussée sur DockerHub (docker push),
Pour utiliser le registre publique dockerHub, il faut créer un compte (gratuit) et un repo publique.
Pour s'y connecter:
 docker login 



4.3) Créer son registre privée


Nous allons lancer un conteneur à partir de l'image registre que vous allez pouvoir gérer.
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /registry:/var/lib/registry \
  registry:2 


Prenons par exemple une image que l'on récupére de DockerHub:
 docker pull centos:7 


Positionner le tag devra être nommée avec l'adresse DNS de votre machine cible, par exemple:
 docker tag centos:7 reg.docker.domain.fr:5000/mycentos 


Pour pousser l'image sur le registre privé, faire :
 docker push  reg.docker.domain.fr:5000/mycentos 


Le registre est basique, pas de console et peu de commandes.

Pour lister les images disponibles stockées dans le registre:
 http://reg.docker.domain.fr:5000/v2/_catalog 


Pour lister les tages d'une image :
 http://reg.docker.domain.fr:5000/v2/{image}/tags/list 


Pour récupérer ou utiliser une image sur le registre, c'est le nommage qui indique à docker ou la récupérer:
 docker pull reg.docker.domain.fr:5000/mycentos 

Ou
 docker run ... reg.docker.domain.fr:5000/mycentos ... 


Penser à bien vérifier les images local:
 docker images 


/!\\ lors des manipulations sur les images, bien vérifier que l'ID de l'image correspondants aux tags.


4.4) problème avec le docker login/push/pull en HTTP


ref5

Pour corriger l'erreur
"http: server gave HTTP response to HTTPS client"}, contourner en autorisant le HTTP:
(en tant que root}
{cmd|
	vi /etc/docker/daemon.json
	{ "insecure-registries":["reg.docker.domain.fr:5000"] }

	service docker restart


4.5) sécuriser le registre HTTPS


La section précédente n'est pas sécure, pour sécuriser suivre:
Set up a Private Docker Registry with TLS/SSL Certificate by Let's Encrypt.
(non testé).

4.6) purge du registre privée


ref6

Comme indiqué précédement registry offre peu de possibilités, impossible de supprimer une seule image.
/!\\ ici la purge va supprimer tout le registre afin de l'alléger, à l'issue il faut refaire les docker push.

Ce qu'il faut faire pour repartir d'un registre vide:
	docker stop registry
	docker rm -v registry
	rm -fr /registry/docker/


Puis relancer le registre comme précédemment.


5) Infrastructure as Code



ref7

5.7) Dockerfile : construction d'une image


ref8 - reférence et mot-clefs
ref9 - overview

Il est important de co-localiser tous les fichiers utilisés pour créer l'image dans un même répertoire.
Ici, l'image my_img est construite depuis le répertoire my_img puis poussée dans le registre privé précédement crée.
	cd my_img
	docker build -t reg.docker.domain.fr:5000/my_img:v1 .
	docker image
	docker push reg.docker.domain.fr:5000/my_img:v1



5.8) docker-compose.yml : architecture de conteneurs


ref10 - docker-compose

       
5.8.4) le setup docker compose


compose permet de paramétrer tout
l'environnement d'un conteneur, bien plus complet qu'un simple docker run.
  • dans un répertoire cible dédié, décrire l'architecture de vos conteneurs dans docker-compose.yml
  • démarrer en prenant en compte les modifications:
     docker-compose up -d 
    • sans l'option -d affiche les logs produit par la commande de démarrage
    • control-C pour arrêter le conteneur
    • control-Z pour le mettre en pause puis
       bg 
      pour laisser tourner en arrière plan
  • arrêter et supprimer les conteneurs du yaml:
     docker-compose down 
    /!\\
  • pour un arrêt simple sans suppression:
     docker-compose stop <conteneur> 
  • pour utiliser un yaml bien précis:
     docker-compose -f docker-compose-bis.yml up 



       
5.8.5) contexte du docker compose


Il est important de bien gérer dans plusieurs dossiers en fonction du contexte de travailler selon :
  • l'application cible, EX: database, serveur web, backend, ...
  • l'environnement, EX: test, qualif, recette, pre-prod, prod, ...)


Le fichier .env local au répertoire permet de définir des variables qui sont utilisés dans le
docker-compose.yml.

Le fichier .env est chargé au moment du docker-compose pour être utilisé dans docker-compose.yml.

/!\\ ne pas confondre ces variables avec celles de l'environnement Unix,
elles ne seront pas visibles dans les conteneurs par des commandes de type set ou env.

Exemple de .env :
REGISTERY=reg.docker.domain.fr:5000
CLUSTER=cluster1.prod1
CONTEXT_NAME=appli-db-domain
EXT_DB_PORT=3000


Exemple d'utilisation dans le yaml:
...
app-db:
   image: ${REGISTERY}/vdp-mariadb:10.2
   container_name: ${CONTEXT_NAME}-${CLUSTER}
      ports:
         - "${EXT_DB_PORT}:3306"
   volumes:
      # home Docker
      - ../${CONTEXT_NAME}:/home/docker



       
5.8.6) description des balises dans le tag conteneur du docker compose


ref11 - balises et fonctions
  • La balise image permet d'indiquer le tag et répo de l'image. (Voir
     docker tag 
    ).
  • La balise environment permet d'exporter des variables, qui seront initialisées au démarrage du conteneur quelque soit l'utilisateur.
  • La balise command permet de redéfinir la commande critique, déterminante pour le fonctionnement (Voir
     docker run 
  • La balise depends_on sur chaque conteneur permet de gérer l'ordre de démarrage, cela permet aussi aux conteneurs de communiquer entre eux link.
  • La balise ports permet de mapper le port interne vers un port qui sera exposé en externe.
  • La balise volumes permet de mapper le volume interne vers l'extérieur (Voir
     docker run -v externe/:interne/ ...

un volume mappé ou interne est persisté lors d'un docker down/up.
  • La balise extra_hosts permet de déclarer des hosts distants auquels on veut accéder comme un /etc/hosts


       
5.8.7) description des balises globales du docker compose

  • La balise volumes permet de crée un volume interne utilisable dans les conteneurs
  • La balise networks permet de lier les conteneur dans un même réseau afin qu'ils puissent se joidrent



       
5.8.8) mise au point du docker compose

  • /!\\ le nommage des services si plusieurs fichiers yml sont utilisés sur la même VM, le container_name sera affiché dans docker ps mais un docker-compose up/down identifiera les conteneurs en se basant en réalité sur du nom utilisé sous la balise services. (nom chapeau dans le yml).

  • Utilisateur principal
    • L'utilisateur principal soit dans le DockerFile avec la directive USER, soit dans le yaml
       docker exec -it {conteneur} id 
    • si besoin spécifier l'utilisateur avec -u
       docker exec -u {id} ... 
    • accès root
       docker exec -u 0 ... 
  • l'interconnexion entre les conteneurs, il se peut que le réseau nécessite de pouvoir basculer entre IPv4 et IPv6, pour activer cette option du noyau, faire en tant root :


	# vi /etc/sysctl.conf
	...
	net.ipv4.ip_forward=1
	...
	# systemctl restart network
	# sysctl net.ipv4.ip_forward
	net.ipv4.ip_forward = 1


6) Operation de maintenance




6.9) Nettoyage
/!\\

Nettoyage des conteneurs arrêtés:
 docker rm $(docker ps -aq) 


Suppression des volumes inutilisés:
 docker volume rm <nomVolume> 
/!\\

Grand nettoyage des conteneurs OFF, volumes, images inutilisés:
 docker system prune 
/!\\

Suppression des logs --------


6.10) Transfer de données avec le conteneur


Pour copier une arborescence de fichiers:
 docker cp <Host path> <Container>:<Container path> 

 docker cp <Container>:<Container path> <Host path> 


6.11) Dump ou chargement d'une umage

  • dump d'une image

 docker image save my_deb:version -o my_deb.version.tar 

 docker image save my_deb:version | gzip > my_deb.version.tgz 

  • import d'une image

 docker image load -i my_deb.version.tar 



7) troubleshooting



7.12) commandes spéciales


Le commandes d'investigation Java : jmap, jinfo, ...
Nécessite d'ajouter l'option suivante dans le docker run:
 --cap-add=SYS_PTRACE 



Bonne contenerisation.


0.1) DamoLab


DamoLab@Sourceforge
DamoLab@DockerHub

0.2) Calculette composants radio


Electro-slide

0.3) Technologies


-- IA --
Mistral IA (le chat) (i)

-- Cyber-securité --
Shodan (i)11
Have I been pwned ? (i)
personal-data-leak-check
Osint
Zataz actualités

-- Adresses IP --
Mes Infos (IP, UA, ...)
info IP: WHOIS,ping,...
info IP: WHOIS,ping,...
info IP: Locallisation
info IP: abus
DNS checker

-- Mails --
GMX
Hushmail - mail temporaire sécurisé

encode/decode email for defeating bots
 $_='mailto: matt@org';s/(.)/chr(ord($1)+5)/eg;$_ 


-- Linux --
News LinuxFr
Mind-map Linux
Tutorials
crontab

-- Blogs Teks --
@TechWorldwithNana
@Cookieconnect
@GoCloudArchitects
@grafikart
@Underscore_
@cybernewsenfrancais


-- Geek Code --

décoder un GC

GCS d>+(---) s- a+ C++$ UL+>$ UOS++$
P++++>$ L++ E W++(++) N(+) o-- K+ w>--- O- M>+ PS+>+++ PE-- Y+@ t-(+) >5 X+ R>+ !tv b+
D---- D+ G e+++ h---- r+++ z+++



Rescue NEO...
(JS by Rezmason)


Nom/surnom:
Message:


revenir sur l'article
#DEV #LINUX #SOFTWARE #ARCHITECTURE

Aucun commentaire.

dans
une
galaxy
lointaine
Charte du site damolab.zapto.org est motorisé par

"La force est une sorte de fluide crée par tout être vivant, une énergie qui nous entoure et nous pénètre, et qui maintient la galaxie en un tout unique."
- Obi-Wan à Luke Yoda