Nous allons voir ensemble comment gérer plusieurs noeuds Docker au travers d'une seule CLI Docker. Et ceci grâce à l'utilisation des context.

Nous pouvons au sein d'une seule CLI paramétrer plusieurs contextes afin de manager des environnements différents. Je vais au cours de cet article, vous montrer comment gérer depuis votre poste, plusieurs noeuds Docker. Mais tout d'abord, un context c'est quoi ?

Context

Tout simplement, un context contient toutes les informations de point de terminaison et de sécurité requises pour gérer un cluster ou un nœud. C'est à dire, les informations nécessaires afin de se connecter à un daemon Docker.

La commande docker context facilite la configuration de ces contextes et leur basculement.

Pour en apprendre plus à ce sujet, nous allons mettre en place un exemple :

Depuis mon ordinateur professionnel, je vais me connecter à deux nodes Docker distincts. Mon poste de travail, qui va centraliser la CLI, et un second environnement, de développement. Nous verrons alors comment configurer ces contextes, et basculer entre ces deux environnements afin d'exécuter quelques commandes basiques.

Pré-requis

Afin de réaliser ce tutoriel, il sera nécessaire d'avoir à disposition au moins deux environnements Docker. Dans mon cas, je vais prendre deux environnements comme suit :

  • 1 VPS,
  • Mon poste de travail.

Il existe au moins deux solutions pour se connecter à un daemon Docker distant :

  • La connexion TCP,
  • Par le biais de SSH.

La solution de la connexion TCP est possible mais je ne la conseille pas. Il n'est pas indispensable de sécuriser cette connexion afin de faire fonctionner la connexion, mais dans un environnement de production il serait forcément bienvenu de mettre en place du TLS et de faire écouter le daemon Docker sur une interface privée.

Je vais utiliser la connexion SSH qui est bien plus simple à mettre en oeuvre !

Il est bien sûr nécessaire d'avoir des clés SSH présentes sur vos machines afin de s'authentifier sans mot de passe :

How to use ssh-keygen to generate a new SSH key
Ssh-keygen is a tool for creating new authentication key pairs for SSH. This is a tutorial on its use, and covers several special use cases.

Il est également indispensable que le compte utilisé ait accès à Docker :

sudo usermod -aG docker $USER

Exemple d'utilisation

  1. Mon premier context :

Un context est un ensemble de propriétés. Voici ces éléments :

  • Un nom,
  • La configuration du Endpoint
  • Les informations TLS
  • Orchestrateur

Vérifions sur notre poste principal, les contextes présents :

docker context ls
NAME          DESCRIPTION     DOCKER ENDPOINT                KUBERNETES ENDPOINT      ORCHESTRATOR
default *     Current...      unix:///var/run/docker.sock                             swarm

Votre installation possède un context par défaut, c'est celui de votre installation Docker.

2. Ajouter un context :

Ajoutons maintenant notre premier context à l'aide de la commande docker context create.

Dans l'exemple suivant, je vais créer un context pour mon environnement de développement :

docker context create dev --docker host=ssh://debian@X.X.X.X

Vérifions les contexts présents :

docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
dev                                                           ssh://debian@X.X.X.X                          

J'ai donc un nouveau context qui se connecte à mon daemon Docker, via SSH et avec l'utilisateur debian, à distance.

Utilisons maintenant notre nouveau context !

3. Utilisation des contextes :

Créeons tout simplement un conteneur whoami dans mon environnement de développement.

docker --context dev run -d -P --name iamfoo containous/whoami

Comme vous pouvez le voir, j'utilise l'option `--context` afin d'éxécuter cette commande dans mon environnement de développement. Si on ne précise pas de context, c'est celui par défaut qui est utilisé.

Il est également possible de modifier globalement son context afin de ne pas utiliser l'option de façon systématique :

docker context use dev
dev
Current context is now "dev"

Si vous vérifiez vos contextes :

docker context ls
AME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default             Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
dev *                                                         ssh://debian@X.X.X.X                          

Remarquez que l'asterisque présente dans la sortie vient de passer sur mon environnement de dev. Il s'agit donc maintenant de mon environnement pour l'exécution des commandes.

Une option vient encore nous faciliter la vie ... la possibilité d'exporter et d'importer des contextes.

4. Exporter et importer des contextes :

Cette fonctionnalité est très simple d'utilisation, pour exporter votre context :

docker context export dev
Written file "dev.dockercontext"

Et enfin pour l'importer :

docker context import dev dev.dockercontext
dev
Successfully imported context "dev"

Commandes utiles

Il existe encore quelques commandes afin de gérer vos contextes.

Par exemple pour supprimer un context :

docker context rm dev

Ou pour le mettre à jour :

docker context create dev --docker host=ssh://debian@1.1.1.1

Enfin vous pouvez obtenir plus d'informations sur votre context :

docker context inspect dev
[
    {
        "Name": "dev",
        "Metadata": {},
        "Endpoints": {
            "docker": {
                "Host": "ssh://debian@1.1.1.1",
                "SkipTLSVerify": false
            }
        },
        "TLSMaterial": {},
        "Storage": {
            "MetadataPath": "/home/lfache/.docker/contexts/meta/ef260e9aa3c673af240d17a2660480361a8e081d1ffeca2a5ed0e3219fc18567",
            "TLSPath": "/home/lfache/.docker/contexts/tls/ef260e9aa3c673af240d17a2660480361a8e081d1ffeca2a5ed0e3219fc18567"
        }
    }
]

Dans cet article, nous avons pu voir comment mettre en place et utliser la notion de context présente dans Docker. Cette utilisation peut vous permettre de centraliser votre Docker CLI et ainsi vous faciliter l'utilisation de multiples nodes.

Nous pourrons voir dans un prochain article que cette notion de context peut également servir à d'autres commandes présentes dans l'environnement Docker et ainsi gagner en efficacité sur certaines tâches !

En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter ! C'est toujours un plaisir d'avoir des retours ! 😇