Outils pour utilisateurs

Outils du site


workshop_docker

Ceci est une ancienne révision du document !


Workshop Docker : les conteneurs faciles

Page dédiée à la présentation de Docker

Préliminaires

Installer Docker

Pour installer docker avant de venir :

sudo apt install docker.io

Ou bien vous pouvez suivre la doc d'installation.

Vous devez etre dans le groupe docker pour pouvoir interagir avec le démon Docker sans passer par le user root. Pour cela :

sudo usermod -aG docker MON_USERNAME
sudo su - MON_USERNAME
id

Vous devez voir apparaitre le groupe docker dans la liste de vos groupes.

Télécharger les images du workshop

Nous aurons besoin de ces images :

docker pull alpine:3.12
docker pull python:3.8-alpine
docker pull python:3.5-alpine
docker pull mysql:8
docker pull wordpress:5.5-apache

Présentation des concepts

Différence entre Conteneur et VM

Une VM :

  • Dispose d'un OS (système d'exploitation dédié) => potentiellement son OS est different de la machine hôte.
  • A besoin d'un hyperviseur installé sur la machine physique hôte.
  • A des ressources dédiées (RAM, CPU)

Un Conteneur :

  • Partage son noyau linux avec celui de la machine physique hôte => Forcément le même OS que la machine hôte.
  • Utilise les cgroup linux pour isoler des procéssus.
  • Utilise les cgroup pour limiter les ressources attribuées.

Les Images Docker

Ce sont de archives de système de fichier. Elles sont nommées avec des tags. Exemple : mysql:8.1. Une image n'est rien de plus qu'une collection de dossiers et fichiers.

Layered FS (Système de fichier multi couche)

Docker utilise les super cool Layered FS pour ses images. Un layered FS est un système de fichier qui enregistre les modifications sous forme de diff (différentiel ou patch). Chaque version peut être vu comme une couche du FS. La version actuelle des fichiers peut être vu comme la fusion de toutes les couches. Chaque image est associé dans Docker a un hash. Lorsque l'on applique une modification à une image, on créé une nouvelle couche par dessus l'image précédente.

Le Dockerfile

Pour construire une Image Docker, on écrit un fichier Dockerfile. Ce fichier est composé de lignes de commande qui vont constituer une par une, pour chaque ligne, une nouvelle image, une nouvelle couche. Notre nouvelle image fraichement construite sera constitué de toutes les couches empilées.

Le Docker Hub

Ce qui permet vraiment une adoption très rapide de Docker, c'est son Hub. Il permet de partager des images Docker avec la communauté. Cela permet vraiment d'économiser beaucoup d'efforts, et de partager les bonnes idées et bonne pratiques pour construire des images.

Conteneur, runtime, image

Une image n'est pas un conteneur. Une image c'est principalement un FS qui est pré-paramétré. Un conteneur est l'enveloppe qui va être crée lors du runtime (de l’exécution) pour contenir ce FS et démarrer un processus dans cette enveloppe.

Exposition de ports

Chaque conteneur dispose de sa stack réseau. Par défaut, un service qui écoute sur un port dans le conteneur. Cela veut dire que vous devez connaitre l'IP de ce conteneur pour accéder au service depuis votre machine. Un mécanisme d'exposition de port au runtime permet de relier un port de sa machine hôte vers le port du conteneur que l'on démarre pour nous faciliter la vie.

Les volumes

Le FS (systeme de fichier) d'un conteneur n'est pas persistant. A la destruction du conteneur, son FS est également détruit. Si l'on veut migrer un conteneur d'une version à une autre, on est forcé de le remplacer, on ne peut pas récupérer le FS du précédent conteneur. Pour répondre à cette problématique, Docker introduit "les volumes". Avec les volumes, Docker permet de "monter" au runtime n'importe quel répertoire de la machine hôte à l’intérieur d'un conteneur. Ainsi, si l'on configure certain volume, les données de nos conteneurs pourront être persistées en dehors de ceux-ci.

Reference

Exemples d'utilisation de Docker

Quelques commandes utiles

