Déploiement des solutions
TP 1 - Introduction au Cloud computing
Qu'est-ce que le "cloud computing" ?
Le cloud computing est la fourniture de différents services par le biais d'Internet. Ces ressources comprennent des outils et des applications comme le stockage de données, les serveurs, les bases de données, les réseaux et les logiciels.
Plutôt que de conserver les fichiers sur un disque dur ou un dispositif de stockage local, le stockage dans le cloud permet de les enregistrer dans une base de données distante. Tant qu'un appareil électronique a accès au web, il a accès aux données et aux logiciels pour les exploiter.
Le cloud computing est une option populaire pour des raisons d'économies de coûts, l'augmentation de la productivité, la vitesse et l'efficacité, la performance et la sécurité.

Définissez les termes suivants :
- IaaS
- PaaS
- SaaS
- Managed Service Provider
Indiquez pour chacun des termes dans quels cas il est utile de faire appel à ce genre de service. Ainsi qu'au moins un fournisseur célèbre de la solution.
TP 2 - Virtualisation
En informatique, la virtualisation consiste à créer une version virtuelle (plutôt que réelle) de quelque chose, notamment des serveurs, des bases de données et des ressources de réseau informatique virtuels.
- En quoi la virtualisation est intéressante dans le domaine du cloud computing ?
- Quels sont les avantages et les inconvénients de la virtualisation ?
- Qu'est-ce qu'un hyperviseur ?
- Quel est la différence entre virtualisation et conteneurisation ?
TP 3 - Introduction à la conteneurisation avec Docker
Utilisation d'un Docker avec Nginx
Déployez un site web grâce à Nginx en suivant le tutoriel suivant :

- Qu'est-ce qu'un Digest ?
- Donnez un exemple.
Allez jusqu'a l'étape 3 puis exécutez les commandes suivantes :
Pour voir les conteneurs qui tournent actuellement, vous pouvez faire
docker ps
# alias de
docker container ls
Relancer la commande suivante :
docker run -d -p 80:80 webserver-image:v1
- Que se passe-t-il si j'essaie de réexecuter la même commande une seconde fois ?
- Pourquoi ?
- Que veut dire la commande "-p" ? À quoi cela sert ?
- Quelle est la différence entre -P et -p ?
Lancer la commande suivante :
docker ps
- Pourquoi ne voit-on pas notre container ?
Pour voir la totalité des containers créés sur la machine, lancez la commande suivante :
docker ps -a
Vous devriez voir le contenu suivant :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10a8d4ae5e5f webserver-image:v1 "/docker-entrypoint.…" 37 seconds ago Created xenodochial_lumiere
bcdbdbf877ec webserver-image:v1 "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp silly_archimedes
Le résultat de cette commande indique plusieurs choses :
CONTAINER ID
: identifiant de conteneur uniqueIMAGE
: l'image utiliséeCOMMAND
: la commande lancée dans le conteneurCREATED
: la date de créationSTATUS
: l'état du conteneurPORTS
: les ports exposés (ici rien)NAMES
: les noms donnés au conteneur (par défaut ce nom est aléatoire)
Nous allons lancer de nouveau un container, mais cette fois en lui spécifiant un nom (et un autre port) :
docker run --name mysite -d -p 81:80 webserver-image:v1
Retournez voir la liste de tous les conteneurs et le "name" à changé.
Utilisation des images
Exécutez la commande suivante :
docker pull nginx:alpine
Pour voir les images téléchargées sur la machine, vous pouvez exécuter la commande :
docker images
# alias de
docker image ls
De la même manière que docker container ls
on retrouve une liste d'images docker
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.17 ed21b7a8aee9 13 days ago 127MB
hello-world latest fce289e99eb9 15 months ago 1.84kB
Avec les champs suivants :
REPOSITORY
: le nom de l'imageTAG
: son tag/versionIMAGE ID
: son identifiant uniqueCREATED
: sa date de création
À partir de ce moment, on va créer plusieurs instances nginx.
Dans la commande suivante :
docker run -d -p 80:80 webserver-image:v1
Intéressons-nous à l'argument : -d
, mode détaché
- Qu'est-ce que le mode détaché ?
En affichant la liste des containers qui tournent, on obtient les informations suivantes :
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
918d757a2f1b webserver-image:v1 "/docker-entrypoint.…" 16 minutes ago Up 16 minutes 0.0.0.0:81->80/tcp mysite
On va arrêter le container en faisant la commande suivante :
docker stop mysite
En faisant la commandedocker ps
on ne voit plus le container, mais avec l'argument-a
on le retrouve en status éteint.
On va également le supprimer en faisant :
docker rm mysite
Le container n'existe plus.
Pour gagner du temps, on va rajouter l'option --rm
qui va supprimer automatiquement le container dès qu'il est arrêté :
docker run --rm -d -p 80:80 webserver-image:v1
Créez votre plus beau meme grâce à :

