TP1 ready

This commit is contained in:
nemunaire 2019-10-16 03:54:56 +02:00
parent 9281f01857
commit f909d463ca
16 changed files with 265 additions and 122 deletions

View file

@ -1,6 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md secrets.md rendu.md
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md
all: tutorial.pdf

View file

@ -65,9 +65,10 @@ docker container prune
```
</div>
On aura tendance à vouloir supprimer tous les objets inutiles d'un seul coup, via :
## `docker-gc`
Vous pouvez également utiliser l'image
[https://github.com/spotify/docker-gc](`docker-gc`) pour effectuer le ménage de
manière automatique, plus fréquemment. Mais attention à vos données !
<div lang="en-US">
```bash
docker system prune
```
</div>

View file

@ -100,7 +100,7 @@ il s'agit des mêmes options\ :
<div lang="en-US">
```bash
docker container run -d -p 8080:8081 nemunaire/youp0m
docker container run -d -p 8081:8080 nemunaire/youp0m
```
</div>
@ -111,6 +111,41 @@ voit bien que ceux-ci ne partagent pas leur système de fichiers : notre
nouvelle instance est encore immaculée.
## Paramètres de lancement
`youp0m` dispose d'une interface d'administration minimaliste, pour modérer les
images soumises. Celle-ci est accessible par mot de passe (ou est désactivée si
aucun identifiant n'est trouvé). L'aide du programme indique que cela est géré
par l'argument `-htpasswd`, mais encore faut-il pouvoir recopier un fichier
créé à l'extérieur du conteneur...
Outre les arguments que l'on peut passer au premier processus du conteneur, la
plupart des images peuvent adapter leur comportement en fonction de variables
d'environnement que l'on passe en paramètre.
Cette bonne pratique est recommandée par <https://12factor.net/>, qui détaille
les raisons qui devraient pousser les développeurs à privilégier les variables
d'environnements aux arguments sur la ligne de commande.
Il se trouve que les conteneurs `youp0m` peuvent créer le fichier `htpasswd`,
s'ils sont démarrés avec les variables d'environnement :
- `YOUP0M_USERNAME` : nom d'utilisateur pour l'administrateur (par défaut admin) ;
- `YOUP0M_PASSWORD` : mot de passe de l'utilisateur.
Pour ajouter une variable d'environnement, cela se passe dans la commande
`run`, en ajoutant une ou plusieurs options `-e` :
<div lang="en-US">
```bash
docker container run -e YOUP0M_PASSWORD=foobar -p 8080:8080 nemunaire/youp0m
```
</div>
Une fois lancé, ce conteneur exposera une interface d'administration à cette
adresse : <http://localhost:8080/admin/>.
## Arrêt des conteneurs et persistance des données
Lorsque l'on souhaite stopper un conteneur lancé en tâche de fond, on utilise

View file

@ -105,7 +105,7 @@ transféré dans le conteneur.
Pour nous en convaincre, nous pouvons tenter d'exécuter un programme qui n'est
pas présent sur notre machine, mais bien uniquement dans le conteneur. Si vous
n'utilisez pas [Alpine Linux](https://www.alpine-linux.org), vous pourriez
n'utilisez pas [Alpine Linux](https://www.alpinelinux.org), vous pourriez
tenter d'utiliser son gestionnaire de paquet `apk`, via :
<div lang="en-US">

View file

@ -46,11 +46,8 @@ correspondant à votre distribution :
<https://docs.docker.com/install/linux/docker-ce/debian/>
### Et Kali Linux alors ?
Kali étant basée sur Debian, référez-vous à la procédure d'installation de
Debian *Jessie or newer*.
**Et Kali Linux alors ?** Kali étant basée sur Debian, référez-vous à
la procédure d'installation de cette distribution.
## Windows et macOS
@ -62,8 +59,8 @@ pourrez interagir avec lui via votre ligne de commande habituelle.
Téléchargez la version correspondante à votre système d'exploitation :
* [Docker for Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac)
* [Docker for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)
* [Docker for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
* [Docker for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)
Une fois l'installation terminée, lancez l'application : elle ajoutera une
icône dans la zone de notification, vous permettant de contrôler l'exécution de
@ -76,6 +73,10 @@ Si vous rencontrez des difficultés pour vous lancer, le projet
[Play With Docker](https://labs.play-with-docker.com/) vous donne accès à
un bac à sable dans lequel vous pourrez commencer à faire ce TP.
Il vous faudra disposer [d'un compte
Docker](https://hub.docker.com/signup). Une fois identifié, vous pourrez créer
une nouvelle instance, et vous connecter dessus via SSH.
## Vérifier la bonne marche de l'installation

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View file

@ -20,7 +20,7 @@ partie comment lier deux conteneurs.
## Mise en place du webservice
Nous allons utiliser l'interface d'administration des serveurs du FIC :
[`nemunaire/fic-admin`](https://hub.docker.com/r/nemunaire/fic-admin/).
[`nemunaire/fic-admin`](https://hub.docker.com/r/nemunaire/fic-admin).
En lançant le conteneur avec les mêmes options que `youp0m`, les journaux
indiquent que le service cherche à se connecter à une base de données. Il va
@ -98,29 +98,6 @@ mutuellement se découvrir grâce à un système de résolution de nom basé sur
nom de conteneur.
## Entrer dans un conteneur en cours d'exécution
Dans certaines circonstances, les journaux ne sont pas suffisant pour
déboguer correctement l'exécution d'un conteneur.
<div lang="en-US">
```bash
docker container run mysql
```
</div>
...
<div lang="en-US">
```bash
docker container exec -it /bin/bash
ip ...
```
</div>
Notez qu'il n'est pas possible d'`exec` dans un conteneur éteint, et que si la commande initiale du conteneur se termine, tous les `exec` seront également tués.
## Exercice {-}
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
@ -128,31 +105,63 @@ de données.
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
obtiendrez en lisant l'aide :
obtiendrez en lisant l'aide (et la [documentation de l'image
MySQL](https://hub.docker.com/_/mysql/)) :
<div lang="en-US">
```bash
docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help
docker container run --rm -e MYSQL_HOST=mysql_cntr_name nemunaire/fic-admin -help
```
</div>
Notez la définition de la variable d'environnement `MYSQL_HOST`[^12factors],
celle-ci indique le nom du serveur vers lequel le service doit se connecter.
[^12factors]: Lecture intéressante : <https://12factor.net/>
Notez la définition de la variable d'environnement `MYSQL_HOST`, celle-ci
indique le nom du serveur vers lequel le service doit se connecter.
Vous aurez besoin de créer un volume pour stocker la base de données, un réseau
dans lequel vous connecterez la base de données et le conteneur applicatif.
Vous devriez pouvoir déboguer le réseau, au sein d'un conteneur, par exemple en
utilisant :
Une fois le service `fic-admin` lancé, vous pouvez exposer le port 8081, sur
lequel vous devriez voir l'interface d'admin : <http://localhost:8081/>.
Placez les différentes commandes (volumes, réseau, `run`, ...) dans un
script `ficadmin-run.sh`, que vous rendrez à la fin du TP. Vous
devriez pouvoir appeler ce script plusieurs fois, sans que les données
ne soient perdues, entre deux arrêts.
### Exemple d'exécution
<div lang="en-US">
```
42sh$ docker container exec -it ficadmin_cntr_name /bin/bash
(incntnr)# ping mysql_cntr_name
```bash
42sh$ ./ficadmin-run.sh
http://localhost:12345/
42sh$ #docker kill db ficadmin
42sh$ ./ficadmin-run.sh # le script relancera une base de données,
# sans avoir perdu les données
http://localhost:12345/
```
</div>
Une fois le service `fic-admin` lancé, vous pouvez exposer le port 8081, sur
lequel vous devriez voir l'interface d'admin : <http://localhost:8081/>.
### Entrer dans un conteneur en cours d'exécution
Dans certaines circonstances, les journaux ne sont pas suffisant pour déboguer
correctement l'exécution d'un conteneur.
En réalisant l'exercice, vous serez sans doute confronté à des comportements
étranges, que vous ne pourriez comprendre qu'en ayant la main sur le conteneur,
via un shell.
Lorsqu'un conteneur est actif, vous pouvez y lancer un nouveau processus,
notamment un shell par exemple.
<div lang="en-US">
```bash
docker container exec -it ficadmin /bin/bash
(inctnr)$ ping mysql_cntr_name
```
</div>
Notez qu'il n'est pas possible d'`exec` dans un conteneur éteint, et que si la
commande initiale du conteneur se termine, tous les `exec` seront également
tués.

