virli/tutorial/docker-orchestration/machine.md

192 lines
7.5 KiB
Markdown
Raw Normal View History

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">
```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-09-13 21:19:59 +00:00
Nous avons déjà évoqué le fait que le daemon pouvait ne pas se trouver sur la
2022-02-24 19:43:43 +00:00
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">
```
2022-02-24 19:43:43 +00:00
42sh$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
42sh$ eval $(docker-machine env echinoidea)
2022-02-24 19:43:43 +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">
```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">
```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
* 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">
```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">
```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.