Resources attached to the Road To DevOps tutorial
https://blog.noobtoroot.xyz/road-to-devops/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
7.4 KiB
314 lines
7.4 KiB
2 years ago
|
# TP secrets
|
||
|
|
||
|
## Chapitre 1
|
||
|
|
||
|
Objectif : Comprendre le fonctionnement des _secrets_ dans Swarm.
|
||
|
|
||
|
|
||
|
## Comprendre le fonctionnement des secrets
|
||
|
|
||
|
* Créer un secret nommé `pass1` à partir de `STDIN`.
|
||
|
|
||
|
* Créer un secret nommé `pass2` à partir d'un fichier.
|
||
|
|
||
|
* Vérifier que les secrets sont bien présents.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
|
||
|
Créer un secret nommé `pass1` à partir de `STDIN` :
|
||
|
```none
|
||
|
$ echo "mon-super-mot-de-passe" | docker secret create pass1 -
|
||
|
s4kfgdeanybxhl6xj7nrrrsyl
|
||
|
```
|
||
|
|
||
|
Créer un secret nommé `pass2` à partir d'un fichier :
|
||
|
```none
|
||
|
$ echo "mon-autre-mot-de-passe" > file
|
||
|
$ docker secret create pass2 file
|
||
|
cbi6igm8jdwrd9fa1gbb9dfrm
|
||
|
rm file
|
||
|
```
|
||
|
|
||
|
Vérifier que les secrets sont bien présents :
|
||
|
```none
|
||
|
$ docker secret ls
|
||
|
ID NAME CREATED UPDATED
|
||
|
s4kfgdeanybxhl6xj7nrrrsyl pass1 About a minute ago About...
|
||
|
cbi6igm8jdwrd9fa1gbb9dfrm pass2 16 seconds ago 16 se...
|
||
|
```
|
||
|
|
||
|
|
||
|
* Créer un service :
|
||
|
|
||
|
- nommé `s1`,
|
||
|
|
||
|
- basé sur l'image `debian:bullseye`,
|
||
|
|
||
|
- qui lance la commande `/bin/sleep 3600` dans le conteneur,
|
||
|
|
||
|
- qui passe les secrets `pass1` et `pass2` au conteneur.
|
||
|
|
||
|
* Se connecter dans le conteneur et vérifier que les secrets sont bien présents.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" -->
|
||
|
Lancer le service `s1` :
|
||
|
```none
|
||
|
$ docker service create \
|
||
|
--detach \
|
||
|
--name s1 \
|
||
|
--secret pass1 \
|
||
|
--secret pass2 \
|
||
|
debian:bullseye /bin/sleep 3600
|
||
|
gkyg5c33qc4x6nf6j11h59r44
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
|
||
|
Récupérer l'identifiant du conteneur :
|
||
|
```none
|
||
|
$ docker ps
|
||
|
CONTAINER ID IMAGE COMMAND ... NAMES
|
||
|
81ec752f3027 debian:latest "/bin/sleep 3600" ... s1.1.fdot5o8wk03r18y7b5tbjbrj1
|
||
|
```
|
||
|
|
||
|
Se connecter dans le conteneur :
|
||
|
```none
|
||
|
$ docker exec -ti s1.1.fdot5o8wk03r18y7b5tbjbrj1 /bin/bash
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
|
||
|
|
||
|
Vérifier la présence des secrets
|
||
|
à l'intérieur du conteneur :
|
||
|
```none
|
||
|
root@81ec752f3027:/# ls -l /run/secrets/
|
||
|
-r--r--r-- 1 root root 23 Feb 6 09:07 pass1
|
||
|
-r--r--r-- 1 root root 23 Feb 6 09:07 pass2
|
||
|
```
|
||
|
|
||
|
Afficher le contenu des secrets :
|
||
|
```none
|
||
|
root@81ec752f3027:/# cat /run/secrets/pass1
|
||
|
mon-super-mot-de-passe
|
||
|
```
|
||
|
|
||
|
```none
|
||
|
root@81ec752f3027:/# cat /run/secrets/pass2
|
||
|
mon-autre-mot-de-passe
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
# TP secrets
|
||
|
|
||
|
## Chapitre II
|
||
|
|
||
|
Objectif : Utiliser les _secrets_ pour envoyer les mots de passe à nos services `web` et `db`.
|
||
|
|
||
|
TP à réaliser après le TP Swarm : nécessite `docker stack deploy`.
|
||
|
|
||
|
|
||
|
* Créer un secret nommé `mysql-secret` qui contiendra le mot de passe de la base de données.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
|
||
|
Créer le secret
|
||
|
```none
|
||
|
$ echo 'docker' | docker secret create mysql-secret -
|
||
|
ippk0jji4fk6lzkl7aldygn58
|
||
|
```
|
||
|
|
||
|
```none
|
||
|
$ docker secret ls
|
||
|
ID NAME ...
|
||
|
rcbrlh7dudey8qomnik3xrv7j mysql-secret ...
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
* Modifier le fichier `start.sh` comme suit :
|
||
|
|
||
|
```
|
||
|
#!/bin/bash
|
||
|
|
||
|
if [ -f /run/secrets/mysql-secret ] ; then
|
||
|
export MYSQL_PASSWORD="$(tail -n 1 /run/secrets/mysql-secret)"
|
||
|
fi
|
||
|
|
||
|
rm -f /run/apache2/apache2.pid
|
||
|
echo "PassEnv MYSQL_USER MYSQL_PASSWORD MYSQL_DATABASE \
|
||
|
MYSQL_HOST" > /etc/apache2/conf-available/env.conf
|
||
|
a2enconf env
|
||
|
exec /usr/sbin/apache2ctl -D FOREGROUND
|
||
|
```
|
||
|
|
||
|
On récupère le secret dans le conteneur et on le passe à l'application via une variable d'environnement.
|
||
|
|
||
|
|
||
|
* Reconstruire l'image `web` (avec le tag `secret`) en prenant en compte le nouveau fichier `start.sh`.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
|
||
|
Rappel : `formation/web/Dockerfile`
|
||
|
```docker
|
||
|
FROM debian:bullseye
|
||
|
|
||
|
LABEL maintainer "me@sii.fr"
|
||
|
|
||
|
# Debian en mode non interactif
|
||
|
ENV DEBIAN_FRONTEND noninteractive
|
||
|
|
||
|
# On installe Apache et le client Mysql
|
||
|
# et on nettoie le cache apt pour diminuer la taille de l'image
|
||
|
RUN apt update \
|
||
|
&& apt install -y apache2 mysql-client \
|
||
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
||
|
# On copie nos scripts
|
||
|
COPY index.sh /usr/lib/cgi-bin/index.sh
|
||
|
COPY docker.sql /tmp/docker.sql
|
||
|
COPY start.sh /start.sh
|
||
|
|
||
|
# On rend les scripts exécutables
|
||
|
RUN chmod +x /start.sh
|
||
|
RUN chmod +x /usr/lib/cgi-bin/index.sh
|
||
|
|
||
|
# On active le module Apache CGI
|
||
|
RUN a2enmod cgi
|
||
|
|
||
|
# On expose le port 80
|
||
|
EXPOSE 80
|
||
|
|
||
|
# On indique le script qui doit être lancé au démarrage du conteneur
|
||
|
ENTRYPOINT ["/start.sh"]
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" -->
|
||
|
```none
|
||
|
$ docker build --tag web:secret .
|
||
|
```
|
||
|
|
||
|
```none
|
||
|
$ docker image ls | grep web
|
||
|
web secret 01722677133b 2 minutes ago 289MB
|
||
|
web 1 74a456d5a9f2 3 hours ago 289MB
|
||
|
```
|
||
|
|
||
|
|
||
|
* Nous allons créer un Registry privé pour stocker notre nouvelle image.
|
||
|
|
||
|
* Créer un service registry basé sur l'image officielle `registry:2` et le publier sur le port 5000.
|
||
|
|
||
|
* Tester la disponibilité du registry.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="medium-code" -->
|
||
|
Créer un service registry
|
||
|
```none
|
||
|
$ docker service create \
|
||
|
--name registry \
|
||
|
--publish 5000:5000 \
|
||
|
registry:2
|
||
|
```
|
||
|
|
||
|
Tester la disponibilité du registry
|
||
|
```none
|
||
|
$ curl 127.0.0.1:5000/v2/_catalog
|
||
|
{"repositories":[]}
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
* Pousser l'image `web:secret` sur le registry en utilisant les tags pour préciser l'adresse du registry, ici `127.0.0.1:5000`.
|
||
|
|
||
|
* Récupérer l'image `web:secret` sur tous les noeuds.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" -->
|
||
|
Tagguer l'image
|
||
|
```none
|
||
|
$ docker tag web:secret 127.0.0.1:5000/web:secret
|
||
|
```
|
||
|
|
||
|
Pousser l'image sur le Registry
|
||
|
```none
|
||
|
$ docker push 127.0.0.1:5000/web:secret
|
||
|
```
|
||
|
|
||
|
Vérifier le contenu du Registry
|
||
|
```none
|
||
|
$ curl 127.0.0.1:5000/v2/_catalog
|
||
|
{"repositories":["web"]}
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" -->
|
||
|
Récupérer l'image sur le second Node
|
||
|
```none
|
||
|
$ docker pull 127.0.0.1:5000/web:secret
|
||
|
```
|
||
|
|
||
|
|
||
|
* Adapter le fichier docker-compose précédent pour utiliser le secret `mysql-secret` dans les services `web` et `db`.
|
||
|
|
||
|
* Lancer la stack applicative et vérifier que l'application fonctionne correctement.
|
||
|
|
||
|
[https://docs.docker.com/compose/compose-file/](https://docs.docker.com/compose/compose-file/)
|
||
|
[https://docs.docker.com/engine/swarm/secrets/#use-secrets-in-compose](https://docs.docker.com/engine/swarm/secrets/#use-secrets-in-compose)
|
||
|
[https://hub.docker.com/_/mariadb/](https://hub.docker.com/_/mariadb/)
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
|
||
|
`formation/docker-compose-secrets.yml`
|
||
|
```yaml
|
||
|
# Les secrets ne sont pris en charge qu'à partir de la version 3.1
|
||
|
# du format Compose file.
|
||
|
#
|
||
|
# Ce fichier compose ne fonctionne qu'avec la commande 'docker stack deploy',
|
||
|
# il ne marchera pas avec un 'docker-compose up -d'
|
||
|
#
|
||
|
# Seules les versions récentes de l'image mariadb savent gérer les secrets,
|
||
|
# la version 10.7.1 est OK.
|
||
|
|
||
|
version: "3.1"
|
||
|
services:
|
||
|
web:
|
||
|
image: 127.0.0.1:5000/web:secret
|
||
|
depends_on:
|
||
|
- db
|
||
|
ports:
|
||
|
- 8080:80
|
||
|
environment:
|
||
|
- MYSQL_HOST=db
|
||
|
- MYSQL_DATABASE=docker
|
||
|
- MYSQL_USER=docker
|
||
|
secrets:
|
||
|
- mysql-secret
|
||
|
db:
|
||
|
image: mariadb:10.7.1
|
||
|
environment:
|
||
|
- MYSQL_DATABASE=docker
|
||
|
- MYSQL_USER=docker
|
||
|
- MYSQL_PASSWORD_FILE=/run/secrets/mysql-secret
|
||
|
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-secret
|
||
|
secrets:
|
||
|
- mysql-secret
|
||
|
volumes:
|
||
|
- mariadb-data:/var/lib/mysql
|
||
|
secrets:
|
||
|
mysql-secret:
|
||
|
external: true
|
||
|
volumes:
|
||
|
mariadb-data:
|
||
|
```
|
||
|
|
||
|
|
||
|
<!-- .slide: data-background="#2E2E2E" data-state="small-code" -->
|
||
|
Lancer la stack applicative
|
||
|
```none
|
||
|
$ docker stack deploy -c docker-compose-secrets.yml secrets
|
||
|
```
|