diff --git a/slides/1-docker's basis.odp b/slides/1-docker's basis.odp index 2b9a0ef..16d4b21 100644 Binary files a/slides/1-docker's basis.odp and b/slides/1-docker's basis.odp differ diff --git a/subject/owncloud/ex-owncloud.md b/subject/owncloud/ex-owncloud.md index db54f1b..2dd3fef 100644 --- a/subject/owncloud/ex-owncloud.md +++ b/subject/owncloud/ex-owncloud.md @@ -2,30 +2,24 @@ Projet ====== 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 -personnelle de [`nextcloud`](https://hub.docker.com/_/nextcloud/) ou +playbook Ansible pour automatiser le lancement de votre instance personnelle de +[`nextcloud`](https://hub.docker.com/_/nextcloud/) ou 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 -script pour éventuellement relancer un conteneur qui se serait arrêté -(évidemment sans perdre les données). +particulière devra être apportée à la manière dont vous faites persister les +données entre deux lancements, tout en prenant en compte les futures mises à +jour. -À la fin de son exécution, le script affichera un lien utilisable sur l'hôte -pour se rendre sur la page de connexion. Une autre machine de votre réseau -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). +Le service doit être accessible sur votre réseau local, sur un port +configurable. -Votre script devra se limiter aux notions vues durant cette partie du TP -(ie. sans utiliser `docker-compose` ou `docker stack` que l'on verra dans la -seconde partie). Il pourra cependant faire usage des commandes `docker OBJECT -inspect` pour ne pas avoir à faire d'analyse syntaxique sur les retours des -commandes lisibles par les humains. +Votre playbook devrait se limiter au module +[`docker-container`](https://docs.ansible.com/ansible/latest/modules/docker_container_module.html) +(ie. sans utiliser `docker-compose` ou `docker stack` que l'on verra dans un +second temps). -Cette instance devra utiliser une base de données MySQL (lancée par vos soins -dans un autre conteneur) et contenir ses données dans un ou plusieurs volumes -(afin qu'elles persistent à une mise à jour des conteneurs par exemple). +Cette instance devra utiliser une base de données MySQL ou Postgres (lancée par +vos soins dans un autre conteneur) et contenir ses données dans un ou plusieurs +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'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.
```bash -42sh$ ./mycloud-run.sh -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/ +42sh$ ansible-playbook -i hosts my_cloud.yml ```
diff --git a/subject/owncloud/rendu.md b/subject/owncloud/rendu.md index 5ba4bd7..01d2b2a 100644 --- a/subject/owncloud/rendu.md +++ b/subject/owncloud/rendu.md @@ -32,8 +32,8 @@ cela dépendra de votre avancée dans le projet) :
``` login_x-TP1/ -login_x-TP1/mycloud-run.sh -login_x-TP1/... +login_x-TP1/my_cloud.yml +login_x-TP1/roles/... ```
diff --git a/subject/owncloud/subject.md b/subject/owncloud/subject.md index ff59a09..5c65188 100644 --- a/subject/owncloud/subject.md +++ b/subject/owncloud/subject.md @@ -2,5 +2,5 @@ title: Virtualisation légère -- Projet n^o^ 1 author: Pierre-Olivier *nemunaire* Mercier institute: EPITA -date: EPITA -- SRS 2020 +date: EPITA -- SRS 2021 ... diff --git a/tutorial/1/rendu.md b/tutorial/1/rendu.md index 80b7323..da25c27 100644 --- a/tutorial/1/rendu.md +++ b/tutorial/1/rendu.md @@ -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. 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 diff --git a/tutorial/1/tutorial.md b/tutorial/1/tutorial.md index f5ae152..88925c2 100644 --- a/tutorial/1/tutorial.md +++ b/tutorial/1/tutorial.md @@ -3,22 +3,22 @@ title: Virtualisation légère -- TP n^o^ 1 subtitle: Les bases de Docker author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps} institute: EPITA -date: Mercredi 2 octobre 2019 +date: Mardi 15 septembre 2020 abstract: | Durant ce premier TP, nous allons apprendre à utiliser Docker, puis nous apprendrons à déployer un groupe de conteneurs ! \vspace{1em} - Le TP se termine par un petit projet à rendre à - 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. + Le TP se termine par un petit projet à rendre à au + plus tard le **mardi 22 septembre 2020 à 12 h 42**. Consultez la + dernière section de chaque partie pour plus d'information sur les + é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 - électroniques, vous devrez m'envoyer vos rendus signés avec votre - clef PGP. Pensez à - [me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re) - faire signer votre clef et n'hésitez pas à [faire signer la + 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://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/). ... diff --git a/tutorial/docker-advanced/compose.md b/tutorial/docker-advanced/compose.md index 2845aca..5db2989 100644 --- a/tutorial/docker-advanced/compose.md +++ b/tutorial/docker-advanced/compose.md @@ -11,7 +11,7 @@ contiendra les paramètres d'exécution.
```yaml -version: '3' +version: "3.8" services: 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 version de vos conteneurs, mais de la version du format de fichier `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` diff --git a/tutorial/docker-advanced/manual.md b/tutorial/docker-advanced/manual.md index ef25f32..2f6531e 100644 --- a/tutorial/docker-advanced/manual.md +++ b/tutorial/docker-advanced/manual.md @@ -15,7 +15,7 @@ Le premier conteneur qui doit être lancé est la base de données orientée sé temporelles : [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/). 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 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" \ influxdb -host influxdb -Connected to http://influxdb:8086 version 1.6.3 -InfluxDB shell version: 1.6.3 +Connected to http://influxdb:8086 version 1.8.2 +InfluxDB shell version: 1.8.2 > show databases name: databases name @@ -85,7 +85,7 @@ système. Pour cela, on commence par télécharger *Telegraf* :
```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 ```
@@ -95,7 +95,7 @@ Puis, lançons *Telegraf* :
```bash cd /tmp/telegraf -./telegraf --config telegraf.conf +./usr/bin/telegraf --config etc/telegraf/telegraf.conf ```
@@ -110,7 +110,7 @@ Et observons ensuite : ```bash 42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \ influxdb -host influxdb -InfluxDB shell version: 1.6.3 +InfluxDB shell version: 1.8.2 > show databases name: databases name diff --git a/tutorial/docker-advanced/rendu.md b/tutorial/docker-advanced/rendu.md index 80b7323..da25c27 100644 --- a/tutorial/docker-advanced/rendu.md +++ b/tutorial/docker-advanced/rendu.md @@ -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. 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 diff --git a/tutorial/docker-advanced/setup.md b/tutorial/docker-advanced/setup.md index 3390cce..64ace49 100644 --- a/tutorial/docker-advanced/setup.md +++ b/tutorial/docker-advanced/setup.md @@ -33,7 +33,7 @@ tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
```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 chmod +x /usr/bin/docker-compose ``` @@ -54,7 +54,7 @@ Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
``` 42sh$ docker-compose --version -docker-compose version: 1.24.1 +docker-compose version: 1.27.2 ```
diff --git a/tutorial/docker-basis/first.md b/tutorial/docker-basis/first.md index 7ec8472..68104d4 100644 --- a/tutorial/docker-basis/first.md +++ b/tutorial/docker-basis/first.md @@ -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. +### 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` : + +
+```bash +docker container run hello-world +``` +
+ +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` : + +
+```bash +docker container run hello-world /hello +``` +
+ +L'image ne contenant que ce programme, vous ne pourrez pas y lancer de shell : + +
+```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. +``` +
+ +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 : + +
+```bash +42sh$ docker container run alpine +42sh$ echo $? +0 +``` +
+ +
+```bash +42sh$ docker container run --interactive --tty alpine +/ # _ +``` +
+ +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 : + +
+ ``` + 42sh$ cat cmd + echo foo + 42sh$ cat cmd | docker run -i busybox + foo + ``` +
+ + 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` : + +
+```bash +42sh$ docker container run -it alpine +/ # _ +``` +
+ + ### Les paramètres -Vous avez remarqué l'utilisation des options `--tty` et `--interactive` ? Avant -le nom de l'image, elles sont gérées par Docker pour modifier le comportement +Vous avez remarqué le placement des options `--tty` et `--interactive` ? Avant +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 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 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 : - -
- ``` - 42sh$ cat cmd - echo foo - 42sh$ cat cmd | docker run -i busybox - foo - ``` -
- - L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit - transmise au conteneur. - ## Lister les conteneurs 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 :
diff --git a/tutorial/docker-basis/installation.md b/tutorial/docker-basis/installation.md index 6f68497..7b0b8ec 100644 --- a/tutorial/docker-basis/installation.md +++ b/tutorial/docker-basis/installation.md @@ -26,7 +26,7 @@ Assurez-vous également d'avoir un noyau récent, avec la commande `uname -r` :
``` -5.2.14-gentoo +5.8.9-gentoo ```
@@ -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 correspondant à votre distribution : - + **Et Kali Linux alors ?** Kali étant basée sur Debian, référez-vous à la procédure d'installation de cette distribution. @@ -93,47 +93,36 @@ Une sortie similaire au bloc suivant devrait apparaître sur votre écran :
``` Client: - Version: 19.03.2 + Version: 19.03.12 API version: 1.40 - Go version: go1.12.9 - Git commit: 6a30dfc - Built: Mon Sep 16 15:56:27 2019 + Go version: go1.14.6 + Git commit: 48a66213fe + Built: Thu Aug 6 01:27:59 2020 OS/Arch: linux/amd64 Experimental: false Server: Engine: - Version: 19.03.2 + Version: 19.03.12 API version: 1.40 (minimum version 1.12) - Go version: go1.12.9 - Git commit: 6a30dfc - Built: Mon Sep 16 15:55:09 2019 + Go version: go1.14.6 + Git commit: 48a66213fe + Built: Thu Aug 6 01:26:25 2020 OS/Arch: linux/amd64 Experimental: true + containerd: + Version: 1.2.13 + GitCommit: 35bd7a5f69c13e1563af8a93431411cd9ecf5021 + runc: + Version: 1.0.0-rc10 + GitCommit: + docker-init: + Version: 0.18.0 + GitCommit: fec3683b971d9c3ef73f284f176672c44b448662 ```
-### 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 : - - - ### `no such file or directory`? Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or diff --git a/tutorial/docker-basis/linking.md b/tutorial/docker-basis/linking.md index 6fe8db8..0e8e69f 100644 --- a/tutorial/docker-basis/linking.md +++ b/tutorial/docker-basis/linking.md @@ -105,8 +105,8 @@ 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 (et la [documentation de l'image -MySQL](https://hub.docker.com/_/mysql/)) : +obtiendrez en lisant l'aide et la [documentation de l'image +MySQL](https://hub.docker.com/_/mysql/) :
```bash diff --git a/tutorial/docker-basis/volumes.md b/tutorial/docker-basis/volumes.md index 5237edc..b0da174 100644 --- a/tutorial/docker-basis/volumes.md +++ b/tutorial/docker-basis/volumes.md @@ -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 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 : + ## Les volumes @@ -58,7 +63,7 @@ Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
```bash -docker container run --mount source=prod_youp0m,target=/srv/images nemunaire/youp0m +docker container run --mount source=prod_youp0m,target=/images nemunaire/youp0m ```
@@ -85,7 +90,7 @@ exclusivement en RAM\ :
```bash -docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m +docker container run --mount type=tmpfs,target=/images nemunaire/youp0m ```
@@ -105,8 +110,8 @@ même volume :
```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 +docker container run -d --mount source=prod_youp0m,target=/images -p 8080:8080 nemunaire/youp0m +docker container run -d --mount source=prod_youp0m,target=/images -p 8081:8080 nemunaire/youp0m ```