View file

@ -114,16 +114,17 @@ Si vous recevez un rapport avec l'erreur suivante :
gpg: Signature made Tue Jan 01 16:42:23 2014 CET
gpg: using RSA key 842807A84573CC96
gpg: requesting key E2CCD99DD37BD32E from hkp server pool.sks-keyservers.net
gpg: requesting key E2CCD99DD37BD32E from hkp server keys.openpgp.org
gpg: Can't check signature: No public key
```
</div>
C'est que votre clef publique n'est pas dans mon trousseau et que les méthodes
de récupération automatique n'ont pas permis de la trouver. Uploadez votre
clef sur un serveur de clefs (et attendez quelques minutes sa propagation) ou
envoyez un courriel au service avec votre clef publique en pièce-jointe, avant
de retenter votre rendu.
C'est que votre clef publique n'est pas dans mon trousseau et que les
méthodes de récupération automatique n'ont pas permis de la
trouver. Uploadez votre clef sur [un serveur de
clefs](https://keys.openpgp.org/) ou envoyez un courriel au service
avec votre clef publique en pièce-jointe, avant de retenter votre
rendu.
#### Not explicit username

View file

@ -10,14 +10,14 @@ abstract: |
\vspace{1em}
Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
au plus tard le mercredi 16 octobre 2018 à 13 h 42, des questions de
au plus tard le mercredi 16 octobre 2019 à 13 h 42, des questions de
cours sont également à compléter avant cette date sur
Epitaf. Consultez la dernière partie de ce TP pour les modalités.
En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
[me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re)
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/).
...

View file

@ -74,15 +74,6 @@ docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \
Lorsque le volume est vide, si des données sont présentes à l'endroit du point
de montage, celles-ci sont recopiées dans le volume.
Si plus tard, vous souhaitez créer un conteneur chargé de faire des
sauvegardes, vous pourriez le lancer comme ceci :
<div lang="en-US">
```bash
docker container run -it --volume-from mydb busybox /bin/bash
```
</div>
## Volumes temporaires
@ -101,3 +92,29 @@ docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m
En cas de crash de la machine, le contenu sera perdu, mais il reste
possible d'utiliser `--volume-from` afin de partager le volume avec un
autre conteneur.
## Partage de volumes entre conteneurs
Les volumes sont des espaces détachés des conteneurs, particulièrement utiles
pour mettre à jour ou relancer un conteneur, sans perdre les données. Un autre
intérêt, est de pouvoir partager des fichiers entre plusieurs conteneurs.
Il est ainsi parfaitement possible de lancer deux conteneurs qui partagent le
même volume :
<div lang="en-US">
```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=/srv/images -p 8081:8080 nemunaire/youp0m
```
</div>
Dans cet exemple, l'ajout d'une image dans un conteneur, l'ajoutera également
dans le second.
Un exemple plus intéressant serait sur une architecture de micro-services
traitant des fichiers de grande taille : plutôt que de faire passer les
fichiers par un système de message/socket, on peut partager un volume pour
épargner les coûts de transferts inutiles, lorsqu'ils ne changent pas de
machine.

View file

@ -63,8 +63,7 @@ Les registres sont des plates-formes de stockage, publiques ou privées,
contenant des images. Ils permettent de récupérer des images, mais également
d'en envoyer.
Le registre utilisé de base est le [Docker Store](https://store.docker.com/) :
il contient à la fois des images officielles (ubuntu, debian, nginx, ...), des
images créées par des utilisateurs ([Docker Hub](https://hub.docker.com/)),
mais aussi des images de grands éditeurs, payantes, à destination des
entreprises.
Le registre utilisé de base est le [Docker Hub](https://hub.docker.com/) : il
contient à la fois des images officielles (ubuntu, debian, nginx, ...), des
images créées par des utilisateurs, mais aussi des images de grands éditeurs,
payantes, à destination des entreprises.