running docker in development & production (#ndcoslo 2015)

91
Running Docker in Development & Production @Ben_Hall [email protected] Blog.BenHall.me.uk

Upload: ben-hall

Post on 02-Aug-2015

897 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Running Docker in Development & Production (#ndcoslo 2015)

Running Docker in Development & Production@[email protected]

Page 2: Running Docker in Development & Production (#ndcoslo 2015)

Who?

@Ben_Hall

Tech Support > Tester > Developer > Founder / Freelancer

Page 3: Running Docker in Development & Production (#ndcoslo 2015)

Agenda

• Introduction to Docker & Containers• One Container• Two Containers• Three Containers• Scale

Page 4: Running Docker in Development & Production (#ndcoslo 2015)

Aim

Demonstrate steps required to create - A Multi-Container - Load Balanced - ASP.NET / Nancy / Node.js Website - Running Inside Containers via Docker

With The Lessons I Learned Along The Way

Page 5: Running Docker in Development & Production (#ndcoslo 2015)

WHAT IS DOCKER?

Page 6: Running Docker in Development & Production (#ndcoslo 2015)

Virtual Machine

https://www.docker.com/whatisdocker/

Page 7: Running Docker in Development & Production (#ndcoslo 2015)

https://www.docker.com/whatisdocker/

Container

Page 8: Running Docker in Development & Production (#ndcoslo 2015)

Own Process SpaceOwn Network InterfaceOwn Root Directories

Sandboxed

Like a lightweight VM. But it’s not a VM.

Container

Page 9: Running Docker in Development & Production (#ndcoslo 2015)

Native CPUNative Memory

Native IO

No Pre-AllocationNo Performance Overheard

Container

Page 10: Running Docker in Development & Production (#ndcoslo 2015)
Page 11: Running Docker in Development & Production (#ndcoslo 2015)
Page 12: Running Docker in Development & Production (#ndcoslo 2015)
Page 13: Running Docker in Development & Production (#ndcoslo 2015)

Docker - An open platform for distributed applications for developers and sysadmins.

Otherwise known as tooling / ecosystem to run containers

Page 14: Running Docker in Development & Production (#ndcoslo 2015)

Registry

Page 15: Running Docker in Development & Production (#ndcoslo 2015)
Page 16: Running Docker in Development & Production (#ndcoslo 2015)

Installing on OSX / Windows

https://github.com/boot2docker/

Page 17: Running Docker in Development & Production (#ndcoslo 2015)

Installing In Production'curl -sSL https://get.docker.com/ | sh'

Page 18: Running Docker in Development & Production (#ndcoslo 2015)

https://github.com/docker/machine

Page 19: Running Docker in Development & Production (#ndcoslo 2015)

ONE CONTAINER

Page 20: Running Docker in Development & Production (#ndcoslo 2015)

$ docker run

--name === Friendly name--rm === Remove when finished-t === Attach to terminal-i === Interactive

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Page 21: Running Docker in Development & Production (#ndcoslo 2015)
Page 22: Running Docker in Development & Production (#ndcoslo 2015)

> docker run -d #Run In Background

elasticsearch #Image Name

https://www.dropbox.com/s/fbe8briq6ayycrh/start-elastic.gif?dl=0

Page 23: Running Docker in Development & Production (#ndcoslo 2015)

Dockerfile

Dockerfile & App Source

Build

Image

https://docs.docker.com/reference/builder/

Page 24: Running Docker in Development & Production (#ndcoslo 2015)
Page 25: Running Docker in Development & Production (#ndcoslo 2015)

FROM

FROM benhall/aspnet-vnext-npm # Base Image

Page 26: Running Docker in Development & Production (#ndcoslo 2015)

https://registry.hub.docker.com/u/benhall/aspnet-vnext-npm/

Page 27: Running Docker in Development & Production (#ndcoslo 2015)

FROM microsoft/aspnet:1.0.0-beta4

RUN useradd -ms /bin/bash devRUN gpg --keyserver pool.sks-keyservers.net --recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D 114F43EE0176B71C7BC219DD50A3051F888C628D

ENV NODE_VERSION 0.10.38ENV NPM_VERSION 2.9.1ENV APT_PACKAGES git

RUN apt-get update -qq && \ apt-get -yqq install $APT_PACKAGES && \ apt-get -yqq clean

RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \ && curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ && gpg --verify SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \ && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc \ && npm install -g npm@"$NPM_VERSION" \ && npm cache clear

apt-get -y install autoconf automake build-essential libtool

run curl -SLO http://libuv.org/dist/v1.0.0/libuv-v1.0.0.tar.gz && \ tar xvf libuv-v1.0.0.tar.gz && \ rm libuv-v1.0.0.tar.gz && \ cd libuv-v1.0.0 && \ sh ./autogen.sh && \ ./configure&& \ make && \ make install && \ cd .. && \ rm -rf libuv-v1.0.0 && \ ldconfig

RUN npm install -g bower grunt-cli

USER devWORKDIR /home/dev

Page 28: Running Docker in Development & Production (#ndcoslo 2015)

Dockerfile – ADD / WORKDIR / RUN

COPY WebApplication /app

WORKDIR /app

RUN ["dnu", "restore”]

Page 29: Running Docker in Development & Production (#ndcoslo 2015)

Dockerfile – EXPOSE / CMD

EXPOSE 5000

CMD ["dnx", ".", "kestrel"]

Page 30: Running Docker in Development & Production (#ndcoslo 2015)

Example – ASP.NET vNextFROM benhall/aspnet-vnext-npm

COPY WebApplication /app

WORKDIR /app

RUN ["dnu", "restore”]

EXPOSE 5000

CMD ["dnx", ".", "kestrel"]

Page 31: Running Docker in Development & Production (#ndcoslo 2015)

Example - NancyFXFROM benhall/docker-mono

COPY . /src

WORKDIR /src

RUN xbuild Nancy.Demo.Hosting.Docker.sln

EXPOSE 8080

CMD ["mono", "src/bin/Nancy.Demo.Hosting.Docker.exe"]

Page 32: Running Docker in Development & Production (#ndcoslo 2015)

Example – Node.JSFROM node:0.10.38

RUN mkdir -p /usr/src/appWORKDIR /usr/src/app

COPY package.json /usr/src/app/RUN npm install

COPY . /usr/src/app

EXPOSE 3001

CMD [ "npm", "start" ]

Page 33: Running Docker in Development & Production (#ndcoslo 2015)

$ docker build--t === Friendly name.

<Docker Hub Username>/<ProjectName>:<tag>

Page 34: Running Docker in Development & Production (#ndcoslo 2015)

$ docker images

Page 35: Running Docker in Development & Production (#ndcoslo 2015)
Page 36: Running Docker in Development & Production (#ndcoslo 2015)
Page 37: Running Docker in Development & Production (#ndcoslo 2015)

> cat .dockerignore #Ignore file in root

all_the_passwords.txt.git/node_modules/bower_components/

Page 38: Running Docker in Development & Production (#ndcoslo 2015)

$ docker run

Page 39: Running Docker in Development & Production (#ndcoslo 2015)

$ docker ps-a === Show all containers

Page 40: Running Docker in Development & Production (#ndcoslo 2015)

> docker inspect elasticsearch

"NetworkSettings": { "Bridge": "docker0", "Gateway": "172.17.42.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "fe80::42:acff:fe11:3", "LinkLocalIPv6PrefixLen": 64, "MacAddress": "02:42:ac:11:00:03", "PortMapping": null}

Page 41: Running Docker in Development & Production (#ndcoslo 2015)

$ docker run –p $CONTAINERPORT

Page 42: Running Docker in Development & Production (#ndcoslo 2015)

> iptables -t nat -L –n

Chain DOCKER (1 references)target prot opt source destinationDNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49163 to:172.17.0.27:80DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49164 to:172.17.0.29:3000DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49165 to:172.17.0.30:80DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49166 to:172.17.0.31:3000DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49167 to:172.17.0.38:80DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49168 to:172.17.0.40:3000DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.95:80

Page 43: Running Docker in Development & Production (#ndcoslo 2015)

> docker run -d #Run In Background -p 9200:9200 -p 9300:9300 #Bind Ports

elasticsearch #Image Name

https://www.dropbox.com/s/fbe8briq6ayycrh/start-elastic.gif?dl=0

Page 44: Running Docker in Development & Production (#ndcoslo 2015)

> curl b2d:9200 # b2d is my Boot2Docker VM

https://www.dropbox.com/s/fbe8briq6ayycrh/start-elastic.gif?dl=0

Page 45: Running Docker in Development & Production (#ndcoslo 2015)

Recap

• docker registry• docker run elasticsearch

• Create Dockerfile• docker build –t image-name .• docker run image-name

Page 46: Running Docker in Development & Production (#ndcoslo 2015)

Go Lang

> cat DockerfileFROM golang:onbuild

> cat MakefileNAME = ocelotuproar/docker-outdatedbuild:

docker build -t $(NAME) .run:

docker run --rm --name $(INSTANCE) $(NAME)

> make build # Run Golang Compiler & Build

container> make run # Run built application

Page 47: Running Docker in Development & Production (#ndcoslo 2015)

Private NPM Repository

https://github.com/BenHall/docker-local-npm-

registry

> docker run -d -v $(pwd)/config.yaml:/opt/sinopia/config.yaml -p 4873:4873 keyvanfatehi/sinopia:latest

> npm set registry http://b2d:4873> npm adduser --registry http://b2d:4873

Page 48: Running Docker in Development & Production (#ndcoslo 2015)

RStudio

• docker run -d -p 8787:8787 rocker/rstudio

Page 49: Running Docker in Development & Production (#ndcoslo 2015)

TWO CONTAINERS / PRODUCTION

Page 50: Running Docker in Development & Production (#ndcoslo 2015)

Docker Push / Pull

> docker run -p 5000:5000 registry:2.0

> docker push myreg:5000/benhall/aspnet:20150617140759

> docker pull myreg:5000/benhall/aspnet:20150617140759

Page 51: Running Docker in Development & Production (#ndcoslo 2015)

Persisting Data$ docker run –v <host-dir>:<container-dir> image

-v /opt/docker/elasticsearch:/data

-v /opt/docker/mysql:/var/lib/mysql

-v /docker/scrapbook/uploads:/app/public/uploads

-v $(PWD):/host

-v /var/log/syslog:/var/log/syslog

Page 52: Running Docker in Development & Production (#ndcoslo 2015)
Page 53: Running Docker in Development & Production (#ndcoslo 2015)

> docker run -d --restart=always # Restart if exits non-zero

redis

Page 54: Running Docker in Development & Production (#ndcoslo 2015)

Environment Variables

Page 55: Running Docker in Development & Production (#ndcoslo 2015)

> docker run -d -p 9200:9200 -p 9300:9300 --name es # 1) Friendly Name

elasticsearch > docker run –it –p 3000

--link es:elasticsearch #2) <container>:<alias> your-application> cat /etc/hosts172.17.0.79 elasticsearch

> envHOSTNAME=2f3b959b13a0ELASTICSEARCH_PORT=tcp://172.17.0.79:9200ELASTICSEARCH_PORT_9200_TCP=tcp://172.17.0.79:9200ELASTICSEARCH_PORT_9200_TCP_ADDR=172.17.0.79ELASTICSEARCH_PORT_9200_TCP_PORT=9200ELASTICSEARCH_PORT_9200_TCP_PROTO=tcpELASTICSEARCH_NAME=/scrapbookv2_web_1/esNODE_ENV=production

Page 56: Running Docker in Development & Production (#ndcoslo 2015)
Page 57: Running Docker in Development & Production (#ndcoslo 2015)

Two Websites On Port 80?

Page 58: Running Docker in Development & Production (#ndcoslo 2015)

Nginx

Page 59: Running Docker in Development & Production (#ndcoslo 2015)
Page 60: Running Docker in Development & Production (#ndcoslo 2015)

Problematic Approach

> docker run -d --name nginx_root --link blog_benhall-1:blog_benhall-1 --link scrapbook-1:scrapbook-1 --link scrapbook_web_1:scrapbook_web_1 --link brownbag_web_1:brownbag_web_1 -p 80:80 -v /opt/docker/nginx/www:/data -v /opt/docker/nginx/sites:/etc/nginx/sites-enabled -v /opt/docker/nginx/logs:/var/log/nginx dockerfile/nginx

Page 61: Running Docker in Development & Production (#ndcoslo 2015)

Nginx Proxyhttps://github.com/jwilder/nginx-proxy

https://www.dropbox.com/s/2f6y2frfjafc409/nginx-proxy-optimised.gif?dl=0

Page 62: Running Docker in Development & Production (#ndcoslo 2015)
Page 63: Running Docker in Development & Production (#ndcoslo 2015)

• -v /var/run/docker.sock:/tmp/docker.sock

• VIRTUAL_HOST=my.container.com

Page 64: Running Docker in Development & Production (#ndcoslo 2015)

# HTTP 1.1 supportproxy_http_version 1.1;proxy_buffering off;proxy_set_header Host $http_host;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $proxy_connection;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

upstream my.container.com {# agitated_hopperserver 172.17.0.35:5001;

}

server {listen 80;server_name my.container.com;

location / {proxy_pass http://my.container.com;

}}

Page 65: Running Docker in Development & Production (#ndcoslo 2015)

> docker run -d --name blog_benhall_varnish --link blog_benhall:wordpress -e VIRTUAL_HOST=blog.benhall.me.uk -e VARNISH_BACKEND_PORT=80 -e VARNISH_BACKEND_HOST=wordpress benhall/docker-varnish

NginxVarnish

blog_benhall_varnish

Wordpressblog_benhall

Page 66: Running Docker in Development & Production (#ndcoslo 2015)

THREE CONTAINERS

Page 67: Running Docker in Development & Production (#ndcoslo 2015)
Page 68: Running Docker in Development & Production (#ndcoslo 2015)

> cat docker-compose.ymlweb: # Container Name build: . # Build links: # Links - elasticsearch ports: # Ports - 3000 environment: # Environment VIRTUAL_HOST: 'app.joinscrapbook.com' NODE_ENV: 'production’

elasticsearch: # 2nd Container Name image: elasticsearch:1.5 # Use Image ports: # Ports - 9200:9200

Page 69: Running Docker in Development & Production (#ndcoslo 2015)

> docker-compose up # Start containers–d # In background

Recreating scrapbookv2_nginx_1...Recreating scrapbookv2_redis_1...Recreating scrapbookv2_db_1...Recreating scrapbookv2_elasticsearch_1...Recreating scrapbookv2_web_1…

> docker-compose stop # Stop containersStopping scrapbookv2_web_1...Stopping scrapbookv2_elasticsearch_1...Stopping scrapbookv2_db_1...Stopping scrapbookv2_redis_1...Stopping scrapbookv2_nginx_1...

Page 70: Running Docker in Development & Production (#ndcoslo 2015)

Schema Management Containers

> docker run –d # No need to bind ports --name es # Friendly Name dockerfile/elasticsearch > docker run –rm

--link es:es # Link Container:alias myapp/schema:latest # Schema Image

Page 71: Running Docker in Development & Production (#ndcoslo 2015)

Sidekick Container For Testing

> docker run –d # No need to bind ports --name es # Friendly Name dockerfile/elasticsearch > docker run –it

--link es:es # Link Container:alias benhall/curl # Curl Image curl http://es:9200 # Ping service

> echo $? # Exit Code0 # Success

Page 72: Running Docker in Development & Production (#ndcoslo 2015)

FOUR AND MORE! SCALE!

Page 73: Running Docker in Development & Production (#ndcoslo 2015)
Page 74: Running Docker in Development & Production (#ndcoslo 2015)

[tag.]<service>.service[.datacenter][.domain]

$ ping redis.service.east-aws.consul

$ ping redis.service.consul

Page 75: Running Docker in Development & Production (#ndcoslo 2015)

A Load Balanced ASP.NET/NancyFX/Node.js Website running inside Docker

https://www.dropbox.com/s/gbcifo094c9v8ar/nancy-lb-demo-optimised.gif?dl=0

Page 76: Running Docker in Development & Production (#ndcoslo 2015)

1) Docker raises events when containers start / stop

2) Registrator listens to events adds the new container’s details into Consul

3) Consul links container’s IP / Ports to DNS names & discovery API

> ping redis.service.consul

4) Nginx uses Consul discovery API to write & load config

Page 77: Running Docker in Development & Production (#ndcoslo 2015)

SwarmA Docker-native clustering system

Page 78: Running Docker in Development & Production (#ndcoslo 2015)
Page 79: Running Docker in Development & Production (#ndcoslo 2015)

http://12factor.net/

Page 80: Running Docker in Development & Production (#ndcoslo 2015)

THE FUTURE?

Page 81: Running Docker in Development & Production (#ndcoslo 2015)

Docker and Microsoft Partnership

Page 82: Running Docker in Development & Production (#ndcoslo 2015)

SQL Server as a Container?

Page 83: Running Docker in Development & Production (#ndcoslo 2015)

Spoon.NET

Page 84: Running Docker in Development & Production (#ndcoslo 2015)

Visual Studio as a Container?

Page 85: Running Docker in Development & Production (#ndcoslo 2015)

Docker as a Platform

Page 86: Running Docker in Development & Production (#ndcoslo 2015)
Page 87: Running Docker in Development & Production (#ndcoslo 2015)

http://www.joinscrapbook.com

Page 88: Running Docker in Development & Production (#ndcoslo 2015)

IN SUMMARY…

Page 89: Running Docker in Development & Production (#ndcoslo 2015)

Only tool I use for deployment

• Close gap between development and production

• Everything is a container!

• Docker Machine, Compose & Swarm

• Running platforms like Logstash, ElasticSearch, Redis, EventStore, RavenDB, NancyFX etc? Consider containers for deployment.

Page 90: Running Docker in Development & Production (#ndcoslo 2015)
Page 91: Running Docker in Development & Production (#ndcoslo 2015)

@[email protected]

Thank you

http://www.JoinScrapbook.com

2 Day Training in Oslo with ProgramUtviklingSeptember 2015