Architecting .NET Applications for 
Docker and Container Based 
Deployments 
@Ben_Hall 
Ben@BenHall.me.uk 
Blog.BenHall.me.uk
Who? 
@Ben_Hall 
Tech Support > Tester > Developer > Founder > 
Freelancer 
Ocelot Uproar
Agenda 
• What are containers? 
• .NET running inside a Docker Container 
• Two Containers 
• Three Containers 
• Four Containers, More! 
• Future of Docker and Windows/.NET
A Load Balanced ASP.NET Website 
running inside Docker
WHAT ARE CONTAINERS?
Deployments are hard. 
They shouldn’t be.
Container 
https://www.docker.com/whatisdocker/
Container… 
Own Process Space 
Own Network Interface 
Own Root Directories 
Sandboxed 
Like a lightweight VM. But it’s not a VM.
Container… 
Native CPU 
Native Memory 
Native IO 
No Pre-Allocation 
Zero Performance Overheard
Build, Ship and Run Any App, Anywhere 
Docker - An open platform for distributed applications 
for developers and sysadmins.
In Real Life? 
Digital Ocean Ubuntu Droplet 
Node.js Node.js GoLang Mono 
Static Site ElasticSearch ElasticSearch 
Logstash Kibana Nginx Redis
- Easy deployment 
- Isolated sandboxes 
- Portability 
- Development === Production 
- Control
$ boot2docker 
https://github.com/boot2docker/windows-installer
Production
Not much .NET on there… 
At the moment they’re based on Linux. 
Today Mono works, as does XSP and 
ASP.NET vNext. 
Tomorrow?
.NET APPLICATION RUNNING 
INSIDE CONTAINER
$ docker run 
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
$ docker run 
--name === Friendly name 
--rm === Remove when finished 
-t === Attach to terminal 
-I === Interactive
ASP.NET Example
http://blog.benhall.me.uk/2014/10/running-nancyfx-inside-docker-container/
Dockerfile
Dockerfile - FROM
$ docker search
Dockerfile – ADD / WORKDIR / 
RUN
Dockerfile - EXPOSE
Dockerfile – CMD / 
ENTRYPOINT
$ docker build 
--t === Friendly name. 
<Docker Hub Username>/<ProjectName>
$ docker images
$ docker run
$ docker ps 
-a === Show all containers
$ docker logs 
-f === tail the logs – watch them in real time
$ docker run –p $CONTAINERPORT
Why “$ curl 0.0.0.0:49218” ?
$ boot2docker ip
$ curl b2d:49218
Environment Variables
$ docker push
$ docker export / save
$ docker import / load
What do we have? 
$ cd ~/SourceControl/HelloWorldVNext 
$ cat Dockerfile 
$ docker build -t benhall/aspnetvnext . 
$ docker run -d -t -i -p 5000:5000 benhall/aspnetvnext 
$ curl 192.168.59.103:5000 
<h1>Hello from Razor!!<h1> 
<h2>From 95a28c090686</h2> 
$ docker push benhall/aspnetvnext
TWO CONTAINERS
Storing Data - Volumes 
-v /opt/docker/scrapbook_elasticsearch:/data 
-v /opt/docker/mysql:/var/lib/mysql 
-v /docker/scrapbook/uploads:/app/public/uploads
$ docker run –link CONTAINER:ALIAS
Two Websites On Port 80?
Nginx
DockerGen 
Generate files from docker container meta-data 
https://github.com/jwilder/docker-gen
https://github.com/jwilder/nginx-proxy
THREE CONTAINERS
Fig
$ fig up
Identical for Mono/ASP.NET
FOUR AND MORE!
http://www.ryantomlinson.com/consul-service-discovery-in-a-microservice-world/
1) Like DockerGen, Consul 
raises events on docker 
events 
2) Registrator adds new 
containers details into Consul 
3) Consul links containers IP / 
Ports to DNS names
$ ping redis.service.east-aws.consul 
$ ping redis.service.consul 
[tag.]<service>.service[.datacenter][.domain]
https://github.com/BenHall/docker-loadbalancer-aspnet-demo
BRING IT BACK TO .NET
How should the app be 
structure?
DOCKER AND AZURE
$ azure vm docker create -e 22 -l 'West US' ubuntu-docker 
"b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64- 
server-20140618.1-en-us-30GB" rgardler 1234abcdE$ 
http://msopentech.com/blog/2014/09/11/docker_host_in_azure/
$ docker --tls 
-H tcp://ubuntu-docker.cloudapp.net:4243 
info 
http://msopentech.com/blog/2014/08/15/getting_started_docker_on_microsoft_azure/
$ docker --tls 
-H tcp://ubuntu-docker.cloudapp.net:4243 
run -t -i ubuntu bash 
http://msopentech.com/blog/2014/08/15/getting_started_docker_on_microsoft_azure/
THE FUTURE?
Docker and Microsoft 
Partnership
SQL Server as a Container?
Visual Studio as a Container?
IN SUMMARY…
Only tool I use for deployment 
• Close gap between development and 
production 
• Everything is a container! 
• Running platforms like Logstash, 
ElasticSearch, Redis, EventStore, 
RavenDB, NancyFX etc? Consider 
containers for deployment.
THANK YOU 
@Ben_Hall 
Ben@BenHall.me.uk 
Blog.BenHall.me.uk

Architecting .NET Applications for Docker and Container Based Deployments

Editor's Notes

  • #7 Microservices! Cloud!!
  • #48 for i in {49000..49900}; do VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i"; VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i"; done
  • #50 for i in {49000..49900}; do VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i"; VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i"; done
  • #51 for i in {49000..49900}; do VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i"; VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i"; done
  • #58 $ cd ~/SourceControl/HelloWorldVNext $ cat Dockerfile $ docker build -t benhall/aspnetvnext . $ docker run -d -t -i -p 5000:5000 -e SQLSERVER=192.168.0.4 benhall/aspnetvnext $ curl 192.168.59.103:5000 <h1>Hello from Razor!!<h1> <h2>From 95a28c090686</h2>
  • #101 $ cd ~/SourceControl/HelloWorldVNext $ cat Dockerfile $ docker build -t benhall/aspnetvnext . $ docker run -d -t -i -p 5000:5000 -e SQLSERVER=192.168.0.4 benhall/aspnetvnext $ curl 192.168.59.103:5000 <h1>Hello from Razor!!<h1> <h2>From 95a28c090686</h2>