SlideShare a Scribd company logo
Building  Rails  
Applications  with  
Docker
Laura Frank @rhein_wein
Software Engineer @codeship
Today’s  Agenda
• An introduction to containers: what are they, and what
makes them different from virtual machines?
• The Docker ecosystem
• Working with Docker on a Rails project
2
An  Introduction  to  
Containerization
Rails Applications with Docker
Docker  !=  containers
Docker  manages  containers
• Builds images to run as containers
• Can manage entire applications with docker-compose
• Provision machines with docker-machine
6
A container is a virtualization layer
— sort of like a VM — but with
some fundamental differences
Containers
• Run in a self-contained execution environment
• Share the kernel of host system
• Are isolated from other containers
• Have fast boot times & low overhead
8
infrastructure
host OS
hypervisor
$
guest OS
libraries
service 0
$ guest OS $ guest OS
libraries
service 2
libraries
service 1
libraries librarieslibraries
infrastructure
host OS
service 0 service 2service 1
host OS
libraries librarieslibraries
infrastructure
container runtime engine
service 0 service 2service 1
Getting started with containers may
initially seem more complex…
…But they greatly reduce the
amount of time and space needed
to run your application
Spend less time provisioning,
rebooting, and fighting with
dependencies, and more time building
what you want.
TL;DR
The  Docker  Ecosystem  
Build Ship Run
Docker  Images
Are images containers?
No… an image is like a class, and a container is an
instance of that class
The  Docker  Hub
19
• ~15,000 images that you can pull down and use in your
own projects
• Also includes additional features like webhooks, build
triggers, authentication, and private repositories
• Use either the web GUI or the CLI — familiar workflow
of login, push, pull, search, etc.
The  Docker  Hub
Different  Types  of  Images
• Service: self-contained images that provide a self-
contained service out-of-the-box. Postgres, MySQL.
• Project Base: intended to serve as a base for your own
project; do not directly provide a service. Ruby, golang.
• Official Images: maintained by the organization/
company themselves (i.e. the official Rails image)
• Build them yourself by creating a Dockerfile
• docker	
  build	
  -­‐t	
  image_name	
  .	
  	
  

#	
  don’t	
  forget	
  the	
  dot!	
  
• run docker	
  images	
  to see all of the images you’ve
downloaded or built
Your  Own  Docker  Images
A  Rails  Dockerfile
FROM rails:4.2.4
MAINTAINER Laura Frank <laura@codeship.com>
RUN mkdir -p /var/app
COPY . /var/app
WORKDIR /var/app
RUN bundle install
CMD rails s -b 0.0.0.0
set versions here
Use the Docker Hub to find and
store images to use in your project.
Use Docker Compose to build it.
Docker  Compose
25
Building  Your  First  Rails  
App  with  Docker
Installing  Docker
• The old way: boot2docker
• The new way: Docker Toolbox
• Docker Client, Machine, Engine, Compose (on a Mac),
Kitematic, and Virtual Box
• You can migrate your boot2docker VM to a Docker
Machine machine — check the docs
Installing  Docker
🐳  docker.com/toolbox
Development  Goals
Run a Rails app in a container, so that a developer can:
• view the app running in the browser
• edit files in a local environment and see the changes
• run rake tasks like migrations
• see log output
Remember  This?
FROM rails:4.2.4
MAINTAINER Laura Frank <laura@codeship.com>
RUN mkdir -p /var/app
COPY Gemfile /var/app/Gemfile
WORKDIR /var/app
RUN bundle install
CMD rails s -b 0.0.0.0
Rails Applications with Docker
🚉 🐘
A  Multi-­‐Container  Rails  App
Rails  App Postgres
❤
How can I get containerized services to
communicate with one another?container linking, environment variables…
and of course, a little config sugar
Docker Compose makes this easy.
db:	
  
	
  	
  image:	
  postgres	
  
web:	
  
	
  	
  build:	
  .	
  
	
  	
  command:	
  bundle	
  exec	
  rails	
  s	
  -­‐p	
  3000	
  -­‐b	
  '0.0.0.0'	
  
	
  	
  volumes:	
  
	
  	
  	
  	
  -­‐	
  .:/var/app	
  
	
  	
  ports:	
  
	
  	
  	
  	
  -­‐	
  '3333:3000'	
  
	
  	
  links:	
  
	
  	
  	
  	
  -­‐	
  db
docker-­‐compose.yml
development:	
  &default	
  
	
  	
  adapter:	
  postgresql	
  
	
  	
  encoding:	
  unicode	
  
	
  	
  database:	
  postgres	
  
	
  	
  pool:	
  5	
  
	
  	
  username:	
  postgres	
  
	
  	
  password:	
  
	
  	
  host:	
  db
config/database.yml
Rails Applications with Docker
Ship  It
A simple CI/CD workflow would include
• running tests
• building a new Docker image
• pushing that image to a registry
• firing up containers with the new image
#alwayskeepshipping
thanks!

More Related Content

Rails Applications with Docker