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é.

https://www.redhat.com/fr/topics/cloud-computing/what-is-paas

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 :

Deploy Static HTML Website as Container | Docker | Katacoda
Interactive Learning and Training Platform for Software Engineers
  • 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 unique
  • IMAGE : l'image utilisée
  • COMMAND : la commande lancée dans le conteneur
  • CREATED : la date de création
  • STATUS : l'état du conteneur
  • PORTS : 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'image
  • TAG: son tag/version
  • IMAGE ID: son identifiant unique
  • CREATED: 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 commande docker 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 à :

Meme Generator - Imgflip
Insanely fast, mobile-friendly meme generator. Caption memes or upload your own images to make custom memes

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é.

Docker for Beginners - Linux
Learn docker through online trainings in training.play-with-docker.com

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).

GitHub Pages
Websites for you and your projects, hosted directly from your GitHub repository. Just edit, push, and your changes are live.

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 :

Getting Started on Heroku with Node.js | Heroku Dev Center
A step-by-step guide for deploying your first Node app and mastering the basics of Heroku

Le tutoriel vous demandera de cloner le repository suivant :

GitHub - heroku/node-js-getting-started: Getting Started with Node on Heroku
Getting Started with Node on Heroku. Contribute to heroku/node-js-getting-started development by creating an account on GitHub.

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 :

Load Balancing Containers | Docker | Katacoda
Interactive Learning and Training Platform for Software Engineers

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 :

Docker Orchestration Hands-on Lab
Learn docker through online trainings in training.play-with-docker.com

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 :

Kubernetes on IBM Cloud
Develop and manage applications in a preconfigured Kubernetes environment available for four hours at no charge.

[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"
Extrait de : https://gabrieltanner.org/blog/docker-registry

À 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) :

How to create your own private Docker registry and secure it
In this article, we will take a look at what a registry is, why it is essential and how you can create your own private registry. We will also take a look at some security and storage options that can help you customize your configuration.

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.

Quickstart for GitHub Actions - GitHub Docs
Try out the features of GitHub Actions in 5 minutes or less.

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 }}
main.yml

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 :

Encrypted secrets - GitHub Docs
Encrypted secrets allow you to store sensitive information in your organization, repository, or repository environments.

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 :

GitHub - mdestombes/minecraft_bukkit_wolf_server: Install and easily management for a Minecraft Bukkit/Spigot server with werewolf plugin. Enjoy.
Install and easily management for a Minecraft Bukkit/Spigot server with werewolf plugin. Enjoy. - GitHub - mdestombes/minecraft_bukkit_wolf_server: Install and easily management for a Minecraft Buk...

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