I originally wrote this as a single post to document how I deployed an ASP.NET Core application on DigitalOcean. I also setup a web server using Nginx and setup SSL for free using Lets Encrypt and finally added some basic security with Fail2ban.
I soon realised, it became rather large, so I have broken it down into individual sections:
- How to setup a Linux machine with Docker on DigitalOcean
- How to deploy and host an ASP.NET Core app on Linux for $5 a month - this post
- How to add SSL for free for a ASP.NET Core app on Linux using Nginx and Lets Encrypt
- How to secure and protect Nginx on Linux with Fail2ban
Summary
In this post, I will detail the steps involved in actually deploying an ASP.NET Core application from a local machine onto a hosted Linux machine. In this example, I am using .NET Core 2.1 and GitLab’s free Container Registry. I am going to demonstrate how to build a docker image, push and upload it to my personal GitLab Container Registry. Then I will download this docker image from GitLab to a DigitalOcean droplet in order to run it.
If you want to get started on DigitalOcean you can get some free credits using this link. At the time of writing its $100 free credit! And you can follow this guide on how to setup a Linux machine with Docker on DigitalOcean
If you’ve not heard or come across GitLab, its very similar to Github. It offers git source control as well as a whole host of devops, deployment and CI pipeline tools. It also offers a free Docker Container Registry. What does this mean? It means that we can upload our personal docker images into GitLab and download them whenever we need them.
Summary of steps
- Create a Container Registry in GitLab.
- Build and push a docker image into GitLab.
- Deploy the docker image into DigitalOcean.
Create a free GitLab Container Registry account
Create a GitLab account if you don’t have one already. You are not restricted to use GitLab for this walk-through. Any Docker Container Registry will work. Once a GitLab account is created, create a project as shown below:
Then you should be able to access the Registry section within the project, like so:
Make a note of this, as this will be used later.
Create a Docker image using Docker Compose
Here we will create a docker image on a local machine for preparation for pushing into a GitLab’s Docker Container Registry. I will be using a sample app which I created on Github.
Clone the DockerAspNetCoreDemo Repo from Github.
In the same directory, create a docker compose file which is able to build the docker image. Or you can use the one that is already provided
docker-compose-build.yml
Something like this:
version: '3.4'
services:
dockeraspnetcoredemo:
build:
context: .
dockerfile: DockerAspNetCoreDemo/Dockerfile
image: dockeraspnetcoredemo
- Run the command below to build a docker image
docker-compose -f docker-compose-build.yml build
Now lets list the docker images to verify it has been built.
docker images
The output:
REPOSITORY TAG IMAGE ID CREATED SIZE
dockeraspnetcoredemo latest 52c42756d5d6 6 seconds ago 258MB
- Now, tag the docker image as shown below.
docker tag dockeraspnetcoredemo registry.gitlab.com/ch-lee/aspnetcoredemo:latest
Again, running docker images
we should see the original image and the tagged image.
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gitlab.com/ch-lee/aspnetcoredemo latest 52c42756d5d6 About a minute ago 258MB
dockeraspnetcoredemo latest 52c42756d5d6 About a minute ago 258MB
Pushing into a Docker Registry
Now that we have the docker image built and tagged, we can push this into the Container Registry.
- Push the tagged image into GitLab. If its the first time, you will need to login into GitLab by executing the following command:
docker login registry.gitlab.com
- Push the image into GitLab:
docker push registry.gitlab.com/ch-lee/aspnetcoredemo:latest
- Confirm that it is present in GitLab.
Deploying on Linux
In this example, I’m using a Linux machine on DigitalOcean, however, this principle applies to any Linux machine that has Docker installed.
- Connect to the Linux machine using ssh.
- In a preferred directory, I just created a folder called
/home/deploy
Create a docker compose file calleddocker-compose-release.yml
nano /home/deploy/docker-compose-release.yml
- Create a docker compose file as shown below:
version: '3'
services:
aspnetcoredemo:
image: registry.gitlab.com/ch-lee/aspnetcoredemo:latest
ports:
- "80:80"
Notice that the image specified is the one that was uploaded to GitLab. Also, the ports
mapping has been specified. This is in the format of “Host:Container”. This means that the host is on port 80 and the container is also on 80.
- Execute the docker compose command
docker-compose -f /home/deploy/docker-compose-release.yml up -d
- Verify that the docker container is up and running
docker ps
- You should see something like this:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b680bd8e631 registry.gitlab.com/ch-lee/aspnetcoredemo:latest "dotnet DockerAspNet…" 22 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp deploy_aspnetcoredemo_1
- Verify that you can browse to the app from a browser and you should see something like this:
Summary and next steps
As demonstrated above, you can see that an ASP.NET core web application can be deployed relatively easily on a Linux machine using Docker and GitLab’s Container Registry.
To take it further, for instance, you may have a side project that you would like to show the world, you may want to add https and also assign a domain name against it.
In order to this, you can checkout my other post on how to add SSL for free for a ASP.NET Core app on Linux using Nginx and Lets Encrypt