Docker – La base

Pour commencer Docker est un outil permettant de gérer des conteneurs.

Les conteneurs sont des ensemble de processus isolé du système.

Contrairement à une machine virtuelle, un conteneur s’exécute à partir d’une image contenant tous les fichiers nécessaires à son exécution, ainsi le conteneur bénéficie d’une grande légèreté et est facilement transportable.

docker

Installation et configuration

Ubuntu / Debian

sudo apt-get update
sudo apt-get install docker-ce

Centos / Redhat

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install docker-ce

Enfin, pour utiliser Docker sans avoir à utiliser sudo, tu peux ajouter ton utilisateur aux groupes docker :

sudo usermod -aG docker your-user

Les commandes de bases

docker run debian

Cette commande permet de télécharger puis lancer un conteneur debian (évidemment tu peux mettre ubuntu, centos ou autres).

sinon on peut aussi simplement récupérer une image sans la lancer :

docker pull debian

Toutes les images sont disponible ici sur Docker Hub

lister toutes les images de son système :

docker images

Afficher tout les conteneurs en cours d’exécutions :

docker ps

Tout tes conteneurs :

docker ps -a

Pour te connecter à un conteneur en cours d’exécution :

docker exec -ti nom_du_conteneur bash

(pour connaître le nom du conteneur, lance un « docker ps »)

Une fois connecter au conteneur tu peux faire ce que tu veux, mais saches que la plupart des librairie de base ne sont pas présente car les conteneurs sont livrés avec le minimum syndical pour être extrêmement léger.

Stopper conteneur :

docker stop nom_du_conteneur

Supprimer conteneur :

Docker rm nom_du_conteneur

Forcer la suppression d’un conteneur :

docker rm -f nom_du_conteneur

Stopper tous les conteneurs :

docker stop $(docker ps -q)

Supprime tous les conteneurs :

docker rm -f $(docker ps -aq)

Nettoyer le système (supprime tout ): 

Docker system prune 

Information précise sur un conteneur : 

Docker inspect nom_conteneur 

Sauvegarder conteneur :

Docker commit id_du_conteneur nom_du_commit

Renommer un conteneur : 

Docker rename nom_conteneur nouveau_nom 

Dockerfile c’est quoi ?

Dockerfile est le fichier qui permet de créer sa propre image et de modifier ces spécificités.

Voici un de mes dockerfiles :

FROM python:3.6 
# Permet à Python d'afficher tout ce qui est imprimé dans l'application plutôt que de le mettre en mémoire tampon. 
ENV PYTHONUNBUFFERED 1
# Création of the workdir 
RUN mkdir /code
WORKDIR /code
# Add requirements.txt file to container 
ADD requirements.txt /code/
# Install requirements 
RUN pip install --upgrade pip 
RUN pip install -r /code/requirements.txt 
# Add the current directory(the web folder) to Docker container 
ADD . /code/
EXPOSE 80
VOLUME /home/projet-django
CMD python manage.py runserver 0.0.0.0:80

Ce dockerfile se base sur une image python 3.6

Ensuite il lance la commande « mkdir » pour créer un dossier, puis se déplace dedans via « WORKDIR »

Il ajoute le fichier requirement du dossier en cours du système hôte vers le dossier /code du conteneur

Installe les librairies requises via « RUN pip install –upgrade pip » et « RUN pip install -r /code/requirements.txt »

L’instruction « EXPOSE 80 » met sur écoute le port 80

« VOLUME /home/projet-django » Partage le dossier /home/projet-django avec le conteneur.

Et enfin il lance la commande « CMD python manage.py runserver 0.0.0.0:80 » qui lance mon application web django (CMD permet de lancer une commande)

Lancer la création de l’image du dockerfile

docker build -t application-web .

docker build lance la création de l’image. -t permet de nommer l’image et enfin le « . » indique que le dockerfile est dans le dossier courant.

Maintenant que l’image est créée nous allons lancer le conteneur basé sur cette image :

docker run -d -p 80:80 application-web

le conteneur est maintenant créer et on peut accéder directement à l’interface web via localhost:80

En cas de problèmes vous pouvez affichez les logs du conteneur via la commande :

docker logs -f nom_du_conteneur

Ceci n’est qu’un exemple de l’utilisation de docker mais il existe énormément de possibilités.

Exemples de Dockerfile

Debian avec SSH

Dockerfile pour déployer une image Debian qui intègre une clé SSH et l’ajoute dans les clés autorisées à se connecter sur root via SSH :

FROM debian:latest

RUN apt update -y
RUN apt install -y python3 python3-pip openssh-server
COPY docker_key.pub /root/.ssh/
RUN cat /root/.ssh/docker_key.pub >> /root/.ssh/authorized_keys
CMD bash -c "/etc/init.d/ssh start && sleep infinity"

Ruby on Rails

Dockerfile pour déployer une application Ruby on Rails :

