Deploying Docker images to Azure App Services is simple. Learn how to deploy
your Docker images to Azure App Services using Azure Container Registry (ACR)
Photo by Glenn Carstens-Peters on Unsplash |
We've been discussing Docker, containers and microservices for some time on the blog. On previous posts we learned how to create our own ASP.NET Docker images and how to push them to Azure Container Registry. Today we'll learn how to deploy these same Docker images on Azure App Services.
On this post we will:
- Review how to create an Azure App Service and configure it to run Docker Images
- Deploy Docker images from Azure Container Registry into it
- Access our instance, view logs and learn how to monitor it and configure it
- Learn about tools available to manage containers
Requirements
As requirements, please make sure you have:- Docker Desktop (Windows or Mac) or Docker Engine (Linux) installed
- An Azure Account
- An Azure Container Registry created on your Azure account
- Images already pushed to your Azure Container Registry (ACR)
- Build a simple ASP.NET Core image on your local Docker repository
- Create and push a Docker Image to your own Azure Container Registry
About Azure App Services
Azure developers are quite familiar with Azure App Services. But for those who don't know, App services are:HTTP-based services for hosting web applications, REST APIs, and mobile back ends. You can develop in your favorite language, be it .NET, .NET Core, Java, Ruby, Node.js, PHP, or Python. Applications run and scale with ease on both Windows and Linux-based environments.
Why use App Services
And why use Azure App Services? Essentially because App Services:- support multiple languages and frameworks: such as ASP.NET, Java, Ruby, Python and Node.js
- can be easily plugged into your CI/CD pipelines, for example to deploy from Docker Hub or Azure Container Registries
- can be used as serverless services
- runs webjobs allowing us to deploy backend services without any additional costs
- have a very powerful and intuitive admin interface
- are integrated with other Azure services
Creating our App Service
So let's get started and create our App Service. While this shouldn't be new to anyone, I'd like to review the workflow so readers understand the step-by-step. To create your App Service, in Azure, click Create -> App Service:On this screen, make sure you select:
- Publish: Docker Container
- OS: Linux
Select the free plan
Click on Change Plan to choose the free one (by default you're set on a paid one). Click Dev/Test and select F1:Selecting Docker Container/Linux
Review the info and don't forget to select Docker Container/Linux for Publish and Operating System:Specifying Container Information
Next, we specify the container information. On this step we will choose:- Options: Single Container
- Image Source: Azure Container Registry
- Registry: Choose yours
On this step, Azure should auto-populate your repository. However, if you do not have admin user enabled (I didn't), you'll get this error:
Enabling Admin in your Azure Container Registry
To enable admin access to your registry, open it using the portal and on the Identity tab, change from Disable:To Enable and Azure will auto-generate the credentials for you:
Specify your Container
Back to the creation screen, as soon as the admin access is enabled on your registry, Azure should auto-populate the required information with your registry, image and tag (if one exists):
Startup Command allows you to specify additional commands for the image (for
example environment vars, volumes, configurations, etc).
Review and Confirm
Review and confirm. The deployment should take less than 1 second:Accessing our App Service in Azure
As seen above, as soon as confirm, the deployment starts. It shouldn't take more than 1 minute to have it complete.Accessing our Web Application
Let's check if our image is running. From the above image you can see my image's URL highlighted in yellow. Open that on a browser to confirm the site is accessible:Container Features
To finish, let's summarize some features that Azure offers us to easily manage our containers.Container Settings
Azure still offers a Container Settings tab that allows us to inspect, change container settings for our web app.Container Logs
We can inspect logs for our containers to easily troubleshoot them.As an example, here's an excerpt of what I got for my own container log:
2020-04-10 04:32:51.913 INFO - Status: Downloaded newer image for
hildenco.azurecr.io/webapp:v1
2020-04-10 04:32:52.548 INFO - Pull Image successful, Time taken: 0 Minutes and 47 Seconds
2020-04-10 04:32:52.627 INFO - Starting container for site
2020-04-10 04:32:52.627 INFO - docker run -d -p 5021:80 --name hildenco-docker_0_e1384f56 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=hildenco-docker -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=hildenco-docker.azurewebsites.net -e WEBSITE_INSTANCE_ID=[redacted] hildenco.azurecr.io/webapp:v1
2020-04-10 04:32:52.627 INFO - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2020-04-10 04:32:57.601 INFO - Initiating warmup request to container hildenco-docker_0_e1384f56 for site hildenco-docker
2020-04-10 04:33:02.177 INFO - Container hildenco-docker_0_e1384f56 for site hildenco-docker initialized successfully and is ready to serve requests.
2020-04-10 04:32:52.548 INFO - Pull Image successful, Time taken: 0 Minutes and 47 Seconds
2020-04-10 04:32:52.627 INFO - Starting container for site
2020-04-10 04:32:52.627 INFO - docker run -d -p 5021:80 --name hildenco-docker_0_e1384f56 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=hildenco-docker -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=hildenco-docker.azurewebsites.net -e WEBSITE_INSTANCE_ID=[redacted] hildenco.azurecr.io/webapp:v1
2020-04-10 04:32:52.627 INFO - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2020-04-10 04:32:57.601 INFO - Initiating warmup request to container hildenco-docker_0_e1384f56 for site hildenco-docker
2020-04-10 04:33:02.177 INFO - Container hildenco-docker_0_e1384f56 for site hildenco-docker initialized successfully and is ready to serve requests.
Continuous Deployment (CD)
Another excellent feature that you should explore in the future is enabling continuous deployment on your web apps. Enabling continuous deployment is essential to help your team gain agility by releasing faster and often. We'll try to cover this fantastic topic in the future, keep tuned.Conclusion
On this post we reviewed how to create an Azure App Service and learned how to deploy our own Docker Images from our very own Azure Container Registry (ACR) to it. By using ACR greatly simplified the integration between our own Docker Images and our App Services. From here I'd urge you to explore continuous integration to automatically push your images to your App Services as code lands in your git repository.References
See Also
- Microservices in ASP.NET
- My journey to 1 million articles read
- Continuous Integration with Azure App Services and Docker Containers
- Building and Hosting Docker images on GitHub with GitHub Actions
- Hosting Docker images on GitHub
- Adding Application Insights to your ASP.NET Core website
- Configuration in .NET Core console applications
- Send emails from ASP.NET Core websites using SendGrid and Azure
- Async Request/Response with MassTransit, RabbitMQ, Docker and .NET core
- How to build and run ASP.NET Core apps on Linux
- How to create a Ubuntu Desktop on Azure
- How to Enable ASP.NET error pages using Azure Serial Console