+ All Categories
Home > Technology > Docking your services_with_docker

Docking your services_with_docker

Date post: 10-May-2015
Category:
Upload: tikal-knowledge
View: 3,255 times
Download: 1 times
Share this document with a friend
Popular Tags:
65
FullStack Developers Israel Hosted by: Docking micro services with Haggai Philip Zagury 28.1.2014 Google Campus T.A
Transcript
Page 1: Docking your services_with_docker

FullStack Developers Israel

Hosted by:

Docking micro services with

Haggai  Philip  Zagury  28.1.2014

Google Campus T.A

Page 2: Docking your services_with_docker

WHO AM I ?

Page 3: Docking your services_with_docker

{    }

Haggai Philip Zagury, DevOps Engineer

over 10 years of DevOps expertise

●  Continuous integration ●  Continuous delivery ●  It Operations ●  Configuration management

Page 4: Docking your services_with_docker

“  I am a member of Tikal's DevOps/ALM group. With over 15 members, we meet, share, contribute and code together

on a monthly basis

Page 5: Docking your services_with_docker

WHO WE ARE?

Page 6: Docking your services_with_docker

We help companies build, deliver, deploy, manage

and optimize their products.

Page 7: Docking your services_with_docker

OUR EXPERTISE

Page 8: Docking your services_with_docker

text

Where are we going    today

Page 9: Docking your services_with_docker

How CM & Deployment changed Between

Monolithic & SOA / MSA

Page 10: Docking your services_with_docker
Page 11: Docking your services_with_docker

Stack => Stacks

Page 12: Docking your services_with_docker

More Technologies

Page 13: Docking your services_with_docker

More Technologies

More Services (API’s)

Page 14: Docking your services_with_docker

More Technologies

More Teams More Services (API’s)

Page 15: Docking your services_with_docker

Each team with

it’s own “madness”

Page 16: Docking your services_with_docker

MONOLITHIC app deployment

1  …  n  

1  …  n  }FABRIC  

*  n  

Page 17: Docking your services_with_docker

}FABRIC  

*  n  

MONOLITHIC style for SOA/MSA

service  A  

service  B  

service  C  

Page 18: Docking your services_with_docker

MONOLITHIC style for SOA/MSA Team  /  Service  A  

Page 19: Docking your services_with_docker

MONOLITHIC style for SOA/MSA Team  /  Service  B  

Page 20: Docking your services_with_docker

MONOLITHIC style for SOA/MSA Team  /  Service  C  

Page 21: Docking your services_with_docker

}FABRIC  

*  n  

MONOLITHIC style for SOA/MSA

Page 22: Docking your services_with_docker

text MONOLITHIC “style”

•  Much more “base images” in order to save time •  Deployment takes much longer (ad hoc configuration) •  Consolidate in order to save time •  Backup & Restore ? doesn’t save time :( •  Security ?

System provisioning (& OS provisioning)  

Page 23: Docking your services_with_docker

text MONOLITHIC “style”

• Kernel  version  not  supported  • Other  component's  depend  on  that  

• Wait  for  next  release  /  OS  upgrade  

I  need  xyz  installed  

Page 24: Docking your services_with_docker

text More images == GB/$$/PERF

Between 100MB & nGB

Cost in storage … [ e.g. S3 ] Cost in performance [ VMware …]

Page 25: Docking your services_with_docker
Page 26: Docking your services_with_docker
Page 27: Docking your services_with_docker

From library dependency)

Page 28: Docking your services_with_docker

From library dependency

runtime directory (encapsulation)

Page 29: Docking your services_with_docker

From library dependency

runtime directory (encapsulation)

“.service” (hybrid)

Page 30: Docking your services_with_docker

}FABRIC  

*  n  

Choose 1 tool for the job ?!

service  A  

service  B  

service  C  

Page 31: Docking your services_with_docker

Containers  

•  OSLV  -­‐  OperaJng  System  Level  VirtualizaJon  (link)  

•  API  &  tooling,  which  enable  *nix  users  to  easily  

create  and  manage  system  or  applicaJon  

containers.  

 

Page 32: Docking your services_with_docker

What are containers anyway ?

Page 33: Docking your services_with_docker

text Linux Containers (LXC) - Why ?

Why now ?  

•  Solaris Zones (containers - link) •  Vserver •  Openvz

•  Chroot

Isn't there enough container tech ?  

•  Solaris not widely used as linux/freebsd … •  Linux kernel support ( >= 2.6.27 ) •  Application segmentation

•  We really need it !!! => “.service” era

Page 34: Docking your services_with_docker

text Linux Containers (LXC) - Why ?

Limitation  

•  Kernel namespaces [ isolated processes, network etc ] •  Chroot & Seccomp (isolation) •  Control groups (a.k.a cgroups)  

Features  

• Only Linux !

Page 35: Docking your services_with_docker

text Revolution – Hard/Software

From  Rack  servers  =>  Blade  

Page 36: Docking your services_with_docker

So what’s this DOCKER and why do I need it ?

Page 37: Docking your services_with_docker

Why DOCKER ? Why? •  A wrapper for LXC •  An abstraction layer for LXC + features

