Slide 1

Slide 1 text

Docker for Rubyists Miami Ruby Brigade Oct. 16, 2017

Slide 2

Slide 2 text

Rails in 2005 • Compile Ruby from source • Install Rubygems separately • Choose your own adventure: • CGI (slow) • FastCGI (quite miserable to set up) • App server (fast, low-grade miserable to set up) • Configure database • Figure out gem dependencies

Slide 3

Slide 3 text

Rails in 2017 • Choose your own install Ruby adventure • rbenv • chruby • rvm • PPA • source • Configure database • Install dependencies

Slide 4

Slide 4 text

Better, Not Great • lotta configuration • need to script it • ideally dev and prod are same

Slide 5

Slide 5 text

Configuration Management • Makes setting stuff up repeatable • Good for production • Less-good for development

Slide 6

Slide 6 text

Vagrant • Makes setting up a VM repeatable • Good but slow for development • Less common in production

Slide 7

Slide 7 text

Docker • Good for development • Good and common in production • Plenty fast • Lots of work is done

Slide 8

Slide 8 text

Let's Dockerize Greatjobify

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Greatjobify • Sinatra • ImageMagick

Slide 11

Slide 11 text

Greatjobify 1. Pick base image 2. Add OS packages 3. Create and change to app directory 4. Add Gemfile and Gemfile.lock 5. Bundle 6. Add rest of app 7. Run it

Slide 12

Slide 12 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"]

Slide 13

Slide 13 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Base image

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] OS packages

Slide 16

Slide 16 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Create and change to app directory

Slide 17

Slide 17 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Add Gemfile and Gemfile.lock

Slide 18

Slide 18 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Bundle

Slide 19

Slide 19 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Add rest of the app

Slide 20

Slide 20 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Declare a listening port

Slide 21

Slide 21 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"] Command to run

Slide 22

Slide 22 text

Dockerfile FROM ruby:2.4.1 
 RUN apt-get update -qq && \ 
 apt-get install -y build-essential imagemagick 
 RUN mkdir /greatjobify 
 WORKDIR /greatjobify 
 ADD Gemfile* /greatjobify/ 
 RUN bundle install 
 ADD . /greatjobify 
 EXPOSE 9292 
 CMD ["unicorn", "-p", "9292"]

Slide 23

Slide 23 text

Building the Image docker build -t greatjobify . Name it "greatjobify"

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

And there it is

Slide 27

Slide 27 text

Running it docker run --rm -p 9292:9292 -it greatjobify Remove the instance afterwards Forward instance port 9292 to host port 9292 Keep stdio open and hook it up here The image to run

Slide 28

Slide 28 text

tfw you don't update your apps more than a couple times per decade

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

External Services greatjobify has an optional dependency on memcache

Slide 32

Slide 32 text

External Services • Instances can run multiple processes • Instances should be single-purpose • Horizontal scalability • Orchestrate several instances to work together

Slide 33

Slide 33 text

Docker Compose "Orchestration"

Slide 34

Slide 34 text

docker-compose.yml • Describe each instance that you need • base image or build directory • mounted volumes • dependencies • open ports • commands • environment variables

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

web.rb (snippet) memcache_address = ENV['MEMCACHIER_SERVERS'] || 'localhost:11211' 
 memcache = [ 
 memcache_address, 
 { 
 username: ENV['MEMCACHIER_USERNAME'] || nil, 
 password: ENV['MEMCACHIER_PASSWORD'] || nil 
 } 
 ] 
 dalli = Dalli::Client.new *memcache 
 
 use Rack::Cache, 
 :metastore => dalli, 
 :entitystore => dalli

Slide 37

Slide 37 text

docker-compose.yml • Web service • Build the current directory • Expose 9292 • Depend on memcached service • Set MEMCACHIER_SERVERS environment variable • Memcached service • Use the "memcached" image

Slide 38

Slide 38 text

docker-compose.yml version: '3' 
 services: 
 web: 
 build: . 
 ports: 
 - "9292:9292" 
 depends_on: 
 - memcached 
 environment: 
 - MEMCACHIER_SERVERS=memcached 
 memcached: 
 image: memcached

Slide 39

Slide 39 text

Running It docker-compose up

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

Rails App • Similar to Sinatra • Web process • Db processes • Support processes • Database console • App console

Slide 46

Slide 46 text

Docker in Production • Google Container Engine • AWS Elastic beanstalk • Heroku Container Registry

Slide 47

Slide 47 text

Docker in Production • Docker Swarm • Kubernetes