TP1 ready
This commit is contained in:
parent
9281f01857
commit
f909d463ca
16 changed files with 265 additions and 122 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
BIN
tutorial/docker-basis/layers.png
Normal file
BIN
tutorial/docker-basis/layers.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 73 KiB |
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/).
|
||||
...
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue