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

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

    advocate Ruby / Rails expert Co-founder of RivieraRB
  2. 9.
  3. 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)
  4. 12.
  5. 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
  6. 14.
  7. 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?
  8. 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
  9. 18.

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

    only) • Layers are reused between images Clever!
  10. 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!
  11. 20.

    3- A public repository of images • Pull and push

    images • Build them from Github projects • Be part of a great community!
  12. 22.

    No.

  13. 23.

    • Processes run by Docker share the host Kernel •

    No device emulation • No boot sequence • Architectures and platforms between Host and containers must match
  14. 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...
  15. 27.
  16. 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!
  17. 32.
  18. 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
  19. 43.

    "And now my friend wants to get my wonderful image

    to play with!" Yeah, sure... whatever
  20. 45.
  21. 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
  22. 49.

    1. Create a Ruby image: murielsalvan/ruby • From ubuntu base

    image • Using a Dockerfile • Bonus: Upload it to index.docker.io via Github
  23. 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
  24. 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
  25. 52.
  26. 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
  27. 57.
  28. 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!
  29. 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
  30. 60.