In this tutorial you will learn how to use docker container in Asp.net core.
Docker is the container technology, which helps in operating system level virtualization to move software product from one environment to another environment, like development to staging or production.
We need to download Docker and install in local machine before we can use it with asp.net core application.
After Docker installation, you will be able to see Docker icon on windows task bar, just click that icon to see the menu like example below, make sure Docker Desktop is running, if not start the docker, you acan restart, change container, check for update so on.
There are many commands in docker utility, best way to start learning just by remembering two docker commands,
docker info
and docker help
, docker info will show the details of local and remote docker repository related information.
Docker help command will show the list of all docker commands, then you can start learning one by one, most commonly used docker commands are, docker build, docker run, docker pull and push.
Before we start using Docker we need to understand what problem does it solve and how?
Just think, how we deploy software product from development environment to staging, and then from staging to production.
Often we experience a situation, when application stops working after deployment, because of various reasons, sometimes missing a file, sometimes-wrong version of file etc.
Now, using Docker, we need not to worry about any of above situation, because in local environment we can run the application on Docker, and then just ship the container to any environment, so all files will remain same inside the container, it will work perfectly the same way on any different environment.
In Docker, there are two type of container setting for different OS. Windows and Linux.
To use docker container in asp.net core project we need to add a dockerfile in the project.
You can either add at the time of creating project or if want to add in any existing project,
This is how the content will look like in a dockerfile, you can edit or add anything, Everything is considered as command.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS build WORKDIR /docker/src COPY ["DockerWeb.csproj", ""] RUN dotnet restore "./DockerWeb.csproj" COPY . . WORKDIR "/docker/src/." RUN dotnet build "DockerWeb.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "DockerWeb.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /docker/app COPY --from=DockerWeb/bin/Release/netcoreapp3.1/publish /app/publish . ENTRYPOINT ["dotnet", "DockerWeb.dll"]
Everything you see in above dockerfile, are commands. We can change them as per need, let's understand few basic command.
Before we add your .NET Core app to the Docker image, we should publish the project, so we know if there is any compilation error, and also the latest change will be updated.
Just run the following command in visual studio command prompt, first go to current folder location
CD G:\RND\DockerWeb> dotnet publish -c Release
Once you run the above command, your project will be compiled and published under folder path below.
bin\Release\netcoreapp3.1\publish
now check, if all deployable files are created successfully, just run the command
dir bin\Release\netcoreapp3.1\publish
You should be able to see all deployable files are created successfully like example below
Directory of G:\RND\DockerWeb\bin\Release\netcoreapp3.1\publish 04-02-2020 22:13 <DIR> . 04-02-2020 22:13 <DIR> .. 04-02-2020 18:56 162 appsettings.Development.json 04-02-2020 18:56 192 appsettings.json 04-02-2020 22:12 107,130 DockerWeb.deps.json 04-02-2020 22:12 8,704 DockerWeb.dll 04-02-2020 22:12 169,984 DockerWeb.exe 04-02-2020 22:12 2,072 DockerWeb.pdb 04-02-2020 22:12 224 DockerWeb.runtimeconfig.json 04-02-2020 22:12 36,352 DockerWeb.Views.dll 04-02-2020 22:12 3,616 DockerWeb.Views.pdb 04-02-2020 22:14 553 web.config 04-02-2020 22:12 <DIR> wwwroot 10 File(s) 328,989 bytes 3 Dir(s) 150,130,073,600 bytes free
Though earlier, I have shared an example of how the default Dockerfile will look like, but now we will look at each parameter value that we need to create a docker image.
"dockerfile" is basically a text file without extension
First, Open developer command prompt and go to current project directory.
There are many command for docker image building, through parent command remain docker image
,
here are all commands with options you can experiment with!
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime WORKDIR /app COPY bin/Release/netcoreapp3.1/publish/DockerWeb.dll ./ ENTRYPOINT ["dotnet", "DockerWeb.dll"]
So when we run the docker build
command, it actually execute each command we have specified in dockerfile
.
docker build -t myimage -f Dockerfile . OR docker build -t dockeId/imagename1:tagname1 -f Dockerfile . OR docker build -t dockeId/imagename1:tagname1 . OR docker build -t dockeId/imagename1:latest -t dockeId/tagname1:v2 .
After -f Dockerfile
there is . (dot) in that command, indicates all command in the docker file to be executed.
docker run command
$ docker run -d -p 8080:80 --name DockerWeb myimage
Open command window (.NET Core CLI), While working with visual studio, you may find using console is easier to run docker command.
G:\RND\DockerWeb
CD G:\RND\DockerWeb
Open command prompt or visual studio power cell, and then go to current project directory location.
dotnet publish
command
In below command "published" is the name of directory, after executing the command, you will see one folder is created with name "published" with all required files and folder in it.
dotnet publish -c Release -o published
Run the dotnet command for the main dll which has entry point, in following example dockerweb.dll
is the name of my dll, your dll name may be different.
dotnet published\dockerweb.dll
Now you see in command prompt, it will show the url http://localhost:5000
, where your app is running, just open the url in browser to confirm.
docker build .
We have already discussed earlier in this post that docker build .
command will execute each command we specify in "dockerfile".
However, you may experience different type of errors while executing all commands in "dockerfile", so let’s start with small set of commands and execute, so we know what type of error comes, and what would be the solution.
WORKDIR
is your current working directory, like "dockerweb", you need to set your directory name.
Let's write following few line of code in your "dockerfile". and execute docker build .
Command Prompt
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime WORKDIR /dockerweb COPY published/dockerweb.dll ./ ENTRYPOINT ["dotnet", "dockerweb.dll"]
As you can see the result in below window, the container is build successfully after executing docker build .
G:\RND\DockerWeb>docker build . Sending build context to Docker daemon 9.111MB Step 1/4 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime ---> 33689ed40fe9 Step 2/4 : WORKDIR /dockerweb ---> Using cache ---> cb0fb5e1a0f0 Step 3/4 : COPY published/dockerweb.dll ./ ---> Using cache ---> 63e9f384d65f Step 4/4 : ENTRYPOINT ["dotnet", "dockerweb.dll"] ---> Running in b3803447be33 Removing intermediate container b3803447be33 ---> 445622b39675 Successfully built 445622b39675 G:\RND\DockerWeb>
Run the application from docker container
docker run -it --rm --name aspnetcore-project dockerweb
At this point you may get error "The virtual machine could not be started because a required feature is not installed.", if you are using windows 10, Enabling Hyper-V for use on Windows 10
Now, so far we have seen how to build docker container in windows 10, So far everything is running smooth, now i try alter the "dockerfile" add some more command option to create image, will update this post soon.