architecting .net applications for docker and container based deployments
TRANSCRIPT
Architecting .NET Applications for
Docker and Container Based
Deployments@Ben_Hall
Blog.BenHall.me.uk
Who?
Ocelot Uproar
@Ben_Hall
Tech Support > Tester > Developer > Founder >
Freelancer
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
DockerGenGenerate 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
[tag.]<service>.service[.datacenter][.domain]
$ ping redis.service.east-aws.consul
$ ping redis.service.consul
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