Ruby and Docker on Rails

38e4ddd3dc7770cc1e47164dc50debd7?s=47 Muriel Salvan
February 04, 2014

Ruby and Docker on Rails

Quick overview of Docker and its usage.
Illustrated with a cluster of Rails applications and a Ruby load balancing proxy on top of them.
This presentation was made during the rivierarb meetup in Sophia-Antipolis on 2014 Feb 04th by Muriel Salvan.

38e4ddd3dc7770cc1e47164dc50debd7?s=128

Muriel Salvan

February 04, 2014
Tweet

Transcript

  1. Ruby and on Rails Muriel Salvan X-Aeon Solutions Feb 04th

    2014 Riviera.rb
  2. Who am I?

  3. Muriel Salvan Freelance Developer Founder of X-Aeon Solutions Open Source

    advocate Ruby / Rails expert Co-founder of RivieraRB
  4. @MurielSalvan Github SourceForge My tech blog Muriel@X-Aeon.com

  5. Let's talk about cargo transport (that's why you came here,

    right?)
  6. "I want my piano to be delivered from Nice to

    London"
  7. "I also want my barrel of wine delivered from Nice

    to London."
  8. "Hey! Don't forget my bags of rice too!"

  9. How ?

  10. "By train, plane, boat, truck, bus, mule, or whatever!"

  11. Do I worry about how goods interact (e.g. coffee beans

    next to spices) Can I transport quickly and smoothly (e.g. from boat to train to truck)
  12. None
  13. A standard container that is loaded with virtually any goods,

    and stays sealed until it reaches final delivery. …in between, can be loaded and unloaded, stacked, transported efficiently over long distances, and transferred from one mode of transport to another
  14. None
  15. Static website Web frontend User DB Queue Analytics DB Background

    workers API endpoint Development VM QA server Public Cloud Disaster recovery Contributor’s laptop Production Servers Production Cluster Customer Data Center Do services and apps interact appropriately? Can I migrate smoothly and quickly?
  16. Static website Web frontend User DB Queue Analytics DB Background

    workers API endpoint Development VM QA server Public Cloud Disaster recovery Contributor’s laptop Production Servers Production Cluster Customer Data Center
  17. So what does Docker bring?

  18. 1- File systems images • Structured in layers (storing diffs

    only) • Layers are reused between images Clever!
  19. 2- Processes run in a contained environment (containers) • Using

    images' file systems (isolated like in chroot) • In a separate process space (using Linux containers) • With a specific network interface • Can run as root It's chroot on steroids!
  20. 3- A public repository of images • Pull and push

    images • Build them from Github projects • Be part of a great community!
  21. "Is it a yet-another-virtualization- solution?"

  22. No.

  23. • Processes run by Docker share the host Kernel •

    No device emulation • No boot sequence • Architectures and platforms between Host and containers must match
  24. "So where is the portability?"

  25. • Containers can be run on any Kernel (>= 3.8,

    Linux 64b only for now) • Whatever the Linux distro • If it runs on the Host, it can run from a container • Physical, virtual, cloud...
  26. It's blazingly fast!!! A few ms to load the container

    and run the command
  27. Use cases

  28. Get running clusters on a single host Awesome to test

    them!
  29. Ensure the environment your process runs in is the same

    in dev, test and prod Bring your environment along with your process. Sandboxes everywhere! You'll love that!
  30. Deployments become sooo easy Like "push"-and-"pull"-easy!

  31. Lightweight virtualization too

  32. None
  33. "How do we create images?"

  34. Docker files Describe commands to be run to create an

    image
  35. # Nginx # # VERSION 0.0.1 FROM ubuntu MAINTAINER Guillaume

    J. Charmes <guillaume@dotcloud.com> # make sure the package repository is up to date RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y inotify-tools nginx apache2 openssh-server
  36. docker build . Docker file Image

  37. "And how do we run a process in a container?"

  38. docker run <image> <cmd> Image Container running <Cmd>

  39. "I want to create a modified image"

  40. docker commit <container> <image name> Image Container

  41. "Hey! I want to deploy my image for the world

    to see!"
  42. docker push <image> Image Registry Defaults to http://index.docker.io

  43. "And now my friend wants to get my wonderful image

    to play with!" Yeah, sure... whatever
  44. docker search <image name> docker pull <image> Image Registry

  45. None
  46. "Wasn't that supposed to be a Ruby meetup?"

  47. Let's simulate a Rails cluster with a balancing Ruby proxy

    in front!
  48. Docker container B Docker container B Docker container B Docker

    container B Docker container B Docker container A 3000 3000 3000 3000 3000 5000 5001 5002 5003 5004 3000
  49. 1. Create a Ruby image: murielsalvan/ruby • From ubuntu base

    image • Using a Dockerfile • Bonus: Upload it to index.docker.io via Github
  50. # Ruby environment # # VERSION 0.2 FROM ubuntu MAINTAINER

    Muriel Salvan <muriel@x-aeon.com> RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev ADD http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.0.tar.gz /tmp/ RUN cd /tmp && \ tar -xzf ruby-2.1.0.tar.gz && \ cd ruby-2.1.0 && \ ./configure && \ make && \ make install && \ cd .. && \ rm -rf ruby-2.1.0 && \ rm -f ruby-2.1.0.tar.gz
  51. 2. Create a Rails server image: murielsalvan/server • From murielsalvan/ruby

    base image • Using an interactive bash in a container to install and configure the Rails application • Add a startup command: rails s • Open default port 3000
  52. 3. Launch n docker containers from murielsalvan/server • Map each

    container port 3000 to host ports 5000+i
  53. 4. Create a new image for the Ruby proxy: murielsalvan/proxy

    • Based on murielsalvan/ruby • Using an interactive bash to install and use em-proxy, targetting servers on ports 5000+i • Add a startup command: ruby -w balancing.rb • Open port 3000
  54. 5. Launch 1 docker container from murielsalvan/proxy • Map its

    guest port 3000 to host port 3000
  55. 6. Target localhost:3000

  56. 7. Profit!

  57. None
  58. Without Docker With Docker 0 5 10 15 20 25

    30 35 40 45 50 Elapsed time (s) on Fibonacci computation Launch time Execution time Sponsored by the WTF effect!
  59. RSS VSZ 0 20000 40000 60000 80000 100000 120000 140000

    160000 180000 Memory consumption per container (kB) Rails Linux container The Linux container memory is always the same whatever the process in the container: 1,5MB RSS and 32MB VSZ
  60. NOT BAD

  61. Links Homepage Index of Docker images Dockerfile reference Getting started

  62. Source: xkcd That's all, folks! Thanks for attending!