Microservices into C# World ?

A bit of background about microservices via Martin Fowler. Some really cool stuff regarding patterns via Microservices.io.

Microphone allows you to run self hosting services using either WebApi or NancyFx ontop of a Consul.io cluster.
You can find the code here https://github.com/rogeralsing/Microphone

Consul is a system that does service discovery, configuration management, and health checking for your services. Services can register themselves using either a REST API or via DNS, and if a service becomes unresponsive, Consul can mark this service as unavailable and not include it in any search results.

You can start consul service with below line on console:

Check service health on Consul agent:

Check all services registered on Consul agent:

Discovery service output:

Time to play with some code.

Reference: Microservices discovery for .net

Docker compose

Docker is a great tool but for complex applications with a lot of components, orchestrating all the containers to start up and shut down together (not to mention talk to each other) can quickly become difficult.

Docker Compose makes dealing with the orchestration processes of Docker containers (such as starting up, shutting down, and setting up intracontainer linking and volumes) really easy.

Installing Docker Compose

Running a Container with Docker Compose


While still in the ~/hello-world directory, execute the following command to create the container:

To show the group of Docker containers (both stopped and currently running), use the following command:

To stop all running Docker containers for an application group, run the following command in the same directory as the docker-compose.yml file used to start the Docker group:

If you want to start from scratch you can use the rm command to fully delete all the containers that make up your container group:

Additional links:

  1. https://docs.docker.com/compose/



Docker installation on Ubuntu 12.04 LTS

Docker requires a 64-bit installation regardless of your Ubuntu version. Additionally, your kernel must be 3.10 at minimum.

To check current kernel version:

Create /etc/apt/sources.list.d/docker.list and add below line:

For Ubuntu Trusty, Vivid, and Wily, it’s recommended to install the linux-image-extra kernel package. The linux-image-extra package allows you use the aufs storage driver.

Install docker:


To avoid : Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Log out and log in back. This ensures your user is running with the correct permissions.


Additional links:

  1. https://docs.docker.com/engine/installation/ubuntulinux/

Docker – Intro


Docker provides an integrated technology suite that enables development and IT operations teams to build, ship, and run distributed applications anywhere.

“Docker wasn’t on anyone’s roadmap in 2014, it is on everyone’s roadmap for 2015”


  • Docker Images – blueprints of our application
  • Docker Container – created from docker images and are real instances of our application
  • Docker Daemon – building, running and distributing Docker images
  • Docker Client – Run on our local machine and connect to the daemon
  • Docker Hub – a registry of docker images


Quick and easy install script provided by Docker:

If you’re looking for detailed steps or how to install on different Windows / OSX please check https://docs.docker.com/

If you’re running docker under Linux you need to run

to avoid: Cannot connect to the Docker daemon. Is the docker daemon running on this host? Log out and log in back. This ensures your user is running with the correct permissions.

On Linux the 3.10.x kernel is the minimum requirement for Docker. For OSX 10.8 “Mountain Lion” or newer is required.

Both OSX and Windows require Docker Toolbox to be installed in order to be able to run docker containers.

Early versions of Docker Toolbox require you to install a VM with Docker Machine using the VirtualBox provider:

However the latest versions of Docker Toolbox will take care of this part. You can check Docker-machine version and status and ip:

Docker Images

Docker at its core is a way to separate an application and the dependencies needed to run it from the operating system itself. To make this possible Docker uses containers and images.

A Docker image is basically a template for a filesystem. When you run a Docker image, an instance of this filesystem is made live and runs on your system inside a Docker container. By default this container can’t touch the original image itself or the filesystem of the host where Docker is running. It’s a self-contained environment.

Let’s search the official Ubuntu docker image.

Limit the search to Ubuntu images with at least 1000 stars/rating:

  • docker run – run and interact with the image:

View previous images and history:


Remove docker instance:


While you can use the docker rmi command to remove specific images, there’s a tool called docker-gc that will clean up images that are no longer used by any containers in a safe manner.

  • docker load loads an image from a tar archive as STDIN, including images and tags (as of 0.7).
  • docker save saves an image to a tar archive stream to STDOUT with all parent layers, tags & versions (as of 0.7).
  • docker history shows history of image.
  • docker tag tags an image to a name (local or registry).



Docker containers wrap up your application in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.

Containers are for software, not for data

Docker containers are consumables. Docker containers should be used to scale applications, for firing more app servers with the same setup etc. Data belongs onto the filesystem but not into a container that can neither be cloned in an easy way nor incrementally backed up in a reasonable way. Containers are for software, not for data.

Docker container commands

If you want to map a directory on the host to a docker container, docker run -v $HOSTDIR:$DOCKERDIR. Also see Volumes.

  • docker start starts a container so it is running.
  • docker stop stops a running container.
  • docker restart stops and starts a container.
  • docker pause pauses a running container, “freezing” it in place.
  • docker unpause will unpause a running container.
  • docker wait blocks until running container stops.
  • docker kill sends a SIGKILL to a running container.
  • docker attach will connect to a running container.
  • docker logs gets logs from container. (You can use a custom log driver, but logs is only available for json-file and journald in 1.10)
  • docker inspect looks at all the info on a container (including IP address).
  • docker events gets events from container.
  • docker port shows public facing port of container.
  • docker top shows running processes in container.
  • docker stats shows containers’ resource usage statistics.
  • docker diff shows changed files in the container’s FS.
  • docker stats --all shows a running list of containers.

Additional links:

  1. https://docs.docker.com/linux/
  2. https://docs.docker.com/engine/understanding-docker/#how-does-a-docker-image-work
  3. https://docs.docker.com/engine/userguide/containers/usingdocker/