Note - Please read the previous post before continuing with this one, I discuss the basics of Docker and show how to deploy a simple application.
Problem
How to containerize multiple ASP.NET Core applications and deploy to Azure.
Scenario
Below is a screenshot of an example solution with two applications, Web, and API. You could download the source code from GitHub.
API - has a controller with CRUD operations for a movies database. It uses a class library Data, which contains repositories. The database is hosted in Azure and connection string stored in application settings (appsettings.json).
Web - has Razor Pages for CRUD operations and calls the API using HttpClient.
Solution
Create a Dockerfile for API project (Dockerfile_api),
- # Build Stage
- FROM microsoft/aspnetcore-build AS build-env
- WORKDIR /src
-
- # Copy only .csproj and restore
- COPY ./Fiver.Asp.Docker.Data/Fiver.Asp.Docker.Data.csproj ./Fiver.Asp.Docker.Data/
- RUN dotnet restore ./Fiver.Asp.Docker.Data/
-
- COPY ./Fiver.Asp.Docker.Api/Fiver.Asp.Docker.Api.csproj ./Fiver.Asp.Docker.Api/
- RUN dotnet restore ./Fiver.Asp.Docker.Api/
-
- # Copy everything else and build
- COPY ./Fiver.Asp.Docker.Data/ ./Fiver.Asp.Docker.Data/
- RUN dotnet build ./Fiver.Asp.Docker.Data/
-
- COPY ./Fiver.Asp.Docker.Api/ ./Fiver.Asp.Docker.Api/
- RUN dotnet build ./Fiver.Asp.Docker.Api/
-
- # publish
- RUN dotnet publish ./Fiver.Asp.Docker.Api/ -o /publish --configuration Release
-
- # Publish Stage
- FROM microsoft/aspnetcore
- ENV MOVIES_DB_CONN=
- WORKDIR /app
- COPY --from=build-env /publish .
- ENTRYPOINT ["dotnet", "Fiver.Asp.Docker.Api.dll"]
Note
In order to optimise the process of building images (using cache in Docker), I am copying .csprojfirst to restore packages and then, rest of the files. Also, note that API project uses the class library so we’ll need to copy this too.
Create a Dockerfile for Web project (Dockerfile_web),
- # Build Stage
- FROM microsoft/aspnetcore-build AS build-env
- WORKDIR /src
-
- # Copy only .csproj and restore
- COPY ./Fiver.Asp.Docker.Web/Fiver.Asp.Docker.Web.csproj ./Fiver.Asp.Docker.Web/
- RUN dotnet restore ./Fiver.Asp.Docker.Web/
-
- # Copy everything else and build
- COPY ./Fiver.Asp.Docker.Web/ ./Fiver.Asp.Docker.Web/
- RUN dotnet build ./Fiver.Asp.Docker.Web/
-
- # publish
- RUN dotnet publish ./Fiver.Asp.Docker.Web/ -o /publish --configuration Release
-
- # Publish Stage
- FROM microsoft/aspnetcore
- ENV API_URL=
- WORKDIR /app
- COPY --from=build-env /publish .
- ENTRYPOINT ["dotnet", "Fiver.Asp.Docker.Web.dll"]
Create a docker-compose.yml file.
- version: '3.3'
-
- services:
- api:
- build:
- context: .
- dockerfile: Dockerfile_api
- image: naushadt25/api
- ports:
- - "8080:80"
- environment:
- - "MOVIES_DB_CONN=Server=..."
- web:
- build:
- context: .
- dockerfile: Dockerfile_web
- image: naushadt25/web
- ports:
- - "8090:80"
- environment:
- - "API_URL=http://api/movies"
- depends_on:
- - api
Build images for API and Web applications using either docker build command.
- docker build -f Dockerfile_api -t naushadt25/api:latest .
- docker build -f Dockerfile_web -t naushadt25/web:latest .
Or Run docker-compose up to test locally, which will also build the images of not already present.
Note
In order to push images to Docker Hub, they need to be in username/image format. In case you’ve named your images differently than this, you could create a copy of the image using docker tag command as discussed in the previous post.
Login to Docker Hub,
Run docker push to upload the images to Docker Hub.
- docker push naushadt25/api
- docker push naushadt25/web
Next, you can deploy to Azure using Azure “Web App for Containers” as discussed in the previous post. You’ll need to change the Application Settings for your applications in Azure; Web application needs a URL to API.
And API application needs a connection string,
You could now browse the application.
Further Resources
For an excellent and in-depth look at Docker, check out Wes Higbee courses on Pluralsight.
Source Code
GitHub