docker-internals: Tuto done
This commit is contained in:
parent
b0817e1011
commit
13a617ffe0
@ -6,7 +6,7 @@ SOURCES = tutorial.md \
|
|||||||
tini.md \
|
tini.md \
|
||||||
oci.md \
|
oci.md \
|
||||||
runc.md \
|
runc.md \
|
||||||
linuxkit.md linuxkit-content.md \
|
linuxkit.md linuxkit-content.md linuxkit-ex-vault.md \
|
||||||
rendu.md
|
rendu.md
|
||||||
|
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ réutiliser plus tard ce chemin, en remplacement du mot clef `new` :
|
|||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```yaml
|
```yaml
|
||||||
- name: xxxx
|
- name: xxxx
|
||||||
image: linuxkit/xxxx:v0.8
|
image: linuxkit/xxxx:v1.0
|
||||||
net: /run/netns/mynewnetns
|
net: /run/netns/mynewnetns
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
@ -263,31 +263,3 @@ une interface `virtual ethernet` :
|
|||||||
peer: veth-db
|
peer: veth-db
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
::::: {.exercice}
|
|
||||||
|
|
||||||
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
|
|
||||||
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
|
|
||||||
données au
|
|
||||||
choix](https://www.vaultproject.io/docs/configuration/storage/index.html)
|
|
||||||
(Consul, Etcd, MySQL, Cassandra, ...).
|
|
||||||
|
|
||||||
Au démarrage, Vault devra déjà être configuré pour parler à sa base de données,
|
|
||||||
qui devra se trouver dans un conteneur isolé et non accessible d'internet. Il
|
|
||||||
faudra donc établir un lien `virtual ethernet` entre les deux conteneurs ; et
|
|
||||||
ne pas oublier de le configurer (automatiquement au *runtime*, grâce à un
|
|
||||||
[`poststart`
|
|
||||||
*hook*](https://github.com/opencontainers/runtime-spec/blob/master/config.md#posix-platform-hooks)
|
|
||||||
ou bien à un conteneur issu du *package*
|
|
||||||
[`ip`](https://github.com/linuxkit/linuxkit/tree/master/pkg/ip)).
|
|
||||||
|
|
||||||
Les permissions étant généralement très strictes, vous aurez sans doute besoin
|
|
||||||
de les assouplir un peu en ajoutant des *capabilities* autorisées à vos
|
|
||||||
conteneurs, sans quoi vos conteneurs risquent d'être tués prématurément.
|
|
||||||
|
|
||||||
En bonus, vous pouvez gérer la [persistance des
|
|
||||||
données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml)
|
|
||||||
stockées dans Vault.
|
|
||||||
|
|
||||||
:::::
|
|
||||||
|
26
tutorial/docker-internals/linuxkit-ex-vault.md
Normal file
26
tutorial/docker-internals/linuxkit-ex-vault.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
|
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
|
||||||
|
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
|
||||||
|
données au
|
||||||
|
choix](https://www.vaultproject.io/docs/configuration/storage/index.html)
|
||||||
|
(Consul, Etcd, MySQL, Cassandra, ...).
|
||||||
|
|
||||||
|
Au démarrage, Vault devra déjà être configuré pour parler à sa base de données,
|
||||||
|
qui devra se trouver dans un conteneur isolé et non accessible d'internet. Il
|
||||||
|
faudra donc établir un lien `virtual ethernet` entre les deux conteneurs ; et
|
||||||
|
ne pas oublier de le configurer (automatiquement au *runtime*, grâce à un
|
||||||
|
[`poststart`
|
||||||
|
*hook*](https://github.com/opencontainers/runtime-spec/blob/master/config.md#posix-platform-hooks)
|
||||||
|
ou bien à un conteneur issu du *package*
|
||||||
|
[`ip`](https://github.com/linuxkit/linuxkit/tree/master/pkg/ip)).
|
||||||
|
|
||||||
|
Les permissions étant généralement très strictes, vous aurez sans doute besoin
|
||||||
|
de les assouplir un peu en ajoutant des *capabilities* autorisées à vos
|
||||||
|
conteneurs, sans quoi vos conteneurs risquent d'être tués prématurément.
|
||||||
|
|
||||||
|
En bonus, vous pouvez gérer la [persistance des
|
||||||
|
données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml)
|
||||||
|
stockées dans Vault.
|
||||||
|
|
||||||
|
:::::
|
@ -83,6 +83,3 @@ Si maintenant `docker` fait appel à un programme externe pour lancer
|
|||||||
effectivement nos conteneurs, c'est que l'on peut changer cette
|
effectivement nos conteneurs, c'est que l'on peut changer cette
|
||||||
implémentation ? la réponse dans l'article :\
|
implémentation ? la réponse dans l'article :\
|
||||||
<https://ops.tips/blog/run-docker-with-forked-runc/>
|
<https://ops.tips/blog/run-docker-with-forked-runc/>
|
||||||
|
|
||||||
Et `containerd` dans l'histoire ?\
|
|
||||||
<https://hackernoon.com/docker-containerd-standalone-runtimes-heres-what-you-should-know-b834ef155426>
|
|
||||||
|
@ -124,10 +124,11 @@ ajouter un élément à cette liste, demandant de *bind* :
|
|||||||
|
|
||||||
::::: {.exercice}
|
::::: {.exercice}
|
||||||
|
|
||||||
À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m.
|
À vous maintenant d'éditer votre `config.json`, pour lancer le service `youp0m`.
|
||||||
|
|
||||||
Dans un premier temps, assurez-vous de pouvoir télécharger et assembler
|
Dans un premier temps, assurez-vous de pouvoir télécharger et assembler
|
||||||
rapidement les couches du conteneur.
|
rapidement les couches du conteneur (elles seront placées dans le dossier
|
||||||
|
`rootfs`).
|
||||||
|
|
||||||
À partir du fichier `config.json` fourni, adaptez la ligne de commande à lancer
|
À partir du fichier `config.json` fourni, adaptez la ligne de commande à lancer
|
||||||
et le dossier courant par défaut (`cwd`). Pensez également à faire un volume
|
et le dossier courant par défaut (`cwd`). Pensez également à faire un volume
|
||||||
|
@ -45,7 +45,7 @@ génère beaucoup de zombies, qui vont finir par rendre la machine instable, car
|
|||||||
le système sera à court de PID à distribuer.
|
le système sera à court de PID à distribuer.
|
||||||
|
|
||||||
On peut citer notamment la JVM, ou encore les conteneurs de construction de
|
On peut citer notamment la JVM, ou encore les conteneurs de construction de
|
||||||
logiciels (Jenkins, Drone, ...). En effet, si l'on peut blâmer les programmeurs
|
logiciels (Jenkins, Drone, ...). En effet, si l'on peut blâmer les programmeurs
|
||||||
qui oublient de `wait(2)` leurs fils directs, il peut arriver régulièrement
|
qui oublient de `wait(2)` leurs fils directs, il peut arriver régulièrement
|
||||||
qu'une erreur de programmation crée des zombies dans les conteneurs de
|
qu'une erreur de programmation crée des zombies dans les conteneurs de
|
||||||
construction. Sans processus pour les arrêter, chaque *build* risque d'ajouter
|
construction. Sans processus pour les arrêter, chaque *build* risque d'ajouter
|
||||||
@ -82,14 +82,14 @@ d'extinction du conteneur (généralement `SIGTERM`), lorsque l'on fait un
|
|||||||
|
|
||||||
::::: {.question}
|
::::: {.question}
|
||||||
|
|
||||||
### Ne pourrait-on pas simplement ajouter un *thread* dans Jenkins/DroneCI/... ? {-}
|
#### Ne pourrait-on pas simplement ajouter un *thread* dans Jenkins/DroneCI/... qui s'occupe de gérer les zombies ? {-}
|
||||||
\
|
\
|
||||||
|
|
||||||
Alors ce n'est pas vraiment une solution idéale... si Jenkins s'exécute en tant
|
Alors ce n'est pas vraiment une solution idéale... si Jenkins s'exécute en tant
|
||||||
que PID 1, il est paraît difficile de différencier les processus qui ont été
|
que PID 1, il paraît difficile de différencier les processus qui ont été
|
||||||
re-parentés à Jenkins (et sur lesquels il faut `wait(2)` directement) et ceux
|
re-parentés à Jenkins (et sur lesquels il faut `wait(2)` directement) et ceux
|
||||||
qui ont été créés par Jenkins et pour lequel le code de retour est attendu par
|
qui ont été créés par Jenkins et pour lequel le code de retour est attendu par
|
||||||
ailleurs.
|
d'autres portions du code.
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ reçoit un `SIGTERM`, celui-ci ne sera tout simplement pas traité et encore
|
|||||||
moins transmis à ses fils, à moins d'avoir programmé un tel comportement en
|
moins transmis à ses fils, à moins d'avoir programmé un tel comportement en
|
||||||
shell.
|
shell.
|
||||||
|
|
||||||
Voici donc une raison supplémentaire de préférer `tini` à `bash` (ou rien du
|
Voici donc une raison supplémentaire de préférer `tini` à `bash` (ou à rien du
|
||||||
tout). D'autant plus qu'à moins d'avoir préparé la fin d'exécution, `bash` ne
|
tout). D'autant plus qu'à moins d'avoir préparé la fin d'exécution, `bash` ne
|
||||||
retournera pas le code d'erreur de la commande que l'on a lancé, mais plutôt 0.
|
retournera pas le code d'erreur de la commande que l'on a lancé, mais plutôt 0.
|
||||||
|
|
||||||
@ -117,3 +117,23 @@ application qui ne `fork(2)` pas n'a pas besoin de processus `init`. De même,
|
|||||||
une image contenant un binaire qui gère correctement ses fils et qui n'a pas de
|
une image contenant un binaire qui gère correctement ses fils et qui n'a pas de
|
||||||
petit enfant n'aura pas besoin de `tini`. Par contre dans les autres cas, il
|
petit enfant n'aura pas besoin de `tini`. Par contre dans les autres cas, il
|
||||||
semble particulièrement indiqué.
|
semble particulièrement indiqué.
|
||||||
|
|
||||||
|
L'utilisation par le paramètre `--init` du `run` n'est pas recommandée et
|
||||||
|
devrait se limiter aux cas où l'image a été construite par quelqu'un qui
|
||||||
|
n'avait pas en tête ces contraintes. Lorsque l'on sait que des zombies ne vont
|
||||||
|
pas être géré par leurs parents, le mainteneur se doit d'ajouter `tini` dans
|
||||||
|
son `Dockerfile`. La méthode recommandée est de l'installer par les paquets de
|
||||||
|
la distribution (`apt-get install tini`, `apk add tini`, ...). Néanmoins, dans
|
||||||
|
le cas d'une distribution qui ne possèderait pas le paquet, il convient
|
||||||
|
d'ajouter ces quelques lignes :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```
|
||||||
|
# Install tini for signal processing and zombie killing
|
||||||
|
ENV TINI_VERSION v0.18.0
|
||||||
|
RUN wget -O /usr/local/bin/tini "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini" && \
|
||||||
|
chmod +x /usr/local/bin/tini && \
|
||||||
|
tini --version
|
||||||
|
ENTRYPOINT ["/usr/local/bin/tini", ...]
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user