Puis insérez-le sur votre page web.
Indice : N'oubliez pas de supprimer le cache ou de rebuild votre image docker :
docker build -t votreNomDImage .
Définitions des concepts
Maintenant que vous avez pratiqué un peu, il va falloir définir les différents concepts :
- LXC, qu’est-ce que c’est ?
- Docker, qu’est-ce que c’est ?
- Qu'est-ce qu'un conteneur ?
- Quelle est la différence entre une image et un conteneur ?
- Docker hub
- Docker compose
- Docker swarm
Puis suivez pas à pas le tutoriel suivant, en modifiant le fichier HTML de l'étape 3 en marquant votre prénom et une image de votre plat préféré.

TP 4 - Utilisations de fournisseurs cloud
Débuter avec Github page
Commencez par créez avec un simple site statique en HTML de votre choix (avec votre nom et prénom par exemple).
Puis créez un repository git sur github en suivant le tutoriel ci dessus. Enfin utilisez github page pour l'hébergé, (screenshot à l’appui).
Débuter avec Heroku
Pour la suite de ce TP, nous allons créer une application en NodeJS avec l'aide d'Heroku.
Inscrivez-vous donc sur le site puis suivez le tutoriel suivant :

Le tutoriel vous demandera de cloner le repository suivant :
Cloner le, et modifier le fichier index.js
comme suivant :
const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000
express()
.use(express.static(path.join(__dirname, 'public')))
.get('/', (req, res) => res.render('public'))
.listen(PORT, () => console.log(`Listening on ${ PORT }`))
Expliquer à quoi sert ${ PORT }
, d'où vient ce numéro ?
Que veut dire la ligne suivante :
const PORT = process.env.PORT || 5000
Pourquoi il y a-t-il une condition OR
? Ou se situe la valeur de process.env.PORT
?
Vous pouvez supprimer le dossier view, ainsi que le contenu du dossier public, créez une page html classique et glisser là dans le dossier public sous nom index.hml
.
Créer un repository GitHub vide. Puis changer l'URL de remote origin :
$ git remote set-url origin git@your.git.repo.example.com:user/repository2.git
Si vous avez des problèmes pour changer de repository vous pouvez regarder le site suivant :
https://xenovation.com/blog/source-control-management/git/how-to-change-remote-git-repository
Déployez ensuite votre page et prenez une capture d'écran avec l'URL visible.
TP 5 - Le Load-balancing
Qu'est-ce que le « Load-Balancing » ? Définissez qu'est-ce qu'un « Reverse Proxy » ? En quoi cela est utile pour faire du load-balancing ?
Réaliser le tutoriel suivant :

