Introduction à Docker
Docker est une plate-forme opensource pour développer, livrer et exécuter des applications. Avec Docker, vous pouvez séparer vos applications de votre infrastructure. Docker permet ainsi de livrer du code plus rapidement, de tester plus rapidement, à déployer plus rapidement et à raccourcir le cycle entre l'écriture de code et l'exécution de code. Pour résumer : tout va plus vite. Les conteneurs Docker peuvent être directement utilisés dans Kubernetes.
J'en parle car cette introduction à Docker s'inscrit dans une série d'article sur Kubernetes. J'ai d'ailleurs publié une présentation de Kubernetes.
Le but de cet article n'est pas de vous expliquer le fonctionnement de Docker mais de présenter comment créer, exécuter et déboguer des conteneurs Docker . J'explique, par l'exemple, comment extraire des images Docker de Docker Hub et de Google Container Regisitry
La virtualisation permet d'isoler un OS sur lequel vous exécuter une application. Docker permet de la conteneurisation d'applications, c'est à dire que l'OS n'est pas isoler. En efffet, Docker utilise les fonctions de l'OS hôte. La conséquence est que le conteneur est "léger" par rapport à une machine virtuelle.
Un schéma pour comprendre :
Les bénéfices de la « containerisation » sont multiples :
Démarrez Docker.
Vérifiez que tout fonctionne :
Ce qui donne (si tout se passe bien ) :
Nous venons d’exécuter le conteneur "hello-world"
Exécutez la commande ci-dessous pour listes les images récemment créées :
Exécutez maintenant la commande ci-dessous pour lister les images en cours d'exécution :
Seul le conteneur nginx est en cours d'exécution. Le conteneur hello-world que vous avez exécuté précédemment est déjà terminé. La commande docker ps -a permet de lister les conteneurs, y compris ceux qui ont terminé leur exécution.
Pour comprendre les conteneurs, vous avez besoin d'une bonne compréhension des concepts d'état.
Avant d'exécuter le conteneur, Docker télécharge l'image httpd:2..4:
Une fois téléchargé, Docker lance le conteneur :
Mais docker ne rend pas la main. Si, dans une nouvelle session je lance la commande docker ps je constate que le conteneur tourne bien. Nous avons donc besoin d'une option docker pour que le conteneur tourne en tache de fond. Nous allons voir même que nous avons besoin d'autres options pour que apache fonctionne correctement en conteneur, mais commençons par le début. Exécutons la commande ci-dessous :
Ce qui donne :
Cette fois Docker a bien rendu la main. la commande docker ps indique que le conteneur tourne et qu'il porte le nom mon-apache :
Ce qui donne :
Concernant les options docker run : -i démarre une session interactive / -t émule un tty / -d indique dit à Docker de se détacher et de s'exécuter en arrière-plan.
Les options sont accessible sur la page docker run usage. Ok, nous avons lancé un service HTTP en écoute sur le port 80 à l’intérieur du conteneur, mais à aucun moment vous n’avez ouvert un accès vers l’extérieur.
En effet, les conteneurs sont isolés les uns des autres et peuvent tous deux utiliser le même port. Vous pouvez lancer 5 conteneurs apache. Chaque conteneur exécutera apache sur la port 80. Les ports à l'intérieur du conteneur sont uniquement disponibles à l'intérieur du conteneur. Les ports ne sont pas disponibles à partir de l'hôte Docker lui-même.
On va donc exposer un port entre notre machine et le conteneur docker. Pour cela nous allons utilise l'option -p (ou -publish pour "Publish a container’s port(s) to the host") :
Dans la syntaxe 8080:80, le premier port correspond à celui de la machine hôte et le second au port interne du conteneur.
La commande docker ps ci-dessous liste les conteneurs exposant le port 80 :
Notre conteneur est donc accessible depuis la machine hôte sur le port 8080 :
Dernière étape pour pouvoir utiliser son serveur web, mapper un répertoire du serveur hôte avec le répertoire racine html du serveur apache (/usr/local/apache2/htdocs/) du conteneur. L'objectif étant de pouvoir afficher nos propres fichiers HTML. La commande ci-dessous, via l'option -v (pour volume) :
Le répertoire
/usr/local/apache2/htdocs/ à l’intérieur de notre conteneur contient bien nos fichiers sources situés dans /opt/html/ et non plus les fichiers apache par défaut.
Portainer (une interface graphique pour gérer votre environnement docker) :est livré nativement dans un container docker. Pour exécuter le conteneur Portainer
Une dois déployé, vous pouvez vous connecter à l'interface web via l'adresse suivante: http://ip-de-votre-machine:8888 ( ici j'ai positionné 8888 pour le mapping des ports) Portainer permet de déployer facilement des conteneurs :
- Lancement beaucoup plus rapide
- Facilité de migration d’une machine à une autre
1 2 3 |
yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io |
1 |
systemctl start docker |
1 |
docker run hello-world |
1 |
docker run hello-world |
1 |
docker images |
1 |
docker ps |
1 |
docker ps -a |
Stateful
Dynamique Changements dans le temps Doit être sauvegardé régulièrementStateless
Statique Ne change pas ou change rarement Ne doit être sauvegardé qu'une seule fois Les conteneurs ne sont pas indiqués pour les applications STATFEUL. En raison de leur nature immuable et éphémère, la conteneurisation des applications avec état présente peu d'avantages. Aussi, la conteneurisation des applications avec "état" est possible mais nécessite un travail et des considérations supplémentaires. Pour que les applications STATFEUL soient conteneurisées, vous devez conserver l'état en dehors du conteneur : Dans une base de données, dans un object Store (par exemple AWS S3), dans un dossier local sur l'hôte docker, dans un dossier partagé (par exemple NFS). Si les données persistantes sont corrompues ... l'environnement est corrompu ... Dans la section suivante, nous allons voir comment persister les données "en dehors du conteneur" Nous allons maintenant exécuter le conteneur Apache pour exécuter un serveur Web . Comme pour le test précédent, on lancer le conteneur avec la commande run :
1 |
docker run httpd:2.4 |
1 |
docker run -dit --name mon-apache httpd:2.4 |
1 |
docker container ls --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}} \t{{.Size}}" |
1 |
docker run -dit --name mon-apache-80-p 8080:80 httpd:2.4 |
1 |
docker ps --filter expose=80/tcp |
1 |
curl -v http://localhost:8080 |
1 |
docker run -dit --name my-apache-app -p 8080:80 -v "/opt/html/":/usr/local/apache2/htdocs/ httpd:2.4 |
1 |
docker run --name portainer.io --restart always -d -p 8888:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer_data/:/data portainer/portainer |