Barış Kısır

Senior Software Developer

Navigation
 » Home
 » RSS

How to Dockerize a .NET Core Application and Share on Docker Hub

19 Jul 2020 » docker, csharp, linux

docker-logo

How to Dockerize a .NET Core Application?

We will start with the installation of Docker. Docker runs in both Windows and Linux but we will do it in the Linux to be less problematic.

I’m using an Ubuntu server 20.04 at gcloud. Lets install the docker on it.

apt-get update && apt-get install -y docker.io
# don't mind the -y parameter, its just for saying "OK I will accept whatever you ask during the installation"
docker -v
# Docker version 19.03.8, build afacb8b7f0

Creating a simple net core application

dotnet new console --name SimpleNetCoreApp
// Program.cs
namespace SimpleNetCoreApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.UtcNow.ToString());
        }
    }
}

Creating Dockerfile and .dockerignore

Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.

Dockerfile and dockerignore files can be generated with both Visual Studio Code and Visual Studio. Let’s move with Visual Studio Code. Install Docker plugin then select Docker: Add Docker files to Workspace

dockerize-2

## Dockerfile
FROM mcr.microsoft.com/dotnet/core/runtime:3.1 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ["SimpleNetCoreApp.csproj", "./"]
RUN dotnet restore "./SimpleNetCoreApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "SimpleNetCoreApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SimpleNetCoreApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SimpleNetCoreApp.dll"]

Building image

Since we have Dockerfile we can build an image.

docker build -t simplenetcoreappimage:v1 .
#Successfully built a0143404f51a
#Successfully tagged simplenetcoreappimage:v1

Let’s list the images we have

docker image list
#REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
#simplenetcoreappimage                   v1                  a0143404f51a        45 seconds ago      190MB
#mcr.microsoft.com/dotnet/core/sdk       3.1                 cf60f383a8d1        4 days ago          705MB
#mcr.microsoft.com/dotnet/core/runtime   3.1                 939432e86f07        4 days ago          190MB

Yup, we have it.

docker run simplenetcoreappimage:v1
#07/19/2020 09:27:29

Pushing to the remote repository

Docker has a service called “Docker Hub” which allows us to share images with people. Free plan allows us to share 1 private and unlimited public repositories.

https://hub.docker.com/

After we create a free account, we will need to login that account through the terminal.

docker login
#Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: bariskisir
Password: #####
#Login Succeeded

Naming in docker images controls the remote repository we’re pushing to. An image id can be targeted from more than one name.

In order to use our repository, let’s set our username as prefix to our image.

docker tag simplenetcoreappimage:v1 bariskisir/simplenetcoreappimage:v1
docker image list
#REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
#bariskisir/simplenetcoreappimage        v1                  a0143404f51a        10 minutes ago      190MB
#simplenetcoreappimage                   v1                  a0143404f51a        10 minutes ago      190MB
#mcr.microsoft.com/dotnet/core/sdk       3.1                 cf60f383a8d1        4 days ago          705MB
#mcr.microsoft.com/dotnet/core/runtime   3.1                 939432e86f07        4 days ago          190MB

Now, we have two names are targeting to same image id and we’re good to go.

docker push bariskisir/simplenetcoreappimage:v1
#The push refers to repository [docker.io/bariskisir/simplenetcoreappimage]

It is pushed and can be reached at https://hub.docker.com/r/bariskisir/simplenetcoreappimage

Pulling images from the remote repository

docker pull bariskisir/simplenetcoreappimage:v1
docker run bariskisir/simplenetcoreappimage:v1
#07/19/2020 09:46:50

That’s it.