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

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.
### 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
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 :
<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
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 :
<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">
```
5.2.14-gentoo
5.8.9-gentoo
```
</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
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 à
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">
```
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
```
</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`?
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
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/) :
<div lang="en-US">
```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
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
@ -58,7 +63,7 @@ Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
<div lang="en-US">
```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>
@ -85,7 +90,7 @@ exclusivement en RAM\ :
<div lang="en-US">
```bash
docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m
docker container run --mount type=tmpfs,target=/images nemunaire/youp0m
```
</div>
@ -105,8 +110,8 @@ 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
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
```
</div>