Artefact
Objectifs
- Comprendre la notion de paquet et d'artefact
- Comprendre le fonctionnement d'un conteneur
- Dockeriser une application
Cours
Artefact
DevOpsArtefact
Cycle de vie d'un programme
Cycle de vie d'un programme
Package
Package
Contrat entre le développeur et l'opérateur
Format de livraison
Exemples
.jar, .war, .ear (Java)
.apk (Android)
.exe, .dll (Windows)
.html, .css, .js (Web)
Dépendances
Dépendances
Besoin de libraries externes ?
Comment les gérer et les distribuer ?
Gestionnaire de paquets
Fichier de configuration (liste des dépendances)
pom.xml (Maven)
package.json (npm)
Gestionnaire de paquets
Gestionnaire de paquets
Maven, Gradle (Java)
npm, pnpm, yarn (Node.js)
APT (Advanced Packaging Tool) (Linux)
pip, Poetry (Python)
Dependency
Dependency

Configuration
Configuration
Comment run le programme ?
Quel OS ?
Quelle version ?
Quelle commande ?
Quels arguments ?
Mieux qu'un paquet ?
Mieux qu'un paquet ?
Souhait : Code + Dépendances + Configuration
Solution 1 : Machine virtuelle ?
Problème : lourd et lent
Solution 2 : OS-level virtualization (Conteneur)
Conteneur vs machine virtuelle
Conteneur vs machine virtuelle

Conteneur
Conteneur
Partage le noyau de l'OS
Isolation des ressources (fichiers, processus, ...)
Léger (distribution) et rapide (démarrage)
Docker (leader)
Entreprise privée
Construit sur des technologies pré-existante (namespaces, cgroups, ...)
Podman (alternative)
Projet open-source
Conteneur
Conteneur
https://commons.wikimedia.org/wiki/File:Docker-linux-interfaces.svg
Conteneur
Conteneur
https://jfrog.com/devops-tools/article/understanding-and-building-docker-images/
Dockerfile
Dockerfile
FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./your-daemon-or-script.py" ]
Recette pour construire une image
Bonnes pratiques sur le site de Docker
Couches
Couches

https://docs.docker.com/build/cache/
Image = couches de diff de fichiers
Cache des couches
Cache des couches

https://docs.docker.com/build/cache/
Ordre des couches pour le cache
Du plus stable (dépendances) au plus volatile (code)
Container
Container

https://docs.docker.com/engine/storage/drivers/
Partage des couches entre les containers
Multi-stage builds
Multi-stage builds
FROM maven:3.5.0-jdk-8-alpine AS builder
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package
FROM openjdk:8-jre-alpine
COPY --from=builder target/my-app.jar my-app.jar
EXPOSE 8080
CMD ["java", "-jar", "my-app.jar"]
Compiler dans une image
Plus léger (pas de JDK dans l'image finale)
Réutiliser des couches
Taille des images
Taille des images
Taille de l'image = somme des couches
Inclure que les fichiers nécessaire
Utiliser les multi-stage builds
Préférer la version alpine des images (Alpine Linux)
python:3.11
~360 Mopython:3.11-alpine
~18 Mo
Moins de packages pré-installés
Parfois des problèmes de compatibilité
Dockerignore
Dockerignore
Lors d'un build :
docker build -t my-image .
Envoi de tous les fichiers du context (répertoire courant) au daemon
Utiliser un fichier .dockerignore pour exclure des fichiers -> build plus rapide
# Ignore all files
*
# Allow files and directories
!src/
!pom.xml
Comment animer un dîner de codeurs
Comment animer un dîner de codeurs

https://www.commitstrip.com/fr/2016/06/24/how-to-host-a-coder-dinner-party/
Docker Hub
Docker Hub
Registre d'images Docker
Public et privé (payant)
Préférez les images officielles
Artefact
Artefact
Résultat d'un build
Terme générique (pas de format spécifique) du paquet
Artefact vs Package
Artefact vs Package
Gestionnaire d'artefacts
Gestionnaire d'artefacts
Version OSS (open-source software)
Version payante plus complète que Nexus
Versioning
Versioning
MAJOR.MINOR.PATCH
1.0.0
1.0.1
(bug fix)1.1.0
(new feature)2.0.0
(breaking change)Utilisé par les gestionnaires de paquets
^1.0.0
(>= 1.0.0 < 2.0.0)~1.0.0
(>= 1.0.0 < 1.1.0)
Docker Image Tag
Docker Image Tag
latest
Par défaut si non spécifié
1.3.2
Spécifique à une version précise
Pas de mise à jour des patch de sécurité automatiquement
1.3
Spécifique à une version minor
Recommandé car stable et sécurisé
Selon les projets, plutôt fixer la version major
Fichier lock
Fichier lock
Verrouille les versions des dépendances
Exemples
package-lock.json
(npm)poetry.lock
(Poetry)
À versionner dans le dépôt de code
Versions sans animation, plein écran, imprimable.