FROM ruby:2.7
RUN mkdir /code
WORKDIR /code
ADD Gemfile /code/
ADD Gemfile.lock /code/
RUN bundle install
ADD . /code/
EXPOSE 80
CMD ["rails", "server"]

Nginx HTTPS

Image Nginx avec un reverse proxy HTTPS

Le fichier reverse-proxy.conf qui doit être dans le dossier courant et sera utilisé dans l’image :

server { 

listen 443 ssl; 
listen [::]:443 ssl; 

ssl_certificate /etc/ssl/certs/monserveur.com.crt; 
ssl_certificate_key /etc/ssl/private/monserveur.com.key;  

server_name _; 

access_log /var/log/nginx/monserveur.comaccess.log; 
error_log /var/log/nginx/monserveur.com-error.log; 
 

location / { 

proxy_set_header X-Real-IP $remote_addr; 

proxy_set_header HOST $http_host; 

proxy_pass http://monserveur.com:5000; 

proxy_redirect off; 

} 

} 

Le Dockerfile :

FROM debian 

WORKDIR /code 
COPY ssl/*.c* /etc/ssl/certs/monserveur.com.crt 
COPY ssl/*.key /etc/ssl/private/monserveur.com.key 
RUN apt update -y 
RUN apt install nginx -y 
RUN rm /etc/nginx/sites-enabled/default 
COPY reverse-proxy.conf /etc/nginx/sites-enabled/ 

CMD bash -c "nginx && tail -f /dev/null" 

Gestion des environnements de développement

Tu peux utiliser docker pour gérer tes environnements de développement.

En utilisant des images pré-construites pour les différents environnements de développement, tu peux t’assurer que tous les développeurs travaillent dans le même environnement et ainsi réduire les problèmes d’incompatibilité.

Il est également plus facile de mettre à jour ou de changer l’environnement de développement.

Pour utiliser Docker pour gérer les environnements de développement, tu peux créer des images pour chaque environnement de développement, comme par exemple des images pour les environnements de développement Python, Java, Ruby, etc…

Tu peux ensuite utiliser ces images pour créer des conteneurs pour chaque projets.

Utilisation en production

Lorsque tu utilises Docker en production, il y a quelques bonnes pratiques à suivre pour assurer une utilisation stable et sécurisée.

Gestion des mises à jour

Pour mettre à jour une application déployée avec Docker, il est préférable de créer une nouvelle image avec les mises à jour et de la déployer plutôt que de mettre à jour l’image en cours d’exécution.

Cela permet de s’assurer que l’application fonctionne toujours correctement après la mise à jour et de faciliter les rollbacks en cas de problème.

Sauvegarde des données

Il est essentiel de sauvegarder régulièrement les données des conteneurs en cours d’exécution car les conteneurs sont des entités éphémères et les données ne sont pas persistants.

Il est donc important de sauvegarder les données régulièrement et de les stocker sur un support externe.

Il peut être judicieux d’utiliser des docker volumes (voir l’article sur les Volumes) de monter /var/lib/docker sur un FS à part voir sur une partition NFS vers un NAS.

Sécurité

Assures toi que les images utilisées proviennent de source fiable et de les mettre à jour régulièrement pour corriger les failles de sécurité. Il est également important de limiter les privilèges des conteneurs pour éviter les élévation de privilège.

Problèmes courants

Il y a quelques problèmes courants à éviter lors de l’utilisation de Docker en production.

Les ressources système (mémoire, CPU, espace disque) doivent être suffisantes pour les conteneurs en cours d’exécution.

Surveilles les performances des conteneurs pour éviter les surcharges.

Tu dois aussi configurer les réseaux de manière appropriée pour éviter les conflits d’adresses IP et de ports.

Bonus : Extension Docker pour VScode

Cette extension Docker pour VSCode est un plugin gratuit qui va te te faciliter l’utilisation de Docker depuis l’interface de VSCode.

Tu vas pouvoir gérer les images et les conteneurs Docker directement depuis l’interface de VSCode sans avoir à utiliser la ligne de commande.

Avantages :

  • La gestion des images et des conteneurs avec des commandes de base telles que « docker run » et « docker pull »
  • La visualisation des images et des conteneurs en cours d’exécution
  • La possibilité de se connecter à un conteneur en cours d’exécution pour exécuter des commandes
  • La possibilité de créer et de modifier des fichiers Dockerfile et de les construire en un clic
  • Auto complétion et proposition durant l’édition de Dockerfile

Mais je te conseille quand même d’apprendre à utiliser docker en CLI avant de passer par l’extension, c’est important pour savoir ce que fait l’extension à chacun de tes clics et en cas de débug.

L’extension à installer :

Edition de dockerfile :

docker images présentes sur le système (et les docker network voir l’article sur les docker Network)

Les conteneurs présents :

Laisser un commentaire