Table of Contents
Building .net core applications into Docker containers. I've spent a bit of time lately moving some of my older applications into docker containers in dotnet core 2.0 and 2.1.
I've only started exploring docker with dot net core and what we can do and so far it really has changed how I think about what I'm doing and the way I am building things.
Demo site: https://dotnetdocker.serversncode.com/ Source code for this site is available https://github.com/james-kenny/Serversncode-Docker-demo
With .Net Core being on the edge things change. I've started this post and the https://dotnetdocker.serversncode.com as a way to play around with docker and understand it more.
I've hosted the site on a linode server. For more on setting up linode with docker check out setting up docker on linode and nginx reverse proxy for docker.
Working with Docker in .Net Core
With a dotnet core app we need to add a dockerfile to the project. This will do the build of our application and load it into the docker container and build it.
Docker File
.Net Core 2.0
While 2.0 is not going to be supported in the long term it's where I'll start with that.
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY ServersncodeDemo.Web/ServersncodeDemo.Web.csproj .Web/
RUN dotnet restore
COPY . .
WORKDIR /src/ServersncodeDemo.Web
RUN dotnet build ServersncodeDemo.Web.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish ServersncodeDemo.Web.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ServersncodeDemo.Web.dll"]
.Net Core 2.1
Next we move to .net core 2.1 which will be supported long term.
FROM microsoft/dotnet:2.1.402-sdk-alpine3.7 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY ServersncodeDemo.Web/*.*.csproj ./ServersncodeDemo.Web/
COPY ServersncodeDemo.Data/*.*.csproj ./ServersncodeDemo.Data/
RUN dotnet restore
# copy everything else and build app
COPY ServersncodeDemo.Web/. ./ServersncodeDemo.Web/
COPY ServersncodeDemo.Data/. ./ServersncodeDemo.Data/
WORKDIR /app/ServersncodeDemo.Web
RUN dotnet publish -c Release -o out
FROM microsoft/dotnet:2.1.4-aspnetcore-runtime-alpine3.7 AS runtime
WORKDIR /app
COPY --from=build /app/ServersncodeDemo.Web/out ./
ENTRYPOINT ["dotnet", "ServersncodeDemo.Web.dll"]
Docker Build
I have a blog post https://serversncode.com/docker-commands/ that covers common commands.
First up we build our docker image and give it a name.
docker build -t NAME .
Next we run it locally.
docker run --name NAME -d -p 8080:80 NAME
That's it, I've run a container and pointed the port 8080 to the default port of 80. In my docker file I never changed the port from 80. To change the port of your docker file use the
EXPOSE 8040
command to tell it to use a different port than 80.
What next
Next I'll start getting into the details of the docker file how it's created and what it all means.