.NET Core SPA + Docker

.NET Core SPA + Docker

Playing with Docker has been on my bucket list for while and I've finally put aside some time to get started. So this was the easiest way I've found to start a brand new SPA using .NET Core and dockerize it. I'm not going to do any introduction to Docker itself, if you want to know more about it, check this video or go to their website.

Pre-requisites
Creating SPA

Open the console (I use Cmder) and navigate to a folder you want to create your application. In the commands below, I create a folder in the current directory, but you don't need to if you've already created the folder

md DockerSpa
cd DockerSpa
dotnet new angular
dotnet restore
dotnet run

After you run all these commands, you should be able to open the browser, navigate to http://localhost:5000 to test it and you should see this:

Well done! You have your SPA up and running.

Installing DotNetCore base Docker Image

To install the base image for your .NET Core SPA, use the command below. You'll find elsewhere people telling you to use docker pull microsoft/dotnet instead, although you'll hit a roadblock when you find out that it doesn't have node.js pre configured.

docker pull microsoft/aspnetcore-build
Creating Docker Image
  • Create a file named docker-compose.build.yml and paste the content below:
version: '2'

services:  
  ci-build:
    image: microsoft/aspnetcore-build
    container_name: build
    volumes:
      - .:/src
    working_dir: /
    command: /bin/bash -c "dotnet restore && dotnet publish -c Release -o ./build"
  • Run the command below to prepare and build our code to be able to generate an image. This will download the latest aspnetcore-build image and build yours on top of it. Be prepared to download a couple of hundred MBs.
docker-compose -f .\docker-compose.build.yml run ci-build
  • Create a file named DockerFile (Yes! No extension!) and paste the content below. Here we're defining our image and which base image is being based on.
FROM microsoft/aspnetcore-build
ARG source  
RUN echo "source: $source"  
WORKDIR /app  
COPY ${source:-/build} .  
EXPOSE 80  
ENTRYPOINT ["dotnet", "DockerSpa.dll"]
  • Create a file name docker-compose.yml and paste the content below. This is the "script" that will create our image and which image definition is going to use (DockerFile). Just make sure you don't have any conflict when setting up the ports which in this case is just mapping the external port 5005 to the internal port 80.
version: '2'

services:  
  dockerspa:
    image: dockerspa
    container_name: dockerspa
    build:
      context: ./
      dockerfile: Dockerfile
      args:
        source: ./build
    ports:
      - "5005:80"
  • Now use the command below to create the image
docker-compose -f .\docker-compose.yml -p dockerspa build
Creating a Container

A container is basically a running instance of an image. Let's run the command below and check if everything went well:

docker-compose -f .\docker-compose.yml -p dockerspa up -d
Testing it

Now if everything went well, you should be able to navigate to http://localhost:5005 and see this:


Hope you liked it and you found it easy to follow.

Cheers.