This commit is contained in:
nemunaire 2020-09-21 23:48:16 +02:00
parent a75f4b43b7
commit 5f4880dc50
14 changed files with 160 additions and 109 deletions

Binary file not shown.

View File

@ -2,30 +2,24 @@ Projet
====== ======
Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un
script `mycloud-run.sh` pour automatiser le lancement de votre instance playbook Ansible pour automatiser le lancement de votre instance personnelle de
personnelle de [`nextcloud`](https://hub.docker.com/_/nextcloud/) ou [`nextcloud`](https://hub.docker.com/_/nextcloud/) ou
d'[`owncloud`](https://hub.docker.com/r/owncloud/server/). Une attention d'[`owncloud`](https://hub.docker.com/r/owncloud/server/). Une attention
particulière devra être apportée à la manière dont vous gérerez le rappel du particulière devra être apportée à la manière dont vous faites persister les
script pour éventuellement relancer un conteneur qui se serait arrêté données entre deux lancements, tout en prenant en compte les futures mises à
(évidemment sans perdre les données). jour.
À la fin de son exécution, le script affichera un lien utilisable sur l'hôte Le service doit être accessible sur votre réseau local, sur un port
pour se rendre sur la page de connexion. Une autre machine de votre réseau configurable.
local devrait également pouvoir accéder à la plate-forme, simplement en
renseignant l'IP de votre machine et en ajoutant éventuellement des règles de
pare-feu (mais cette dernière partie n'est pas demandée, gardez simplement en
tête que cela doit pouvoir être fait manuellement au cas par cas : sur une
machine sans pare-feu configurée, cela ne demande pas d'étape supplémentaire).
Votre script devra se limiter aux notions vues durant cette partie du TP Votre playbook devrait se limiter au module
(ie. sans utiliser `docker-compose` ou `docker stack` que l'on verra dans la [`docker-container`](https://docs.ansible.com/ansible/latest/modules/docker_container_module.html)
seconde partie). Il pourra cependant faire usage des commandes `docker OBJECT (ie. sans utiliser `docker-compose` ou `docker stack` que l'on verra dans un
inspect` pour ne pas avoir à faire d'analyse syntaxique sur les retours des second temps).
commandes lisibles par les humains.
Cette instance devra utiliser une base de données MySQL (lancée par vos soins Cette instance devra utiliser une base de données MySQL ou Postgres (lancée par
dans un autre conteneur) et contenir ses données dans un ou plusieurs volumes vos soins dans un autre conteneur) et contenir ses données dans un ou plusieurs
(afin qu'elles persistent à une mise à jour des conteneurs par exemple). volumes (afin qu'elles persistent notamment à une mise à jour des conteneurs).
L'exécution doit être la plus sécurisée possible (pas de port MySQL exposé sur L'exécution doit être la plus sécurisée possible (pas de port MySQL exposé sur
l'hôte par exemple, etc.) et la plus respectueuse des bonnes pratiques que l'on l'hôte par exemple, etc.) et la plus respectueuse des bonnes pratiques que l'on
@ -36,11 +30,6 @@ a pu voir durant ce premier cours.
<div lang="en-US"> <div lang="en-US">
```bash ```bash
42sh$ ./mycloud-run.sh 42sh$ ansible-playbook -i hosts my_cloud.yml
http://localhost:12345/
42sh$ #docker kill db
42sh$ ./mycloud-run.sh # le script relancera une base de données,
# sans avoir perdu les données
http://localhost:12345/
``` ```
</div> </div>

View File

@ -32,8 +32,8 @@ cela dépendra de votre avancée dans le projet) :
<div lang="en-US"> <div lang="en-US">
``` ```
login_x-TP1/ login_x-TP1/
login_x-TP1/mycloud-run.sh login_x-TP1/my_cloud.yml
login_x-TP1/... login_x-TP1/roles/...
``` ```
</div> </div>

View File

@ -2,5 +2,5 @@
title: Virtualisation légère -- Projet n^o^ 1 title: Virtualisation légère -- Projet n^o^ 1
author: Pierre-Olivier *nemunaire* Mercier author: Pierre-Olivier *nemunaire* Mercier
institute: EPITA institute: EPITA
date: EPITA -- SRS 2020 date: EPITA -- SRS 2021
... ...

View File

@ -42,7 +42,7 @@ envoyé à une autre adresse et/ou non signé et/ou reçu après la correction n
sera pas pris en compte. sera pas pris en compte.
Par ailleurs, n'oubliez pas de répondre à Par ailleurs, n'oubliez pas de répondre à
[l'évaluation du cours](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=213). [l'évaluation du cours](https://virli.nemunai.re/quiz/3).
Tarball Tarball

View File

@ -3,22 +3,22 @@ title: Virtualisation légère -- TP n^o^ 1
subtitle: Les bases de Docker subtitle: Les bases de Docker
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps} author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Mercredi 2 octobre 2019 date: Mardi 15 septembre 2020
abstract: | abstract: |
Durant ce premier TP, nous allons apprendre à utiliser Docker, puis Durant ce premier TP, nous allons apprendre à utiliser Docker, puis
nous apprendrons à déployer un groupe de conteneurs ! nous apprendrons à déployer un groupe de conteneurs !
\vspace{1em} \vspace{1em}
Le TP se termine par un petit projet à rendre à <virli@nemunai.re> Le TP se termine par un petit projet à rendre à <virli@nemunai.re> au
au plus tard le mercredi 16 octobre 2019 à 13 h 42, des questions de plus tard le **mardi 22 septembre 2020 à 12 h 42**. Consultez la
cours sont également à compléter avant cette date sur dernière section de chaque partie pour plus d'information sur les
Epitaf. Consultez la dernière partie de ce TP pour les modalités. éléments à rendre. Et n'oubliez pas de répondre aux [questions de
cours](https://virli.nemunai.re/quiz/3).
En tant que personnes sensibilisées à la sécurité des échanges En tant que personnes sensibilisées à la sécurité des échanges électroniques,
électroniques, vous devrez m'envoyer vos rendus signés avec votre vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
clef PGP. Pensez à [me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re) faire signer
[me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re) votre clef et n'hésitez pas à [faire signer la
faire signer votre clef et n'hésitez pas à [faire signer la
votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
... ...

View File

@ -11,7 +11,7 @@ contiendra les paramètres d'exécution.
<div lang="en-US"> <div lang="en-US">
```yaml ```yaml
version: '3' version: "3.8"
services: services:
influxdb: influxdb:
... ...
@ -35,7 +35,8 @@ Ce fichier est un condensé des options que nous passons habituellement au
Notons toutefois la présence d'une ligne `version` ; il ne s'agit pas de la Notons toutefois la présence d'une ligne `version` ; il ne s'agit pas de la
version de vos conteneurs, mais de la version du format de fichier version de vos conteneurs, mais de la version du format de fichier
`docker-compose` qui sera utilisé. Sans indication de version, la version `docker-compose` qui sera utilisé. Sans indication de version, la version
originale sera utilisée. originale sera utilisée, ne vous permettant pas d'utiliser les dernières
fonctionnalités de Docker.
### `services` ### `services`

View File

@ -15,7 +15,7 @@ Le premier conteneur qui doit être lancé est la base de données orientée sé
temporelles : temporelles :
[InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/). [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/).
En effet, tous les autres conteneurs ont besoin de cette base de données pour En effet, tous les autres conteneurs ont besoin de cette base de données pour
fonctionner correctement : il serait impossible à *Chronograf* d'afficher les fonctionner correctement\ : il serait impossible à *Chronograf* d'afficher les
données sans base de données, tout comme *Telegraf* ne pourrait écrire les données sans base de données, tout comme *Telegraf* ne pourrait écrire les
métriques dans une base de données à l'arrêt. métriques dans une base de données à l'arrêt.
@ -48,8 +48,8 @@ le client fourni :
``` ```
42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \ 42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \
influxdb -host influxdb influxdb -host influxdb
Connected to http://influxdb:8086 version 1.6.3 Connected to http://influxdb:8086 version 1.8.2
InfluxDB shell version: 1.6.3 InfluxDB shell version: 1.8.2
> show databases > show databases
name: databases name: databases
name name
@ -85,7 +85,7 @@ système. Pour cela, on commence par télécharger *Telegraf* :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
curl https://dl.influxdata.com/telegraf/releases/telegraf-1.8.1-static_linux_amd64.tar.gz | \ curl https://dl.influxdata.com/telegraf/releases/telegraf-1.15.3_linux_amd64.tar.gz | \
tar xzv -C /tmp tar xzv -C /tmp
``` ```
</div> </div>
@ -95,7 +95,7 @@ Puis, lançons *Telegraf* :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
cd /tmp/telegraf cd /tmp/telegraf
./telegraf --config telegraf.conf ./usr/bin/telegraf --config etc/telegraf/telegraf.conf
``` ```
</div> </div>
@ -110,7 +110,7 @@ Et observons ensuite :
```bash ```bash
42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \ 42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \
influxdb -host influxdb influxdb -host influxdb
InfluxDB shell version: 1.6.3 InfluxDB shell version: 1.8.2
> show databases > show databases
name: databases name: databases
name name

View File

@ -42,7 +42,7 @@ envoyé à une autre adresse et/ou non signé et/ou reçu après la correction n
sera pas pris en compte. sera pas pris en compte.
Par ailleurs, n'oubliez pas de répondre à Par ailleurs, n'oubliez pas de répondre à
[l'évaluation du cours](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=213). [l'évaluation du cours](https://virli.nemunai.re/quiz/3).
Tarball Tarball

View File

@ -33,7 +33,7 @@ tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64 \ curl -L https://github.com/docker/compose/releases/download/1.27.2/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose chmod +x /usr/bin/docker-compose
``` ```
@ -54,7 +54,7 @@ Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
<div lang="en-US"> <div lang="en-US">
``` ```
42sh$ docker-compose --version 42sh$ docker-compose --version
docker-compose version: 1.24.1 docker-compose version: 1.27.2
``` ```
</div> </div>

View File

@ -137,10 +137,96 @@ l'installation d'un paquet) s'applique à d'autres conteneurs, il va falloir
créer une nouvelle image à partir de ce conteneur. créer une nouvelle image à partir de ce conteneur.
### Programme par défaut
Chaque image vient avec un certain nombre de métadonnées, notamment le
programme à exécuter par défaut si l'on ne le précise pas dans la ligne de
commande.
C'est grâce à cela que vous n'avez pas eu besoin de préciser de programme
lorsque vous avez lancé l'image `hello-world` :
<div lang="en-US">
```bash
docker container run hello-world
```
</div>
Il est commun que le programme le plus attendu/approprié soit lancé par défaut,
il est donc tout naturel que pour l'image `hello-world`, ce soit `/hello` :
<div lang="en-US">
```bash
docker container run hello-world /hello
```
</div>
L'image ne contenant que ce programme, vous ne pourrez pas y lancer de shell :
<div lang="en-US">
```bash
42sh$ docker container run hello-world /bin/sh
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349:
starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown.
```
</div>
Pour les images `alpine` et `ubuntu`, le programme par défaut est un shell
(`/bin/ash` pour `alpine` et `/bin/bash` pour `ubuntu`), mais il y a une
subtilité : il faut ajouter les options `--interactive` et `--tty` pour ne pas
que `docker` nous rende la main tout de suite :
<div lang="en-US">
```bash
42sh$ docker container run alpine
42sh$ echo $?
0
```
</div>
<div lang="en-US">
```bash
42sh$ docker container run --interactive --tty alpine
/ # _
```
</div>
En fait, comme on a vu que le programme `docker` n'est qu'un client du daemon,
c'est toujours le daemon qui exécute directement les commandes et gère les
entrées et sorties standards et d'erreur. Avec l'option `--interactive`, on
s'assure que l'entrée standard ne sera pas fermée (`close(2)`). Nous demandons
également l'allocation d'un TTY, sans quoi `bash` ne se lancera pas en mode
interractif[^bashnointer].
[^bashnointer]: Mais il sera possible de l'utiliser sans allouer de TTY, comme
dans cet exemple :
<div lang="en-US">
```
42sh$ cat cmd
echo foo
42sh$ cat cmd | docker run -i busybox
foo
```
</div>
L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit
transmise au conteneur.
Rassurez-vous, on peut les abbréger en `-i` et `-t` :
<div lang="en-US">
```bash
42sh$ docker container run -it alpine
/ # _
```
</div>
### Les paramètres ### Les paramètres
Vous avez remarqué l'utilisation des options `--tty` et `--interactive` ? Avant Vous avez remarqué le placement des options `--tty` et `--interactive` ? Avant
le nom de l'image, elles sont gérées par Docker pour modifier le comportement le nom de l'image, elles sont utilisées par Docker pour modifier le comportement
du `run`. En fait, tout comme `git(1)` et ses sous-commandes, chaque niveau de du `run`. En fait, tout comme `git(1)` et ses sous-commandes, chaque niveau de
commande peut prendre des paramètres : commande peut prendre des paramètres :
@ -164,30 +250,11 @@ l'emplacement du point de communication avec le daemon), tandis que les options
simplement transmis au conteneur comme argument au premier `execve(2)` du simplement transmis au conteneur comme argument au premier `execve(2)` du
conteneur. conteneur.
Avec l'option `--interactive`, on s'assure que l'entrée standard ne sera pas
fermée (`close(2)`). Nous demandons également l'allocation d'un TTY,
sans quoi `bash` ne se lancera pas en mode interractif[^bashnointer].
[^bashnointer]: Mais il sera possible de l'utiliser sans allouer de TTY, comme
par exemple en faisant :
<div lang="en-US">
```
42sh$ cat cmd
echo foo
42sh$ cat cmd | docker run -i busybox
foo
```
</div>
L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit
transmise au conteneur.
## Lister les conteneurs ## Lister les conteneurs
Avant de quitter notre conteneur, regardons, à l'aide d'un autre terminal, Avant de quitter notre conteneur, regardons, à l'aide d'un autre terminal,
l'état de notre conteneur. La commande suivnate permet d'obtenir la liste des l'état de notre conteneur. La commande suivante permet d'obtenir la liste des
conteneurs en cours d'exécution : conteneurs en cours d'exécution :
<div lang="en-US"> <div lang="en-US">

View File

@ -26,7 +26,7 @@ Assurez-vous également d'avoir un noyau récent, avec la commande `uname -r` :
<div lang="en-US"> <div lang="en-US">
``` ```
5.2.14-gentoo 5.8.9-gentoo
``` ```
</div> </div>
@ -44,7 +44,7 @@ version déjà bien éprouvée, pour ce cours, nous allons avoir besoin de la
**dernière version disponible**. Référez-vous à la documentation officielle **dernière version disponible**. Référez-vous à la documentation officielle
correspondant à votre distribution : correspondant à votre distribution :
<https://docs.docker.com/install/linux/docker-ce/debian/> <https://docs.docker.com/engine/install/debian/>
**Et Kali Linux alors ?** Kali étant basée sur Debian, référez-vous à **Et Kali Linux alors ?** Kali étant basée sur Debian, référez-vous à
la procédure d'installation de cette distribution. la procédure d'installation de cette distribution.
@ -93,47 +93,36 @@ Une sortie similaire au bloc suivant devrait apparaître sur votre écran :
<div lang="en-US"> <div lang="en-US">
``` ```
Client: Client:
Version: 19.03.2 Version: 19.03.12
API version: 1.40 API version: 1.40
Go version: go1.12.9 Go version: go1.14.6
Git commit: 6a30dfc Git commit: 48a66213fe
Built: Mon Sep 16 15:56:27 2019 Built: Thu Aug 6 01:27:59 2020
OS/Arch: linux/amd64 OS/Arch: linux/amd64
Experimental: false Experimental: false
Server: Server:
Engine: Engine:
Version: 19.03.2 Version: 19.03.12
API version: 1.40 (minimum version 1.12) API version: 1.40 (minimum version 1.12)
Go version: go1.12.9 Go version: go1.14.6
Git commit: 6a30dfc Git commit: 48a66213fe
Built: Mon Sep 16 15:55:09 2019 Built: Thu Aug 6 01:26:25 2020
OS/Arch: linux/amd64 OS/Arch: linux/amd64
Experimental: true Experimental: true
containerd:
Version: 1.2.13
GitCommit: 35bd7a5f69c13e1563af8a93431411cd9ecf5021
runc:
Version: 1.0.0-rc10
GitCommit:
docker-init:
Version: 0.18.0
GitCommit: fec3683b971d9c3ef73f284f176672c44b448662
``` ```
</div> </div>
### Versions de Docker
Historiquement, Docker est un projet open-source. Depuis quelques années, le
business-model de la société a évolué et ils proposent désormais deux
éditions : *Community Edition* et *Enterprise Edition*. La seconde est payante
et possède un certain nombre d'atouts pour faciliter son adoption en entreprise
(notamment pas mal d'interfaces graphiques, etc.). Le cœur de la technologie,
qui nous intéresse princialement dans ce cours, est entièrement présent dans
l'édition communautaire, sans limitation.
Depuis mars 2017, les numéros de version de Docker sont tirés de l'année et
du mois de parution (comme on a l'habitude avec Ubuntu 16.04 par exemple). Le
rythme actuel de parution est d'une version par trimestre (mars, juin,
septembre, décembre).[^versions]
[^versions]: Tous les détails sur les versions (CE/EE et numérotation,
fréquences, ...) sont résumés dans cette annonce :
<https://blog.docker.com/2017/03/docker-enterprise-edition/>
### `no such file or directory`? ### `no such file or directory`?
Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or

View File

@ -105,8 +105,8 @@ de données.
Ne vous embêtez pas avec les mots de passes des services, initialisez la base Ne vous embêtez pas avec les mots de passes des services, initialisez la base
de données avec le nom d'utilisateur et le mot de passe par défaut. Vous les de données avec le nom d'utilisateur et le mot de passe par défaut. Vous les
obtiendrez en lisant l'aide (et la [documentation de l'image obtiendrez en lisant l'aide et la [documentation de l'image
MySQL](https://hub.docker.com/_/mysql/)) : MySQL](https://hub.docker.com/_/mysql/) :
<div lang="en-US"> <div lang="en-US">
```bash ```bash

View File

@ -36,6 +36,11 @@ docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d ng
Une fois cette commande lancée, votre voisin pourra accéder à votre dossier Une fois cette commande lancée, votre voisin pourra accéder à votre dossier
Downloads en renseignant l'IP de votre machine dans son navigateur favori ! Downloads en renseignant l'IP de votre machine dans son navigateur favori !
Par défaut, `nginx` ne va pas permettre de lister le contenu du répertoire (et
va afficher une page 404, car il cherche un fichier `index.html` dans votre
répertoire). Vous pouvez par contre accéder à un fichier directement, par
exemple : <http://10.42.12.23/dQw4w9WgXcQ.mp4>
## Les volumes ## Les volumes
@ -58,7 +63,7 @@ Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
docker container run --mount source=prod_youp0m,target=/srv/images nemunaire/youp0m docker container run --mount source=prod_youp0m,target=/images nemunaire/youp0m
``` ```
</div> </div>
@ -85,7 +90,7 @@ exclusivement en RAM\ :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m docker container run --mount type=tmpfs,target=/images nemunaire/youp0m
``` ```
</div> </div>
@ -105,8 +110,8 @@ même volume :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
docker container run -d --mount source=prod_youp0m,target=/srv/images -p 8080:8080 nemunaire/youp0m docker container run -d --mount source=prod_youp0m,target=/images -p 8080:8080 nemunaire/youp0m
docker container run -d --mount source=prod_youp0m,target=/srv/images -p 8081:8080 nemunaire/youp0m docker container run -d --mount source=prod_youp0m,target=/images -p 8081:8080 nemunaire/youp0m
``` ```
</div> </div>