2017-10-17 06:16:25 +00:00
|
|
|
|
\newpage
|
|
|
|
|
|
|
|
|
|
Création du cluster
|
2022-02-24 19:43:43 +00:00
|
|
|
|
-------------------
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Pour travailler sur un cluster, il faut avoir plusieurs machines ... au moins
|
|
|
|
|
plus d'une !
|
2017-10-17 23:59:55 +00:00
|
|
|
|
|
|
|
|
|
Mais qui dit plusieurs machines, dit généralement de nombreuses installations à
|
|
|
|
|
faire, de nombreuses configurations à partager, etc. Tout ce qu'un
|
2022-02-24 19:43:43 +00:00
|
|
|
|
administrateur système redoute : du travail !
|
2017-10-17 23:59:55 +00:00
|
|
|
|
|
|
|
|
|
Évidemment, de nombreuses solutions existent pour travailler moins, tout en
|
2022-02-24 19:43:43 +00:00
|
|
|
|
déployant plus et de manière plus fiable ! On peut parler
|
2017-10-17 23:59:55 +00:00
|
|
|
|
d'[`ansible`](https://www.ansible.com/), de
|
|
|
|
|
[`chef`](https://docs.chef.io/provisioning.html), ou encore de
|
2022-02-24 19:43:43 +00:00
|
|
|
|
[`puppet`](https://puppet.com/products/capabilities/automated-provisioning), ...
|
|
|
|
|
Toutes ces solutions permettent d'obtenir des configurations finement
|
2017-10-17 23:59:55 +00:00
|
|
|
|
personnalisées, mais nécessitent une phase d'apprentissage plutôt lourde.
|
|
|
|
|
|
|
|
|
|
Comme nous voulons lancer des conteneurs, les machines à provisionner n'ont pas
|
|
|
|
|
besoin de configuration bien particulière et les seuls paquets importants sont
|
|
|
|
|
une version récente de `docker` et ses dépendances.
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
### Provisionner des machines ...
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
La solution magique consiste à passer par `docker-machine` pour créer des
|
|
|
|
|
machines virtuelles automatiquement provisionnées avec Docker.
|
|
|
|
|
|
|
|
|
|
Rien de plus simple, mais cela nécessite d'être dans un environnement dans
|
|
|
|
|
lequel vous maîtrisez le shell et dans lequel vous pouvez créer des machines
|
|
|
|
|
virtuelles. Si votre machine Linux est en fait une machine virtuelle hébergée
|
|
|
|
|
par VirtualBox sous Windows, vous allez sans doute préférer la deuxième
|
|
|
|
|
solution, que d'utiliser PowerShell et Docker4Windows[^amazon].
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
[^amazon]: Vous pouvez aussi vous inscrire sur [Amazon Web
|
|
|
|
|
Services](https://aws.amazon.com/) <https://aws.amazon.com/>,
|
|
|
|
|
`docker-machine` est capable, à partir de vos clefs d'API, de créer et
|
|
|
|
|
lancer des machines dans le cloud ! Et ce n'est pas le seul service de
|
|
|
|
|
cloud supporté !
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
##### Créer une machine {-}
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
Pour créer une nouvelle machine, nous allons utiliser la commande
|
|
|
|
|
`docker-machine create`, en prenant soin de préciser le pilote à utiliser, les
|
|
|
|
|
éventuelles options que prend ce pilote, ainsi que le nom que vous souhaitez
|
|
|
|
|
donner à cette machine (les machines ne sont pas considérées comme jetables,
|
2022-02-24 19:43:43 +00:00
|
|
|
|
leur nom vous permettra par exemple de relancer une machine plus tard) :
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
docker-machine create --driver virtualbox echinoidea
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
Consultez la section suivante, réservée aux gens qui ne peuvent pas passer par
|
2022-02-24 19:43:43 +00:00
|
|
|
|
`docker-machine`, si vous souhaitez avoir plus d'information sur ce que fait
|
2017-10-17 06:16:25 +00:00
|
|
|
|
cette commande.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
##### Commandes usuelles de `docker-machine` {-}
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
De la même manière que `docker`, vous pouvez lister les machines connues
|
2022-02-24 19:43:43 +00:00
|
|
|
|
(`ls`), changer leur état d'exécution (`start`/`stop`/`kill`/`restart`) ou
|
|
|
|
|
encore supprimer une machine (`rm`).
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Si vous avez besoin d'obtenir un shell : `docker-machine ssh $NAME` et
|
2017-10-17 06:16:25 +00:00
|
|
|
|
évidemment la commande `scp` s'utilise de la même manière, pour transférer des
|
|
|
|
|
fichiers.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
##### Utilisation avec Docker {-}
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Nous avons déjà évoqué le fait que le deamon pouvait ne pas se trouver sur la
|
|
|
|
|
même machine que le client `docker`. Eh bien avec `docker-machine` cela prend
|
|
|
|
|
tout son sens, car vous pouvez très facilement changer de daemon/machine avec
|
|
|
|
|
une simple commande :
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```
|
2022-02-24 19:43:43 +00:00
|
|
|
|
42sh$ docker container ls -a
|
|
|
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS
|
|
|
|
|
|
2018-11-16 01:38:41 +00:00
|
|
|
|
42sh$ eval $(docker-machine env echinoidea)
|
2022-02-24 19:43:43 +00:00
|
|
|
|
|
2018-11-16 01:38:41 +00:00
|
|
|
|
42sh$ docker container ls -a
|
2022-02-24 19:43:43 +00:00
|
|
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS
|
|
|
|
|
a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes
|
|
|
|
|
0caddeed5037 armbuild/alpine "/bin/sh" 2 weeks ago Created
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
On remarque que le client Docker est influencé par l'exécution de notre
|
|
|
|
|
commande `docker-machine env`. En effet, cette commande va modifier
|
|
|
|
|
l'environnement (d'où le besoin d'`eval` le retour de la commande) pour faire
|
|
|
|
|
correspondre `DOCKER_HOST` avec le chemin où le daemon peut être contacté.
|
|
|
|
|
|
|
|
|
|
Pour reprendre le contrôle de votre environnement local, vous pouvez, soit
|
|
|
|
|
supprimer manuellement les variables qui ont été ajoutées par l'évaluation,
|
|
|
|
|
soit lancer `eval $(docker machine env -u)`.
|
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
#### Derrière Docker Machine...
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
Si votre environnement ne vous permet pas d'utiliser `docker-machine`, vous
|
2022-02-24 19:43:43 +00:00
|
|
|
|
pouvez vous contenter de démarrer une ou deux autres machines virtuelles sur le
|
|
|
|
|
même réseau que votre machine virtuelle.
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
Rassurez-vous, vous n'allez pas avoir besoin de refaire toute la phase
|
2022-02-24 19:43:43 +00:00
|
|
|
|
d'installation. Des contributeurs ont conçu une petite image de CD ne contenant
|
|
|
|
|
que le strict nécessaire pour utiliser Docker. C'est d'ailleurs cette ISO qui
|
|
|
|
|
est utilisée par `docker-machine` pour démarrer et configurer en un rien de
|
|
|
|
|
temps ses machines virtuelles.
|
|
|
|
|
|
|
|
|
|
1. Dans un premier temps, commençons par télécharger la dernière ISO de
|
|
|
|
|
`boot2docker.iso` :\
|
|
|
|
|
<https://github.com/boot2docker/boot2docker/releases/latest>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
1. Ensuite, dans notre hyperviseur, créons deux nouvelles machines, avec
|
|
|
|
|
suffisamment de ressources pour pouvoir lancer des conteneurs. Ce n'est pas
|
2022-02-24 19:43:43 +00:00
|
|
|
|
parce que l'image que l'on va démarrer est petite que l'on ne va pas
|
2017-10-17 06:16:25 +00:00
|
|
|
|
pouvoir allouer beaucoup d'espace disque ou de RAM.
|
|
|
|
|
1. Lançons ensuite nos deux images, configurées pour démarrer sur l'image ISO
|
|
|
|
|
que l'on a téléchargée précédemment.
|
|
|
|
|
1. Faisons un `ip a` pour connaître l'IP de la machine, nous devrions pouvoir
|
2022-02-24 19:43:43 +00:00
|
|
|
|
nous y connecter en SSH avec l'utilisateur `docker` dont le mot de passe est
|
2017-10-17 06:16:25 +00:00
|
|
|
|
`tcuser`.
|
|
|
|
|
|
|
|
|
|
Vous constaterez que le daemon `dockerd` est déjà lancé. `docker` est déjà
|
2022-02-24 19:43:43 +00:00
|
|
|
|
pleinement utilisable dans cette machine !
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### (Optionnel) Déporter le client Docker
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Dans la suite, nous n'allons taper que quelques commandes dans nos
|
2017-10-17 06:16:25 +00:00
|
|
|
|
machines virtuelles, il n'est donc pas primordial d'avoir configuré son
|
|
|
|
|
environnement pour utiliser localement les daemons Docker des machines
|
|
|
|
|
virtuelles. Néanmoins, cela ne coûte rien de voir les procédures mise en œuvre.
|
|
|
|
|
|
|
|
|
|
Commençons par voir sur quel port le daemon `dockerd` de notre machine
|
2022-02-24 19:43:43 +00:00
|
|
|
|
virtuelle écoute :
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
(virt1) 42sh$ netstat -tpln | grep dockerd
|
|
|
|
|
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
|
|
|
|
|
tcp 0 0 :::2376 :::* 980/dockerd
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Essayons de renseigner simplement cette configuration à notre client Docker :
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
(main) 42sh$ docker -H tcp://$VM1_IP:2376/ info
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Get http://$VM1_IP:2376/v1.32/info: net/http: transport connection broken
|
2018-11-16 01:38:41 +00:00
|
|
|
|
* Are you trying to connect to a TLS-enabled daemon without TLS?
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
En effet, Docker met tout en œuvre pour rendre compliquée l'utilisation
|
2017-10-17 06:16:25 +00:00
|
|
|
|
non-sécurisée de la plate-forme. Mais ils font également en sorte que la
|
|
|
|
|
sécurité soit la plus transparente et la moins contraignante possible pour
|
|
|
|
|
l'utilisateur, sans pour autant être faible.
|
|
|
|
|
|
|
|
|
|
Afin de contacter un daemon Docker distant, il est nécessaire présenter un
|
2022-02-24 19:43:43 +00:00
|
|
|
|
certificat client TLS approuvé par ce daemon. Il est seulement nécessaire de
|
2017-10-17 06:16:25 +00:00
|
|
|
|
vérifier le certificat présenté par le daemon, comme dans le cadre d'une
|
2022-02-24 19:43:43 +00:00
|
|
|
|
connexion SSH classique.
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
|
|
|
|
Tout le nécessaire est déjà configuré au sein de `boot2docker`, pour nos tests,
|
|
|
|
|
nous n'avons qu'à recopier la clef et les certificats en place.
|
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
(main) 42sh$ mkdir remote/virt1
|
|
|
|
|
(main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1
|
|
|
|
|
ca.pem
|
|
|
|
|
cert.pem
|
|
|
|
|
key.pem
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Tentons maintenant de nous connecter au daemon distant utilisant ces éléments :
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2022-02-24 19:43:43 +00:00
|
|
|
|
DOCKER_CERT_PATH=remote/vir1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info
|
2017-10-17 06:16:25 +00:00
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
|
</div>
|
2017-10-17 06:16:25 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Nous pouvons effectuer la même opération pour la seconde machine virtuelle.
|