Cet article a pour but de vous faire comprendre le B-A-BA de docker. Dans un premier temps, j'explique les concepts derrière docker, ensuite je vous explique comment l'installer et enfin je vous donne quelques commandes utiles pour le manipuler. Généralement, lorsqu'il s'agit de docker, même les développeurs qui ont 3 voire 4 années d'expérience n'y comprennent pas grand chose. La confusion règne quand on parle de conteneur, images, dockerfile, docker- compose, volumes et networking. Voyez-vous ? Au début on ne sait pas vraiment les distinguer, mais c'est en l'utilisation que tout devient fluide, surtout lorsqu'on essaye d'assembler son propre environnement.
Conteneurs VS Machines Virtuelles
Une fois je parlais de Docker à un ami qui me rétorqua à la fin de mon propos qu'il peut bien utiliser VirtualBox pour avoir des environnements différents. Et puis il peut tout aussi exporter une machine virtuelle issue de VirtualBox. Je pense qu'il le disait parce qu'il n'a pas très bien compris où je voulais en venir.
En effet, les machines virtuelles permettent d'exécuter plusieurs systèmes d'exploitation sur le matériel d'une seule machine physique, tandis que les conteneurs permettent de déployer plusieurs applications utilisant le même système d'exploitation sur une seule machine virtuelle ou un seul serveur.
Par exemple, en utilisant VirtualBox, chaque environnement aura son système d'exploitation qui lui est associé, tandis qu'avec Docker, tout fonctionne sur le même système d'exploitation. C'est là où repose toute la différence entre VirtualBox et Docker.
C'est quoi Docker
Docker est une plateforme open source et propriétaire utilisée pour créer, exécuter et déployer des applications dans des conteneurs. Cette plateforme permet de séparer les applications de votre infrastructure afin que vous puissiez livrer des logiciels rapidement. Avec Docker, vous pouvez gérer votre infrastructure de la même manière que vos applications grâce aux images et conteneurs (=ou container dans la suite de l'article).
Image
Une image Docker est un fichier utilisé pour exécuter du code dans un conteneur Docker. Les images Docker agissent comme un ensemble d'instructions pour construire un conteneur.
Par exemple, si vous avez besoin d'un environnement qui fait tourner Laravel, vous pouvez construire une image Laravel qui contient toutes les dépendances dont vous avez besoin. Ensuite, toutes vos applications Laravel pourront tourner sous cette image de Laravel que vous avez créez. Ainsi, vous n'aurez plus besoin d'installer Laravel et ses packages de nouveau.
Les images Docker sont également le point de départ de l'utilisation de Docker. Une image est un modèle qui contient un ensemble d'instructions pour créer un conteneur (ou application) pouvant fonctionner sur la plateforme Docker.
Une image Docker contient du code d'application, des bibliothèques, des outils, des dépendances et d'autres fichiers nécessaires à l'exécution d'une application. Lorsqu'un utilisateur exécute une image, celle-ci peut devenir une ou plusieurs instances d'un conteneur.
Container
Les images et les conteneurs sont les deux éléments essentiels qu'on rencontre quotidiennement lorsqu'on travaille avec Docker.
En termes simples, comme expliqué plus haut, une image Docker est un modèle qui contient l'application et toutes les dépendances requises pour exécuter cette application sur Docker. Ceci étant, chaque application Laravel que vous allez développer sera un conteneur qui fonctionne sous l'image de Laravel que vous aurez précédemment assembler. Vous pourrez alors si vous le souhaitez, installer uniquement les dépendances de votre application dans votre conteneur.
De ce fait, un conteneur Docker est une entité logique c'est à dire une instance en cours d'exécution de l'image Docker.
C'est une entité logicielle standard qui regroupe le code et toutes ses dépendances afin que l'application s'exécute rapidement et de manière fiable d'un environnement à un autre. Une image de conteneur Docker est un paquet léger, autonome et exécutable de logiciels qui comprend tout ce qui est nécessaire pour exécuter une application : code, moteur d'exécution, outils système, bibliothèques système et paramètres.
Dockerfile
Le Dockerfile est un document texte qui contient toutes les commandes qu'un utilisateur pourrait appeler sur la ligne de commande pour assembler une image docker. Le Dockerfile est essentiellement constitué des instructions de construction de l'image. L'avantage d'un Dockerfile par rapport au simple stockage de l'image binaire (ou d'un snapshot/template dans d'autres systèmes de virtualisation) est que les constructions automatiques garantissent que vous disposez de la dernière version disponible.
Dans l'exemple suivant, je vous présente un Dockerfile qui installe l'image de la version 14 de l'ERP Odoo
# Exemple de dockerfile pour installer Odoo
# Il faut noter que cette image de Odoo est basée sur l'image debian:buster-slim
FROM odoo/odoo:14.0
LABEL maintainer="Votre Nom. "
# Installation des dépendances personnalisées s'il y'en a
COPY ./requirements_custom.txt /requirements_custom.txt
RUN pip3 install --upgrade pip && pip3 install -r requirements_custom.txt
# Définition du dossier de travail
WORKDIR /odoo/odoo
# Appel de l'utilisateur Odoo
USER odoo
Docker Compose
Docker Compose est un outil permettant de définir et d'exécuter des applications Docker multi-conteneurs. Avec Docker Compose, vous utilisez un fichier YAML pour configurer les services de votre application avant de l'exécuter sur docker. Cela vous permet de définir le nombre souhaité de conteneurs, leurs constructions et leurs conceptions de stockage, puis, avec un seul ensemble de commandes, vous pouvez construire, exécuter et configurer tous les conteneurs. Docker Compose est idéal pour les environnements de développement, de test et de déploiement, ainsi que pour les flux d'intégration continue.
Pour l'exemple concernant Odoo, on a besoin d'un conteneur pour le serveur Odoo, un autre pour le serveur de BD et enfin un autre comme pgAdmin pour interagir avec la BD
# contenu du fichier docker-compose.yml
version: "3"
services:
odoo14:
container_name: odoo-container-name # nom du conteneur
image: odoo/odoo:14.0 # image sur laquelle est basée le conteneur
depends_on:
- db
ports:
- "8069:8069"
tty: true
stdin_open: true
volumes:
- odoo-odoo14-data:/var/lib/odoo
- ./config/odoo.conf:/etc/odoo.conf
- ./custom-addons:/custom-addons
restart: always # s'exécute en tant que service
db:
container_name: db-container-name
image: postgres:12
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
- PGDATA=/var/lib/postgresql/data/pgdata
ports:
- "5542:5432"
restart: always # run as a service
volumes:
- odoo-db-data:/var/lib/postgresql/data/pgdata
pgadmin:
container_name: pgadmin-container-name
image: dpage/pgadmin4:5.4
depends_on:
- db
environment:
PGADMIN_DEFAULT_EMAIL: admin@dbproject.com
PGADMIN_DEFAULT_PASSWORD: xYz0
PGADMIN_LISTEN_PORT: 80
ports:
- "8099:80"
restart: always
volumes:
- pgadmin-data:/var/lib/pgadmin
links:
- "db:psql-project-name-server"
volumes:
odoo-odoo14-data:
odoo-db-data:
pgadmin-data:
Volumes
Dans le fichier docker-compose.yml précédent, vous pouvez voir la section volumes. En effet, les volumes Docker sont des systèmes de fichiers montés sur les conteneurs pour préserver les données générées par le conteneur en cours d'exécution. Les volumes sont stockés sur l'hôte, indépendamment du cycle de vie du conteneur. Cela permet aux utilisateurs de sauvegarder les données et de partager facilement les systèmes de fichiers entre les conteneurs.
Networking
La mise en réseau de Docker vous permet d'attacher un conteneur à autant de réseaux que vous souhaitez. Par exemple, vous pouvez attacher le serveur Odoo au serveur de base de données. Lorsque vous utilisez le fichier docker-compose.yml, le networking est fait quand vous utilisez le mot clé depends_on dans ce fichier.
Si vous voulez le faire manuellement par exemple en attachant votre conteneur web en cours d'exécution à une passerelle my_bridge, vous pouvez taper
docker network connect my_bridge web
Déploiement
Pour déployer un environnement docker c'est simple: installez docker et docker-compose sur votre serveur, clonez le code source de votre application et tapez la commande
docker-compose up
# ensuite vous pourrez accéder au conteneur si vous voulez et faire vos manipulations
Installer Docker et Docker Compose
# Installation sur Ubuntu 18.04
sudo su
apt update
apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt update
apt-cache policy docker-ce
apt install docker-ce
systemctl status docker
apt install python3-pip
pip3 install docker-compose
Quelques commandes basiques sur Docker
# connaitre le numéro de version
docker –v
# télécharger une image
docker pull
# Créer un container à partir d'une image
docker run -it -d
# Lister les containers qui sont entrain de fonctionner
docker ps
# Lister tous les containers
docker ps -a
# Accéder à un container
docker exec -it bash
# Stopper un container
docker stop
# Forcer l'arrêt d'un container
docker kill
# créer une nouvelle image d'un container en local
docker commit
# Se connecter sur docker hub
docker login
# Démarrer un container avec docker-compose
docker-compose up
# Stopper un container avec docker-compose
docker-compose stop
# Redémarrer un container avec docker-compose
docker-compose restart
# Créer un container avec docker-compose
docker-compose up --build
# Exécuter une commande dans le container
docker exec -it
# Exporter un container sur la machine locale
docker export -o
# Accéder à un container en tant que root
docker exec -it -u 0 bash
# ou
docker exec -it -u root bash
# Voir les adresses IP des containers
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
# ou
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# Copier un dossier ou ficher de son container vers sa machine physique
docker cp : .
# Copier un dossier ou fichier de sa machine physique vers son container
docker cp :
Vous pouvez également utiliser Docker Desktop → https://www.docker.com/products/docker-desktop
Sources
Je n'ai rien inventé, un grand MERCI à ceux qui ont rédigé ces articles:
- https://www.netapp.com/blog/containers-vs-vms/
- https://www.burwood.com/blog-archive/containerization-vs-virtualization
- https://www.edureka.co/blog/docker-commands/
- https://searchitoperations.techtarget.com/definition/Docker-image
- https://www.docker.com/resources/what-container
- https://www.freecodecamp.org/news/docker-simplified-96639a35ff36/
- https://docs.docker.com/engine/reference/builder/
- https://phoenixnap.com/kb/docker-volumes
- https://docs.docker.com/engine/tutorials/networkingcontainers/