So Why not “plain old” LXC ? •  Portable deployments across machines

•  LXC alone doesn't guarantee that ! •  Docker build - a “build tool” designed for portability •  Application centric / OS centric [ Docker’s API ]

•  SHA-1 (git like) based versioning •  DRY / Reuse - 1 base image for many applications •  Sharing - index (global) or registry (private / on prem)

Page 38: Docking your services_with_docker

text Docker ( & LXC ) Solve !

•  Daemon per container

ISOLATION  

Any  version  is  supported  

Page 39: Docking your services_with_docker

text Docker ( & LXC ) Solve !

SECURITY  

•  Daemon per container

ISOLATION  

•  Container == Independent ( user/group/service etc) •  New version == new container ( not toe trading …)

Page 40: Docking your services_with_docker

text Docker ( & LXC ) Solve !

SECURITY  

•  Daemon per container

ISOLATION  

•  Container == Independent ( user/group/service etc) •  New version == new container ( not toe trading …)

PORTABILITY  •  Container on DEV machine => to production •  Deploy from private registry •  Rollback == latest -1

Page 41: Docking your services_with_docker

VM  vs  Container  

•  No hypervisor layer •  No lib duplication •  Shared kernel •  VMS are “heavy”

•  5-10 x Faster •  Startup time •  VMS are “heavy” •  Better utilize HW (cloud)

Page 42: Docking your services_with_docker

Docker - lightweight

•  Reuse kernel •  Add functionality to a

container, version it, share it

Page 43: Docking your services_with_docker

Docker  Micro service example

Host  /  VM    

•  ROR  front  end  •  Key-­‐value  store  

Page 44: Docking your services_with_docker

Workflow(s)

Page 45: Docking your services_with_docker

The developer workflow

●  How do we test locally ? { if running on windows / OSX }

●  Define an interface with operations ?

Page 46: Docking your services_with_docker

Vagrant & Docker

Vagrant.configure("2") do |config|

config.vm.box = "dummy" config.vm.provider :docker do |docker|

docker.image = "your/image:tag"

docker.cmd = ["/path/to/your", "command"]

end

end

vagrant  plugin  install  docker-­‐provider    

-­‐  docker  friendly  vagrant  image  

Page 47: Docking your services_with_docker

Fast,  isolated  development  environments  using  Docker.  

•  Define your application’s environment •  OS •  Packages •  Configuration ! etc •  Number of machines ?

•  Define a container via Dockerfile •  Use that Dockerfile to define your environment (via yaml

file) web:      build:  .      links:        -­‐  db      ports:        -­‐  8000:8000  db:      image:  hagzag/pgsql  

workflow  

Page 48: Docking your services_with_docker

Search & Get an image

docker  search  <keyword>    root@docker-­‐poc:/tmp#  docker  search  centos*6  NAME                                                              DESCRIPTION                                                                                STARS          OFFICIAL      TRUSTED  saltstack/centos-­‐6                                                                                                                                        0                                                  [OK]  salgest/centos-­‐6                                                                                                                                          0                                                  [OK]  saltstack/centos-­‐6-­‐minimal                                                                                                                        1                                                  [OK]  leifw/tokumx-­‐buildslave-­‐centos-­‐6                                                                                                          0                                                  [OK]  tenforward/centos-­‐i386                            CentOS  6  32bit  image                                                        0  hansode/rpmbuilder-­‐rhel6                        CentOS-­‐6  with  rpmdevtools                                  0  ...  

hgp://index.Docker.io  

Page 49: Docking your services_with_docker

Define your own

Dockerfile  -­‐>  Redis  server  running  in  a  container    

#  Docker  Image/tag  FROM                  ubuntu:12.10  #  command(s)  to  execute  on  container    RUN                        apt-­‐get  update  RUN                        apt-­‐get  -­‐y  install  redis-­‐server  #  what  port  to  listen  on  EXPOSE            6379  #  once  container  is  acJve  what  binary  to  run  ENTRYPOINT      ["/usr/bin/redis-­‐server"]  

Page 50: Docking your services_with_docker

Docker - Choose base docker  pull  user/container-­‐name    root@docker-­‐poc:/tmp#  docker  pull  saltstack/centos-­‐6-­‐minimal  Pulling  repository  saltstack/centos-­‐6-­‐minimal  aca320b373f2:  Download  complete  f2f28f99c5fd:  Download  complete  bf9724189396:  Download  complete  e7adb01c55f6:  Download  complete  a3f13a39bbbe:  Download  complete      

Git  style  “tags”  

Salt  –  inside  …  

Page 51: Docking your services_with_docker

Docker build build  from  Dockerfile      docker  build  .    Step  1  :  FROM  ubuntu:12.10    -­‐-­‐-­‐>  b750fe79269d  Step  2  :  RUN  apt-­‐get  update    -­‐-­‐-­‐>  Running  in  0d768rc284d  Fetched  9813  kB  in  20s  (481  kB/s)    -­‐-­‐-­‐>  46a6f0556e96  Step  3  :  RUN  apt-­‐get  -­‐y  install  redis-­‐server    -­‐-­‐-­‐>  Running  in  5ea88c37d21f  The  following  extra  packages  will  be  installed:      libjemalloc1  The  following  NEW  packages  will  be  installed:      libjemalloc1  redis-­‐server  0  upgraded,  2  newly  installed,  0  to  remove  and  0  not  upgraded.  Need  to  get  319  kB  of  archives.      

