Hosting a ASP.NET Core application in a Docker container using microsoft/aspnetcore image
You all will be familiar with Docker by now given its popularity among developers and infra people and some of you may have already created containers using Docker images. One of the most widely used workflows among people using .NET Core will create a new web application by using the dotnet new command as shown below.
The below example uses ASP.NET Core 2.0 framework, in which the dotnet new command will create the project as well as restores the dependencies specified in the csproj file by default. I have already written a post about it and you can refer it for information about it.
Then you will do a build to see if there are any errors and use dotnet run command which will self-host the web application
After the to containerize our application, many of you have created the Docker image using a Dockerfile like the one given below
FROM microsoft/dotnet ENV ASPNETCORE_URLS http://+:80 EXPOSE 80
COPY . .
RUN dotnet restore
ENTRYPOINT ["dotnet", "run"]
You will often see these type of samples everywhere on the web to get started with Docker. But this is a wrong approach if you are going to use it in production. Because first of all, you are using the microsoft/dotnet which is around 1 GB in size and has got the SDK built into it. Normally in production, we tend to use only the .net runtime and a deployment package to host the application. In the above we are copying the entire source files to the container, then restores all the dependencies, build and host the application.
This is perfectly OK in a dev environment but is not good for a production environment. So to optimize we will make a couple of changes in the Dockerfile. The first one will be to change the base image from microsoft/dotnet to microsoft/aspnetcore. This image is a stripped down version and contains only the components that are needed for running an ASP.Net core application, basically, it has the .net core runtime in it. And the second change is that we only copy the contents of the deployment package instead of the entire source code into the container, restoring and building it inside the container.
So to create the deployment package, use the dotnet build or publish command as shown below.The -c switch specifies the configuration mode and -o specifies the location in which the deployment files need to be created
And the modified Dockerfile will be
ENV ASPNETCORE_URLS "http://+:9500"
COPY ./Publish .
Let's create the image using the following command
docker build -t amaldevv/netsample .
And the following command to create the container using the newly created image
docker run -it -p 9500:9500 amaldevv/netsample
Here's the output and that's running from container based on an optimizied version of .NET Core
Breaking Changes coming your way for ASP.NET Core 3.0
Resilient Connections in Entity Framework Core