Docker sur Azure Web App avec Container Registry

Si vous souhaitez héberger des containers Docker sur Azure, vous avez le choix entre du IaaS ou utiliser les offres CaaS (Container As a Service) que sont Azure Container Service (Swarm, Mesos, Kubernetes) ou Service Fabric. Bien qu’Azure prend en charge une partie des mises à jour sur les offres CaaS, les deux offres imposent une maintenance régulière de l’infrastructure (mise à jour de système d’exploitation, etc.).
Lors de Connect(), Microsoft a annoncé le support des containers Docker au sein de l’offre App Service Linux et la mise à disposition d’Azure Container Registry (ACR). Les deux produits étant des offres PaaS, c’est jackpot : plus d’infrastructure à gérer 🙂
Dans cet article nous allons découvrir ces technologies. ACR nous permettra de créer notre repository privé d’images Docker, où nous allons y stocker une version de Ghost.io, et l’utiliser pour déployer un blog sur App Service on Linux.
Créer son registry privé
Azure Container Registry est un service PaaS en preview qui permet de créer un registry privé pour gérer nos images Docker. Nous déploierons notre registry et y stockerons une image de Ghost.io.
Portail ? Non, template
Le portail azure est un bon point d’entrée pour créer Container Registry. Mais chez Cellenza, on préfère la réutilisation et l’automatisation donc nous utiliserons un template ARM. On vous a mis ce dernier à disposition sur le github de Microsoft Azure.
Le template crée Container Registry ainsi que le compte de stockage qui lui est nécessaire. Afin de simplifier les opérations suivantes, nous activerons les comptes Administrateurs qui nous permettra de pousser nos images dans notre registry. En utilisant PowerShell, nous créerons un groupe de ressources en West US et y déploierons une nouvelle instance d’ACR en utilisant le template :
$SubscriptionId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" $ResourceGroupName = "blog201612-rg" $ContainerRegistryName = "acrblog201612dcr01" $deploymentName = $resourceGroupName + $(Get-Date).ToString("yyyyMMddHHmm") Login-AzureRmAccount Select-AzureRmSubscription -SubscriptionId $SubscriptionId $rg = New-AzureRmResourceGroup -Name $ResourceGroupName -Location WestUS New-AzureRmResourceGroupDeployment -Name $deploymentName -ResourceGroupName $rg.ResourceGroupName -TemplateUri "https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/101-container-registry/azuredeploy.json" -TemplateParameterObject @{ acrName=$ContainerRegistryName; acrAdminUserEnabled=$true }
L’architecture créée est la suivante :
Docker Push dans notre Registry
Une fois notre instance d’ACR créée, nous allons récupérer, via le portail, les credentials du compte Administrateur. Pour cela nous allons sur la section Access Key :
Nous pouvons désormais nous connecter au registry et y pousser l’image docker de ghost:
docker login acrblog201612dcr01-on.azurecr.io -u "acrblog201612dcr01" -p "XXXXXXXXX" docker pull ghost:latest # Récupère la dernière version de ghost sur le hub.docker.com docker tag ghost:latest acrblog201612dcr01-on.azurecr.io/ghost:latest # Taggue l'image pour la mapper sur notre ACR docker push acrblog201612dcr01-on.azurecr.io/ghost:latest # Push de l'image sur notre ACR
Maintenant
que notre image est sur notre ACR, nous allons le déployer sur un App Service et créer une instance de notre blog.
Déployer le container Docker sur App Service
On va désormais déployer notre image de Ghost sur une Web App sous Linux. Là encore, pas de portail, mais du template. Ce dernier est disponible sur le GitHub de Cellenza.
Le template prend trois paramètres : le nom du registry précédemment créé, le mot de passe que l’on a récupéré, et le nom de l’app service plan qui hébergera notre web app.
New-AzureRmResourceGroupDeployment -Name "DeployGhost" -ResourceGroupName "blog201612-rg" -TemplateUri "<url du template>\ghostdeploy.json" -TemplateParameterObject @ { acrName="acrblog201612dcr01"; acrAdminPassword="XXXX"; hostingPlanName="blog201612plan" }
Après l’exécution de la commande, nous pouvons voir sur le portail notre web app configurée pour récupérer notre image Ghost :
On peut désormais naviguer sur notre site et… tadam 🙂 :
Pour résumer, nous avons créé une instance d’Azure Container Registry où nous y avons déployé une image de Ghost provenant du hub docker. Puis on a instancié une nouvelle web app configurée pour déployer le container ghost en se basant sur notre registry. L’architecture finale de notre exemple est devenue la suivante :
Limitations
Nous avons déployé notre blog sur Azure App Service, mais… attention aux limitations, il est actuellement impossible de faire :
- La connexion à un VNET ;
- De la composition de services : docker compose est à oublier ;
- Des volumes : si je mets à jour mon container, adieu mes articles de blog etc… App Service est à utiliser pour des containers stateless et qui ne stockent aucune donnée sur leur file system ;
- Du déploiement continu : App Service ne poll pas Container Registry et ne verra donc pas les mises à jour de votre image.
Pour rappel, chaque instance d’une web app sur App Service on Windows dispose de leur propre file system et ne peut héberger qu’un seul type d’app (hormis les web jobs). Il est donc peu probable que Microsoft inclus un jour dans App Service on Linux le support des volumes Docker ainsi que la composition de services. Néanmoins l’offre App Service on Linux est encore en preview, il sera intéressant d’en suivre les évolutions et espérons que le déploiement continu de container docker soit une des fonctionnalités à venir.
Conclusion
Azure Container Registry permet de disposer d’un repository privé d’images Docker. Contrairement au hub Docker ou Docker Datacenter, il ne dipose pas d’une IHM web pour visualiser et administrer le contenu de notre register. La preview n’est disponible qu’aux Etats-Unis, mais nous évite d’avoir à déployer un registry sur nos clusters en IaaS ou CaaS.
Le support des containers Docker dans le monde PaaS d’Azure n’en est qu’à ses débuts. Bien qu’App Service on Linux manque de fonctionnalités face à son homologue Windows, cette offre présente l’avantage de pouvoir héberger des apps publics à moindre coût face aux offres IaaS ou CaaS. Enfin, le manque de support des volumes docker font des web app Linux un candidat idéal pour l’hébergement d’applications web stateless.
L’ensemble du code source (scripts powershell & template) est à disposition sur le GitHub de Cellenza ici.