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 SalvanRuby/Rails expert, Founder of X-Aeon Solutions at X-Aeon Solutions
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)
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
15. Static website
Do services and apps
User DB
Queue
interact appropriately?
Web frontend
Background workers
Development VM
Analytics DB
API endpoint
Production Cluster
Public Cloud
QA Can I migrate smoothly and
server
Disaster recovery Contributor’s laptop
quickly?
Customer Data Center
Production Servers
16. Static website
User DB
Queue
Analytics DB
Background workers
API endpoint
Web frontend
Production Cluster
QA server
Customer Data Center
Development VM
Disaster recovery
Production Servers
Contributor’s laptop
Public Cloud
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)
It's chroot on steroids!
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
●
20. 3- A public repository of images
Pull and push images
● Build them from Github projects
● Be part of a great community!
●
23. Processes run by Docker
share the host Kernel
● No device emulation
● No boot sequence
● Architectures and platforms
between Host and containers
must match
●
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...
●
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!
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
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
58. Elapsed time (s) on Fibonacci computation
Sponsored by the
WTF effect!
50
45
40
35
30
Launch time
Execution time
25
20
15
10
5
0
Without Docker
With Docker
59. Memory consumption per container (kB)
180000
160000
140000
120000
Rails
Linux container
100000
80000
60000
40000
20000
0
RSS
VSZ
The Linux container memory is always the same whatever the process in the container:
1,5MB RSS and 32MB VSZ