Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby and Docker on Rails

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.

Muriel Salvan

February 04, 2014
Tweet

Other Decks in Technology

Transcript

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

    View Slide

  2. Who am I?

    View Slide

  3. Muriel Salvan
    Freelance Developer
    Founder of X-Aeon Solutions
    Open Source advocate
    Ruby / Rails expert
    Co-founder of RivieraRB

    View Slide

  4. @MurielSalvan
    Github
    SourceForge
    My tech blog
    [email protected]

    View Slide

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

    View Slide

  6. "I want my piano to be delivered
    from Nice to London"

    View Slide

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

    View Slide

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

    View Slide

  9. How ?

    View Slide

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

    View Slide

  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)

    View Slide

  12. View Slide

  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

    View Slide

  14. View Slide

  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?

    View Slide

  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

    View Slide

  17. So what does Docker bring?

    View Slide

  18. 1- File systems images

    Structured in layers (storing diffs only)

    Layers are reused between images
    Clever!

    View Slide

  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!

    View Slide

  20. 3- A public repository of images

    Pull and push images

    Build them from Github projects

    Be part of a great community!

    View Slide

  21. "Is it a yet-another-virtualization-
    solution?"

    View Slide

  22. No.

    View Slide


  23. Processes run by Docker
    share the host Kernel

    No device emulation

    No boot sequence

    Architectures and platforms
    between Host and containers
    must match

    View Slide

  24. "So where is the portability?"

    View Slide


  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...

    View Slide

  26. It's blazingly fast!!!
    A few ms to load the container and run the
    command

    View Slide

  27. Use cases

    View Slide

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

    View Slide

  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!

    View Slide

  30. Deployments become sooo easy
    Like "push"-and-"pull"-easy!

    View Slide

  31. Lightweight virtualization too

    View Slide

  32. View Slide

  33. "How do we create images?"

    View Slide

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

    View Slide

  35. # Nginx
    #
    # VERSION 0.0.1
    FROM ubuntu
    MAINTAINER Guillaume J. Charmes

    # 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

    View Slide

  36. docker build .
    Docker file
    Image

    View Slide

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

    View Slide

  38. docker run
    Image
    Container
    running

    View Slide

  39. "I want to create a modified image"

    View Slide

  40. docker commit
    Image
    Container

    View Slide

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

    View Slide

  42. docker push
    Image
    Registry
    Defaults to
    http://index.docker.io

    View Slide

  43. "And now my friend wants to get my
    wonderful image to play with!"
    Yeah, sure... whatever

    View Slide

  44. docker search
    docker pull
    Image
    Registry

    View Slide

  45. View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  49. 1. Create a Ruby image:
    murielsalvan/ruby

    From ubuntu base image

    Using a Dockerfile

    Bonus: Upload it to index.docker.io via Github

    View Slide

  50. # Ruby environment
    #
    # VERSION 0.2
    FROM ubuntu
    MAINTAINER Muriel Salvan
    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

    View Slide

  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

    View Slide

  52. 3. Launch n docker containers from
    murielsalvan/server

    Map each container port 3000 to host ports 5000+i

    View Slide

  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

    View Slide

  54. 5. Launch 1 docker container from
    murielsalvan/proxy

    Map its guest port 3000 to host port 3000

    View Slide

  55. 6. Target localhost:3000

    View Slide

  56. 7. Profit!

    View Slide

  57. View Slide

  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!

    View Slide

  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

    View Slide

  60. NOT BAD

    View Slide

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

    View Slide

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

    View Slide