Ajout des nouveaux exercices et amélioration des premiers.

This commit is contained in:
Guillaume Bourdat 2020-11-06 23:25:07 +01:00
parent b765de646e
commit e3ec8266b1
4 changed files with 91 additions and 18 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/package-lock.json

View File

@ -21,32 +21,71 @@ L'objectif de cet exercice est de prendre en main les premières commandes Docke
5. Explorer le container et faire comme chez soi. Sortir du container avec `exit`. 5. Explorer le container et faire comme chez soi. Sortir du container avec `exit`.
## Exercice 2 : Volumes, le lien entre les systèmes de fichier du container et de l'hôte ## Exercice 2 : Volumes, le lien entre les systèmes de fichier du container et de l'hôte
Utiliser docker run pour démarrer un container avec une image du système dexploitation Alpine.
Utiliser une option pour démarrer le container en choisissant le nom, y mettre prenom_exercice_2. 1. Utiliser `docker run` pour démarrer un container avec une image du système dexploitation [Alpine](https://alpinelinux.org/about/). Utiliser les options vu précédement pour démarrer le container en choisissant le nom, y mettre `prenom_exercice_2`.
Utiliser une option pour démarrer le container en montant le répertoire /data/prenom/exercice2 du serveur sur le répertoire /data du container.
Se connecter au container en utilisant docker exec. 2. Trouver l'option dans la [documentation](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems) pour démarrer le container en montant le répertoire `~/entrainement/prenom/exercice2` du serveur sur le répertoire `/data` du container.
Une fois dans le container, installer wget et télécharger un gif dans le container et le mettre dans /data.
Explorer le container et faire comme chez soi. Sortir du container avec exit. 3. Se connecter au container en utilisant `docker exec`. Une fois dans le container, installer wget ou curl, puis télécharger un gif dans le container et le mettre dans `/data`.
Explorer les fichiers du serveur pour voir /data/prenom/exercice2. Confimer la présence du gif.
4. Explorer le container et faire comme chez soi. Sortir du container avec `exit`.
5. Explorer les fichiers du serveur pour voir `~/entrainement/prenom/exercice2`. Confimer la présence du gif.
## 3. Objectifs : Utiliser le dockerfile pour créer une image ## 3. Objectifs : Utiliser le dockerfile pour créer une image
Sur le serveur, créer le répertoire ~/entrainement/prenom/exercice3.
Y créer un fichier Dockerfile. 1. Sur le serveur, créer le répertoire `~/entrainement/prenom/exercice3`. Puis y créer un fichier portant le nom `Dockerfile`.
Créer un script pour télécharger un gif de votre choix dans le répertoire /data.
Ecrire le Dockerfile pour créer une image basée sur Ubuntu, installer wget, et y importer votre script. 2. Créer un script pour télécharger un gif de votre choix dans le répertoire `/data` du qui s'exécutera dans le container.
Construire votre image en lançant docker build avec le nom prenom_exercice et version 3.
Lancer limage et monter le dossier /data sur /data/prenom/exercice3. 3. Ecrire le `Dockerfile` en se basant sur la [documentation](https://docs.docker.com/engine/reference/builder/) pour créer une image basée sur `Ubuntu`, installer wget, et y importer votre script.
Explorer les fichiers du serveur pour voir /data/prenom/exercice2. Confimer la présence du gif.
4. Construire votre image en lançant `docker build` avec les bonnes [options](https://docs.docker.com/engine/reference/commandline/build/) pour donner le nom `prenom_exercice` à l'image et la version 3.
5. Créer un container de cette image et monter le dossier `/data` sur `~/entrainement/prenom/exercice3` comme dans l'exercice précédent.
6. Explorer les fichiers du serveur pour voir `~/entrainement/prenom/exercice3`. Confimer la présence du gif.
## 4. Objectifs : Créer une image avec un fichier serveur ## 4. Objectifs : Créer une image avec un fichier serveur
Lorsque notre image est 1. Dans le répertoire `~/entrainement/prenom/exercice4`, créer un nouveau `Dockerfile`.
2. Créer une image qui contient [Node JS](https://nodejs.org/en/).
3. Inclure dans l'image le script `server.js`. S'assurer que `server.js` est appelé à l'exécution de l'image. Ne pas oublier d'ajouter la commande `npm i` pour l'installation des dépendances **nodejs**.
4. Lancer un container de cette image avec `docker run`.
5. Pour connaitre l'ip de votre container taper `docker inspect` suivi du nom du container. En fin de description, trouver l'IP du container probablement proche de `"IPAddress": "172.17.0.X"`.
6. Depuis le server, utiliser curl pour faire une requete sur le server nodejs : `curl http://172.17.0.X:3000`
## 5. Objectifs : Utilisation de docker compose ## 5. Objectifs : Utilisation de docker compose
A venir.
Comme vous pouvez le voir, il y a parfois beaucoup de commande et d'options, il peut être laborieux de tout taper à la main. Heureusement, il y a [docker-compose](https://docs.docker.com/compose/) qui permet de gérer rapidement plusieurs containers en une seule ligne de commande.
1. Dans un répertoire, créer le dossier `~/entrainement/prenom/exercice5`. Y créer le fichier `docker-compose.yml`.
2. Se baser sur la [documentation](https://docs.docker.com/compose/compose-file/) pour créer le `docker-compose.yml`. Créer un service nommé app. Utilisé l'image que vous avez précédement créé.
3. Lancer `docker-compose up`. Tester votre server comme précedement.
4. Dans le `docker-compose.yml` ajouter une ligne pour modifier la variable d'environnement PORT pour mettre `3002`. Relancer `docker-compose up` puis tester à nouveau avec `curl http://172.17.0.X:3002`.
## 6. Objectifs : Utiliser le reverse proxy avec Nginx ## 6. Objectifs : Utiliser le reverse proxy avec Nginx
Nous avons maintenant un service web qui répond localement à mes requêtes. Je veux maintenant l'ouvrir à l'extérieur par l'intermédiaire d'un **reverse proxy**. Nous avons maintenant un service web qui répond localement à mes requêtes. Je veux maintenant l'ouvrir à l'extérieur par l'intermédiaire d'un **reverse proxy**. Il en existe quelques uns très populaire en ce moment qui font le boulot. Pour cet exercice nous avons choisi d'utiliser [Nginx](https://www.nginx.com/).
1. 1. Explorer le dossier `/etc/nginx/sites-available`. Y créer un fichier de configuration avec le nom `prenom.caracals.org`.
2. Vous inspirez des autres fichiers présents pour écrire votre fichier. Attention, `sudo` est necessaire pour la modification de ce dossier. Laisser les parties `#certbot`
3. Créer un lien symbolique pour activer votre configuration. `sudo ln -s /etc/nginx/sites-availables/prenom.caracals.org /etc/nginx/sites-enabled/prenom.caracals.org`.
4. On ajoute rapidement un [certificat de sécurité](https://fr.wikipedia.org/wiki/Certificat_%C3%A9lectronique) pour assurer les échanges en https avec l'outil [CertBot](https://certbot.eff.org/) de l'[EFF](https://www.eff.org/). Lancer la commande `sudo certbot --nginx`. Suivre la console pour sécuriser votre nom de domaine.
5. Relancer le service nginx avec la commande `sudo nginx -s reload`.
6. Depuis votre ordinateur se rendre sur `https://prenom.caracals.org`.
Voilà, vous venez d'auto héberger votre premier site web :D

19
package.json Normal file
View File

@ -0,0 +1,19 @@
{
"name": "entrainement-docker",
"version": "1.0.0",
"description": "A simple server for training",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"repository": {
"type": "git",
"url": "https://git.caracals.org/Caracals/entrainement-docker.git"
},
"author": "Sanae",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}

14
server.js Normal file
View File

@ -0,0 +1,14 @@
const express = require('express');
const process = require('process');
const app = express();
const port = process.env.PORT || 3000;
// Si la variable d'environnement n'est pas configuré, démarrage par défaut sur le port 3000
app.get('/', (req, res) => {
res.send('Bien joué, tu as réussi. Ce serveur répond aux requêtes !');
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
})