Déployer un Docker Swarm dans Azure avec Docker for Azure

Docker for Azure fait partie des nouveautés annoncées par Docker lors de la DockerCon 2016 : https://blog.docker.com/2016/06/azure-aws-beta/. Son objet est de simplifier le déploiement d'une infrastructure Docker standard dans Azure tout en profitant des capacités d'Azure comme le load balancer et les VM Scale Sets..

Docker for Azure est encore en beta privée, la première étape consiste à demander l'accès en s'enregistrant sur https://beta.docker.com/. Lors de l'enregistrement, vous devrez entre autres fournir l'identifiant (GUID) de l'abonnement Azure que vous souhaitez utiliser pour Docker for Azure. Un des moyens de récupérer cet identifiant est la commande azure account list si l'on utilise Azure CLI.

Une fois votre demande d'accès à la beta acceptée, vous recevrez un mail de confirmation :

Welcome to the Docker for Azure private beta

Ce mail contient un bouton <Deploy to Azure>, mais, avant de cliquer sur ce bouton et de lancer le déploiement, il est nécessaire de créer un AD Service Principal dans l'Azure AD associé à votre abonnement Azure.

Pour créer ce Service Principal, Docker fournit une image de conteneur Linux contenant Azure CLI et un script dédié pour vous assister dans la création, qui, faite à la main, est pour le moins fastidieuse (j'ai testé pour vous, je vous l'épargne ici). Profitez-en, et sur votre Docker host favori, tapez simplement :

docker run -it docker4x/create-sp-azure nom_du_sp

En remplaçant nom_du_sp par le nom que vous souhaitez donner au service principal.

(Si vous voulez en savoir plus, faites comme moi : extrayez le script create-sp.sh de l'image docker4x/create-sp-azure et consultez la procédure à l'intérieur de ce script.)

A la fin du script, vous devez obtenir deux éléments importants à conserver :

  • l'Application ID du Service Principal
  • le secret associé (mot de passe)

Ces deux éléments sont indispensables par la suite.

Avant de continuer, assurez-vous que vous disposez également d'une clé publique SSH, car il n'est pas question d'utiliser un mot de passe dans ce template. Si vous utilisez bash, il s'agit du fichier ~/.ssh/id_rsa.pub.

Dans le mail de confirmation, cliquez sur le bouton <Deploy to Azure> pour déployer le template dans votre abonnement Azure.

Screenshot 2016-08-19 00.34.59

Il faut ensuite configurer le déploiement avec quelques paramètres simples dont les plus importants sont :

  • MANAGERCOUNT : nombre de managers.
  • WORKERCOUNT : nombre de workers, c'est à dire le nombre initial de VM dans le VM Scale Set créé pour les workers.
  • WORKERVMSIZE et MANAGERVMSIZE : les tailles des VM respectives.
  • ADSERVICEPRINCIPALAPPID : le App Id du service principal créé précédemment.
  • ADSERVICEPRINCIPALAPPSECRET : le mot de passe correspondant.
  • SSHPUBLICKEY : votre clé publique SSH.

Il vous faut également choisir ou créer un groupe de ressources et le lieu associé. La suite est classique : le déploiement s'effectue en quelques minutes et, une fois terminé, vous permet de consulter les résultats (outputs) :

Screenshot 2016-08-19 02.32.09

Deux résultats sont à noter ici :

  • SSH, qui donne le moyen de se connecter en SSH aux managers du swarm.
  • DEFAULTDNSTARGET, qui donne l'adresse IP publique du load balancer exposant les workers.

Le premier permet de connecter au manager en SSH. Pour ce faire, assurez-vous que vous avez la clé privée correspondant à la clé publique SSH fournie lors du déploiement. Si vous utilisez bash, il s'agit du fichier ~/.ssh/id_rsa. Dans Bash, copiez simplement la commande ssh qui vous est donnée :

2016-08-22 (3)

A partir de là vous pouvez explorer le swarm tel que configuré par Docker for Azure. Par exemple :

  • Lister les noeuds : docker node ls
  • Lister les images Docker sur le manager, utilisées par l'infrastructure Docker for Azure : docker images
  • Lister les conteneurs actifs sur le manager : docker ps
  • Lister les services exécutés par le swarm : docker service ls --la liste est vide pour l'instant

Vous pouvez ensuite déployer un service de test et le faire passer à l'échelle, par exemple avec 8 instances :

docker service create --name nginx --publish 80:80 nginxdocker service scale nginx=8docker service ps nginx 2016-08-22 (5)

Avec le service web nginx, on peut consulter le résultat avec un navigateur sur l'adresse IP précédemment notée dans les résultats du déploiement (DEFAULTDNSTARGET).

Dans le portail Azure, on peut également constater que, sur le load balancer des workers, la règle sur le port 80 a été automatiquement créée lors du déploiement du service :

Screenshot 2016-08-19 22.55.53

Pour terminer, supprimer le service :

docker service rm nginx

Et l'on peut constater que la règle du port 80 a été automatiquement supprimée du load balancer.

Voilà pour un premier test avec Docker for Azure