Décrivez comment s'aperçoit-on que l'on est bien dans un cas de load-balancing utilisant un algorithme « Round robin » ?
Citez un équivalent au reverse proxy de Nginx mais dédié à Docker.
TP 6 - Orchestration
« L'orchestration des conteneurs permet d'automatiser le déploiement, la gestion, la mise à l'échelle et la mise en réseau des conteneurs. Les entreprises qui ont besoin de déployer et de gérer des centaines ou des milliers de conteneurs Linux et d'hôtes peuvent tirer parti de l'orchestration des conteneurs.
Cette technologie est compatible avec tous les environnements qui exécutent des conteneurs. Elle permet de déployer la même application dans différents environnements sans modifier sa conception. De plus, les microservices stockés dans les conteneurs simplifient l'orchestration des services, notamment les services de stockage, de réseau et de sécurité »
En savoir plus sur le site de redhat
Docker Swarm est une alternative à Kubernetes avec l'avantage d'être embarqué directement avec le moteur Docker. Il est donc facilement accessible. De ce fait, Swarm est plus facile à utiliser au début, et il peut être plus adapté pour des petites charges, et des stack de taille moyenne.
Pour prendre en main l'orchestration de conteneur, réalisez le tutoriel suivant :

Quels sont les avantages de Docker swarm ?
[Bonus] Débuter avec Kubernetes
Inscrivez-vous sur le site d'IBM OpenLabs puis suivez le tutoriel suivant :

[Bonus 2] TP 7 - Livraison continue
Nous voulons mettre en place un peu de livraison continue à l'aide de docker et de GitHub.
Pour cela, il nous faut définir un workflow (un processus de travail), je vous propose le suivant, mais libre à vous de faire le vôtre :
Sur le repository git :
- La branche 'dev' sert à intégré les modifications en cours de développement
- La branche 'main' sert à mettre en production la mise à jour de la branche 'dev' une fois que tout est stable
- Le déploiement en production sera réalisé grâce à une action automatique de GitHub sur la branche 'main'
L'action GitHub consiste à :
- Se connecter à un registre docker privé
- Construire l'image docker
- Push l'image sur le registre
- Se connecter en SSH sur le VPS
- Stopper le conteneur en cours et lancer la nouvelle version grâce au registre.
Pour commencer il va vous falloir un VPS fonctionnel avec Docker dessus.
DockerHub étant payant, je vous propose de faire tourner vous-même votre propre registre Docker. Voici une configuration Docker-compose possible que vous pouvez faire touner en local :
version: '3'
services:
registry:
image: registry:2
ports:
- "5000:5000"
À quoi sert un registre Docker ? Expliquez que fait cette configuration. Faite le tutoriel suivant en faisant simplement tourner votre registre en local (ne pas faire la partie Adding SSL Certificates
) :

Une fois que vous avez compris le fonctionnement d'un registre vous utilisez celui-ci : "https://registry-mds.async-agency.com". Simplement, car GitHub ne prends pas en charge les registres docker non sécurisé par https
Créez-vous un repository sur GitHub qui contient un serveur express (ou ce que vous voulez). Créez bien deux branches : dev
et main
.
Avant de passer aux choses sérieuses, initiez-vous aux GitHub actions à l'aide de ce tutoriel et réalisez votre première action automatique.

Créez une action GitHub, vous pouvez vous aider du modèle suivant :
name: CI - Build&Push on private registry
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check Out Repo
uses: actions/checkout@v2
- name: Log in to the Container registry
uses: docker/login-action@v1
with:
registry: registry.async-agency.com/website-front
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
context: ./
file: ./Dockerfile
push: true
tags: registry-mds.async-agency.com/website:latest
- name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
Utilisez le registre suivant pour push et pull vos images : https://registry-mds.async-agency.com
Pour ajouter des secrets sur GitHub aidez-vous du lien suivant :

Complétez et réalisez le workflow en entier.
[Bonus] TP 8 - Un serveur Minecraft
À l'aide du repository suivant déployer un serveur Minecraft :
La commande pour faire tourner la dernière version stable :
docker run -d -it --name mc-new -v mc:/data -p 25565:25565 -e EULA=TRUE -e OPS=Sajicen -e MOTD="A §l§cMDS§r §nserver" -e MEMORY=12G itzg/minecraft-server
Pour la snapshot :
docker run -d -it --name mc-new -v mc:/data -p 25565:25565 -e EULA=TRUE -e OPS=Sajicen -e MOTD="A §l§cMDS§r §nserver" -e VERSION=SNAPSHOT -e MEMORY=12G itzg/minecraft-server