Lister tous les containers docker en train de tourner

docker ps

Lister aussi ceux qui sont arrêtés

docker ps -a

Arrêter un container en fonction de son id (première colonne de docker ps)

docker stop --time=20 container_id

Eliminer toutes les images Docker pour lesquelles les containers sont arrêtés et enlever les composantes réseau inutiles

docker system prune

Supprimer des containers en les listant au préalable

docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
3975f606c258        collabora/code      "/bin/sh -c 'bash st…"   51 minutes ago      Exited (137) 17 minutes ago                       keen_booth
b3a2766bbb87        hello-world         "/hello"                 53 minutes ago      Exited (0) 53 minutes ago                         cranky_kowalevski
docker container rm 3975f606c258
docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
107b8ac977e3        bridge              bridge              local
ab998267377d        host                host                local
h520032c3d31        jenkins-overlay     bridge              local
3bc81b63f740        none                null                local

Virer un composant réseau :

docker network rm h520032c3d31

Supprimer l'interface docker0 définitvement ip link delete docker0

Hello World

Utiliser un conteneur léger alpine linux pour executer une commande shell qui affiche "Hello World !". Documentation de l'image alpine

docker run --rm alpine:3.12 echo "Hello World !"

Lancer un shell dans un conteneur alpine linux.

docker run --rm -it alpine:3.12 sh

Pour sortir vous pouvez taper la la commande "exit" ou bien le raccourci "CTRL-D".

Executer un shell python v3.8 sans se préocuper de l'installation de python sur sa machine

docker run --rm -it python:3.8-alpine python

Reproduire un bug avec python 3.5 sans avoir à l'installer

docker run --rm -it python:3.5-alpine python

Démarrer un serveur mysql rapido en mode démon

Documentation de l'image mysql Pour démarrer le serveur et exposer le port 3306 du conteneur sur sa machine. _On précise que l'on n'utilise pas de mot de passe admin pour faire simple avec la variable d'environnement MYSQL_ALLOW_EMPTYPASSWORD=true tel qu'indiqué dans la documentation de l'image.

docker run --rm -d -p3306:3306 --name="ma_bd" -e "MYSQL_ALLOW_EMPTY_PASSWORD=true" mysql:8
docker logs -f ma_bd

Pour connecter un client mysql au serveur depuis le conteneur démarré.

docker exec -it ma_bd

Pour tuer le conteneur de la BD.

docker kill ma_bd

Démarrer le dernier wordpress sans rien installer (as usual)

Documentation de l'image wordpress Le wordpress à besoin d'une BD pour fonctionner. On peut néanmoins constater que le service démarre bien.

docker run --rm wordpress:5.5-apache

Démarrer un mysql + wordpress

On démarre les 2 conteneurs dans le meme réseau pour leur permettre de se parler. On configure le conteneur wordpress comme demandé sur la documentation de l'image.

docker network create wordpress
docker run --rm -d --network=wordpress --name="ma_bd" -e "MYSQL_ALLOW_EMPTY_PASSWORD=true" mysql:8
docker run --rm -d -p8080:80 --network=wordpress --name="mon_wordpress" -e "WORDPRESS_DB_HOST=ma_bd" -e "WORDPRESS_DB_USER=root" wordpress:5.5-apache
docker ps
docker logs -f mon_wordpress

Et visiter la page http://localhost:8080.

Dockerfile

Pour travailler, il faut commencer par cloner le dépôt git d'exemple avec la commande suivante.

cd
git clone https://github.com/mxbossard/dockerfile-example.git
cd dockerfile-example

Puis vous pouvez suivre le contenu du fichier README.md situé à la racine du dépot git.

Docker compose

docker-compose.yml référence

Un autre dépot à cloner pour travailler sur le sujet docker-compose avec la commande suivante :

cd
git clone https://github.com/mxbossard/docker-compose-example.git
cd docker-compose-example

Puis vous pouvez suivre le contenu du fichier README.md situé à la racine du dépot git.

workshop_docker.1607192331.txt.gz · Dernière modification : 2020/12/05 18:18 de Benjamin Labomedia