Page 52: Docking your services_with_docker

Docker build …  Processing  triggers  for  ureadahead  ...    -­‐-­‐-­‐>  ba4030995701  Step  4  :  EXPOSE  6379    -­‐-­‐-­‐>  Running  in  24720beda74b    -­‐-­‐-­‐>  6fdf06372117  Step  5  :  ENTRYPOINT  ["/usr/bin/redis-­‐server"]    -­‐-­‐-­‐>  Running  in  c9b9480840ad    -­‐-­‐-­‐>  a6dd4adbb425  Successfully  built  a6dd4adbb425    docker  images  REPOSITORY                                      TAG                                  IMAGE  ID                        CREATED                          VIRTUAL  SIZE  <none>                                              <none>                            a6dd4adbb425                8  minutes  ago              297.2  MB  

Page 53: Docking your services_with_docker

Docker tag & push docker  tag  a6dd4adbb425  localhost:5000/redis_hagzag      docker  push  localhost:5000/redis_hagzag  The  push  refers  to  a  repository  [localhost:5000/redis_hagzag]  (len:  1)  Sending  image  list  Pushing  repository  localhost:5000/redis_hagzag  (1  tags)  27cf78414709:  Image  successfully  pushed  b750fe79269d:  Image  successfully  pushed  46a6f0556e96:  Image  successfully  pushed  ba4030995701:  Image  successfully  pushed  6fdf06372117:  Image  successfully  pushed  a6dd4adbb425:  Image  successfully  pushed  Pushing  tags  for  rev  [a6dd4adbb425]  on  {hgp://localhost:5000/v1/repositories/redis_hagzag/tags/latest}  

Page 54: Docking your services_with_docker

The Deployment workflow

●  Provide docker-registry service / interface ●  Monitoring & Logging facilities ●  Data binding / persistent configuration

Page 55: Docking your services_with_docker

Docker  Our service

Host  /  VM    

•  Using  –name  &  -­‐link  •  Linking  containers  by  

reference  (not  ip)  

build  run  +  -­‐name,  build  run  +  -­‐link  tag  =  complete  “.service”  on  a  single  node  

Page 56: Docking your services_with_docker

Docker run & ps docker  run  -­‐name  redis  -­‐d  a6dd4adbb425        docker  ps  CONTAINER  ID                IMAGE                              COMMAND                                CREATED                          STATUS                            PORTS                                        NAMES  9026507ef675                a6dd4adbb425    /usr/bin/redis-­‐serve      12  minutes  ago            Up  12  minutes              6379/tcp                                  redis  7e88dcb96856                registry:0.6.1            /bin/sh  -­‐c  cd  /docke      9  days  ago                    Up  40  minutes              0.0.0.0:5000-­‐>5000/tcp      condescending_thompson    

Page 57: Docking your services_with_docker

Docker inspect docker  inspect  redis        

Page 58: Docking your services_with_docker

What we achieved ?

In container responsibility ●  Latest code ●  Dependencies

Out container responsibility ●  Security & Remote access ●  Logging ●  Monitoring ●  Networking

take  tag  “latest”  of  app  A  

docker  push  <reg-­‐name>/app-­‐1   docker  pull  <reg-­‐name>/app-­‐1  

Immutability ? - not just yet … but we are getting close

Page 59: Docking your services_with_docker

Evolving with Docker

OpsEnv  

•  FIG  •  Vagrant  –  buggy  •  Chef-­‐docker  (hgps://github.com/bflad/chef-­‐docker)    •  Chef  Docker  registry  (hgp://community.opscode.com/cookbooks/docker-­‐registry)    

DevEnv  

•  Chef-­‐docker  (hgps://github.com/bflad/chef-­‐docker)    

•  Chef  Docker  registry  (hgp://community.opscode.com/cookbooks/docker-­‐registry)    

•  Puppet  docker  (hgp://forge.puppetlabs.com/garethr/docker)    

•  DOTCLOUDS  (focke  authors)  –  About  to  base  PASS  based  on  Docker  

Page 60: Docking your services_with_docker

Search for “Dockerfile”

Page 61: Docking your services_with_docker

A nodejs container …

Page 62: Docking your services_with_docker

Heroku like with Docker = Dokku

hgps://github.com/progrium/dokku  

Page 63: Docking your services_with_docker

Heroku like with LXC + Chef = Diez

hgps://github.com/opdemand/deis  

hgp://deis.io/  

Page 64: Docking your services_with_docker

text

To Summarize •  Very promising & almost J production ready •  A great complementary to existing CM tooling •  Simplifies deployment (I know it doesn’t seem so)  

Page 65: Docking your services_with_docker

Thank You

Haggai  Philip  Zagury  Email:  [email protected]  


Recommended