Aller au contenu

Docker 101

C'est quoi un conteneur ?#

Docker logo

L'objectif d'un conteneur est le même que pour un serveur dédié virtuel : héberger des services sur un même serveur physique tout en les isolant les uns des autres. Un conteneur est cependant moins figé qu'une machine virtuelle en matière de taille de disque et de ressources allouées.

Un conteneur permet d'isoler chaque service : le serveur web, la base de données, des applications pouvant être exécutées de façon indépendante dans leur conteneur dédié, contenant uniquement les dépendances nécessaires. Chaque conteneur peut être relié aux autres par des réseaux virtuels. Il est possible de monter des volumes de disque de la machine hôte dans un conteneur. Si aucun processus n'est démarré dans le conteneur, alors celui-ci s'arrête. On parle parfois de virtualisation d'OS : contrairement à la virtualisation qui émule par logiciel différentes machines sur une machine physique, la conteneurisation émule différents OS sur un seul OS. (source Wikipédia [1])

Docker est une plateforme permettant de lancer certaines applications dans des conteneurs logiciels.

Plus information sur le site de Docker: https://www.docker.com/resources/what-container/

Installation sur Windows#

  • Installer Docker-Desktop
  • Visiter le site pour les instructions: https://www.docker.com
  • Revenir ici une fois installé

Exécution d'un premier conteneur#

  • Ouvrir une session Power Shell
PowerShell
1
2
3
4
5
# Aller chercher une image de base de Linux
docker image pull debian:bullseye-slim

# Exécuter en mode terminal dans votre écran
docker run -it --rm debian:bullseye-slim bash
  • Reférence pour docker run
  • Vous êtes maintenant dans un environnement Linux isolé
  • Vous pouvez vous promener dans les répertoires avec les commandes usuelles (cd, ls ...)
  • Pour sortir, c'est la commande : exit

Commandes de base#

PowerShell
# Liste des images locales
docker image ls

# Listes conteneurs en exécution
docker container ls

# Liste de tous les conteneurs (arrêtés ou en exécution)
docker container ls -a

# Nettoyer les images temporaires et ressources inutilisés (libérera de espace disque)
docker system prune

Exécution d'une base de données PostgreSQL#

Nous allons démarrer une base de données qui s'exécutera dans votre environnement. Peut-être très utile pour faire des tests sur différentes saveurs de base de données.

PowerShell
1
2
3
4
5
6
7
8
# Télécharger l'image
docker image pull postgres:14.5

# Démarrer les conteneur en mode Deamon & en passant une variable pour le mot de passe
docker run --name ma-bd-psql -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:14.5

# Confirmer que le conteneur est actif
docker container ls
  • Vous pouvez vous brancher à Postgres avec votre outil de BD préféré sur le port 5432 avec l'utilisateur postgres et le mot de passe passé en variable.
PowerShell
1
2
3
4
5
6
7
8
# Arreter le conteneur
docker stop ma-bd-psql

# Confirmer que le conteneur est inactif
docker container ls

# Pour retirer le conteneur
docker rm ma-bd-psql
  • Il y a un problème avec notre exemple! Si vous avez écrit des données dans a DB, elles seront perdues.
  • La solution pour que les données persistent est qu'un répertoire du conteneur soit partagé avec un répertoire local.
PowerShell
1
2
3
4
5
6
7
8
# Exemple pour partager un volume
docker run `
    --name ma-bd-psql `
    -e POSTGRES_PASSWORD=secret `
    -p 5432:5432 `
    -v C:\temp\psql\data:/var/lib/postgresql/data `
    -d `
    postgres:14.5 S

Premier Docker File#

Depuis le début nous avons utilisé des images créées par d'autres organisations. Maintenant, nous allons créer notre propre image. - Dans un nouveau répertoire, créer les trois fichiers suivant: - dockerfile - package.json - src/main.js

dockerfile

Docker
FROM node:18.9-alpine

RUN mkdir /app
WORKDIR /app

#Install NPM Package
COPY package.json package.json
RUN npm install
RUN npm install -g nodemon

#Copy only the required files
COPY src src

##Start the Server !!
CMD npm start
package.json
JSON
{
    "name": "bonjour",
    "version": "0.0.1",
    "private": true,
    "scripts": {
      "start": "node src/main.js"
    },
    "dependencies": {
        "express": "4.14.x"
    }
}
src/main.js
JavaScript
1
2
3
4
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Bonjour le monde!'));
app.listen(3000, () => console.log('Ecoute sur le port 3000!'));
- Dans Powershell, les commandes suivantes
PowerShell
1
2
3
4
5
6
7
8
# Construire l'image
docker image build -t bonjour .

# Voir qu'elle existe
docker image ls

# Démarrer le serveur Node
docker container run -name serveur-node --rm -p 3000:3000 bonjour
- Ouvrir votre fureteur web : http://127.0.0.1:3000 - Vous avez peut-être votre premier serveur Node JS. - Arrêter le conteneur avant la prochaine section.
PowerShell
docker rm --force serveur-node

Utilisation de Docker Compose#

La configuration des conteneurs peut devenir complexe, pour nous aider, il y a Docker Compose.

  • Dans le répertoire de la section précédente, ajouter:
    • docker-compose.yml

docker-compose.yml

YAML
version: '3'
services:
  bonjour:
    build:
      context: .
      dockerfile: Dockerfile
    image: bonjour
    ports:
      - 3000:3000
    volumes:
      - ./src:/app/src
    environment:
      - ENV_PARAM=123
- Dans Powershell, les commandes suivantes
PowerShell
docker compose up
- Ouvrir votre fureteur web : http://127.0.0.1:3000 - Pour arrêter:
PowerShell
docker compose down
Références pour Compose

Autres ressources#