$30 off During Our Annual Pro Sale. View Details »

Packaging and Shipping Rails Applications in Docker

Packaging and Shipping Rails Applications in Docker

You’re very happy as a Rails developer for drinking the Docker kool-aid. You just need to toss a Docker image to your Ops team and you're done! However, like all software projects, your Docker containers start to decay. Deployment takes days to occur as you download your gigantic Docker image to production. Everything’s on fire and you can’t launch the rails console inside your Docker container. Isn’t Docker supposed to take all these things away?
Engine Yard sponsored presentation at Railsconf 2016 (http://railsconf.com/program/sessions#prop_2166)

In this talk, I will discuss some Docker optimizations and performance tuning techniques to keep your Rails packaging and shipping pipeline in shape.

Allan Espinosa

May 05, 2016
Tweet

More Decks by Allan Espinosa

Other Decks in Technology

Transcript

  1. Rails Deployments
    in Docker
    @AllanEspinosa

    View Slide

  2. View Slide

  3. View Slide

  4. Optimization
    refactoring
    tuning middleware
    instrumention
    scaling

    View Slide

  5. Build

    View Slide

  6. RAILS "BINARIES"
    gem build
    git ls-files
    gem install -g
    rake assets:compile

    View Slide

  7. Build
    Machine docker push
    Docker
    Registry

    View Slide

  8. .
    ├── Dockerfile
    ├── Gemfile
    ├── Gemfile.lock
    ├── Rakefile
    ├── config.ru
    ├── app
    │ ├── assets
    │ │ └── ...
    │ ├── controllers
    │ │ └── ...
    │ ├── models
    │ │ ├── ...
    │ └── views
    │ └── ...
    └── ...

    View Slide

  9. FROM ruby:2.2
    WORKDIR /app
    ADD . /app
    RUN bundle install
    CMD "/app/bin/rails server"

    View Slide

  10. $ docker build -t aespinosa/railsapp .
    Sending build context to Docker daemon 3.072 kB
    Step 1 : FROM ruby:2.2
    ---> 8194a282d610
    Step 2 : ADD . /app
    ---> f6698d506f88
    Removing intermediate container 13078ea76192
    Step 3 : WORKDIR /app
    ---> Running in a32412844f51
    ---> 6608761a2632
    Removing intermediate container a32412844f51
    Step 4 : RUN bundle install
    ---> Running in 6492eb0f193b
    Fetching gem metadata from https://rubygems.org/..............
    Fetching version metadata from https://rubygems.org/..
    Resolving dependencies...
    Installing mini_portile2 2.0.0
    Installing rack 1.6.4
    Using bundler 1.11.2
    Installing nokogiri 1.6.7.2 with native extensions
    Bundle complete! 2 Gemfile dependencies, 4 gems now installed.
    Bundled gems are installed into /usr/local/bundle.
    ---> b6833ef95104
    Removing intermediate container 6492eb0f193b
    Step 5 : CMD "/app/bin/rails server"
    ---> Running in b9a83287aaee
    ---> 7d51adaf1672

    View Slide

  11. Back to Project
    Status
    Changes
    Console Output
    Edit Build Information
    Delete Build
    Git Build Data
    No Tags
    Docker Fingerprints
    Replay
    Pipeline Steps
    Next Build
    search
    Build #12 (Apr 29, 2016 9:00:58 AM)
    add description
    Started by anonymous user
    Revision: 798dbe54c3baa6fe77f45df50820ff0c31a3ccfd
    refs/remotes/origin/master
    Page generated: May 6, 2016 1:44:10 AM JST REST API Jenkins ver. 2.0-alpha-3
    Started 6 days 16 hr ago
    Took 1 min 26 sec
    Jenkins LongBuild #12 ENABLE AUTO REFRESH
    Initial build

    View Slide

  12. Back to Project
    Status
    Changes
    Console Output
    Edit Build Information
    Delete Build
    Git Build Data
    No Tags
    Docker Fingerprints
    Replay
    Pipeline Steps
    Previous Build
    Next Build
    search
    Build #13 (Apr 29, 2016 10:17:38 AM)
    add description
    Started by anonymous user
    Revision: 798dbe54c3baa6fe77f45df50820ff0c31a3ccfd
    refs/remotes/origin/master
    Page generated: May 6, 2016 1:44:11 AM JST REST API Jenkins ver. 2.0-alpha-3
    Started 6 days 15 hr ago
    Took 1.1 sec
    Jenkins LongBuild #13 ENABLE AUTO REFRESH
    Rebuild

    View Slide

  13. Step 1 : FROM ruby:2.2
    ---> 8194a282d610
    Step 2 : ADD . /app
    ---> Using cache
    ---> b69a81db78c3
    Step 3 : WORKDIR /app
    ---> Using cache
    ---> f0599cf4359a
    Step 4 : RUN bundle install
    ---> Using cache
    ---> e02f0984472c
    Step 5 : CMD "/app/bin/rails server"
    ---> Using cache
    ---> fe6f97f6bf7b
    Successfully built fe6f97f6bf7b

    View Slide

  14. Back to Project
    Status
    Changes
    Console Output
    Edit Build Information
    Delete Build
    Git Build Data
    No Tags
    Docker Fingerprints
    Replay
    Pipeline Steps
    Previous Build
    search
    Build #14 (Apr 29, 2016 10:18:00 AM)
    add description
    Changes
    1. Build (detail)
    Started by anonymous user
    Revision: 773689707fdb26bf2e2bb7850cf91df684cf124e
    refs/remotes/origin/master
    Page generated: May 6, 2016 1:44:13 AM JST REST API Jenkins ver. 2.0-alpha-3
    Started 6 days 15 hr ago
    Took 1 min 24 sec
    Jenkins LongBuild #14 ENABLE AUTO REFRESH
    Same long build

    View Slide

  15. Step 1 : FROM ruby:2.2
    ---> 8194a282d610
    Step 2 : ADD . /app
    ---> a65c9a2d64eb
    Removing intermediate container cbfe5669ad3d
    Step 3 : WORKDIR /app
    ---> Running in 2427b73eac8e
    ---> 1efdd0eb9fdb
    Removing intermediate container 2427b73eac8e
    Step 4 : RUN bundle install
    ---> Running in 8616bef9cf30
    Fetching gem metadata from https://rubygems.org/..............
    Fetching version metadata from https://rubygems.org/..
    Resolving dependencies...
    Installing mini_portile2 2.0.0
    Installing rack 1.6.4
    Using bundler 1.11.2
    Installing nokogiri 1.6.7.2 with native extensions
    Bundle complete! 2 Gemfile dependencies, 4 gems now installed.
    Bundled gems are installed into /usr/local/bundle.
    ---> b4fa6a4dd2ac
    Removing intermediate container 8616bef9cf30
    Step 5 : CMD "/app/bin/rails server"
    ---> Running in f74eed113754
    ---> 482e16d4751d
    Removing intermediate container f74eed113754
    Successfully built 482e16d4751d

    View Slide

  16. Build optimization
    FROM ruby:2.2
    ADD Gemfile /app/Gemfile
    WORKDIR /app
    RUN bundle install
    ADD . /app
    CMD "/app/bin/rails server"

    View Slide

  17. Back to Project
    Status
    Changes
    Console Output
    Edit Build Information
    Delete Build
    Git Build Data
    No Tags
    Docker Fingerprints
    Replay
    Pipeline Steps
    Next Build
    search
    Build #3 (Apr 29, 2016 11:17:15 AM)
    add description
    Started by anonymous user
    Revision: 8f3fd364a8d461ceeb78e0e8a303780bca5983b5
    refs/remotes/origin/master
    Page generated: May 6, 2016 1:44:10 AM JST REST API Jenkins ver. 2.0-alpha-3
    Started 6 days 14 hr ago
    Took 1 min 28 sec
    Jenkins OptimizedBuild #3 ENABLE AUTO REFRESH

    View Slide

  18. Back to Project
    Status
    Changes
    Console Output
    Edit Build Information
    Delete Build
    Git Build Data
    No Tags
    Docker Fingerprints
    Replay
    Pipeline Steps
    Previous Build
    search
    Build #4 (Apr 29, 2016 12:14:05 PM)
    add description
    Changes
    1. Build (detail)
    Started by anonymous user
    Revision: a5f685749b6178299dcc88bfc132216880fbd095
    refs/remotes/origin/master
    Page generated: May 6, 2016 1:44:18 AM JST REST API Jenkins ver. 2.0-alpha-3
    Started 6 days 13 hr ago
    Took 2 sec
    Jenkins OptimizedBuild #4 ENABLE AUTO REFRESH

    View Slide

  19. Dependencies cached
    Step 1 : FROM ruby:2.2
    ---> 8194a282d610
    Step 2 : WORKDIR /app
    ---> Using cache
    ---> 224e3b91e357
    Step 3 : ADD Gemfile /app/Gemfile
    ---> Using cache
    ---> 8db9245c0442
    Step 4 : RUN bundle install
    ---> Using cache
    ---> 509d037aeb77
    Step 5 : ADD . /app
    ---> d7bbd2ad37d2
    Removing intermediate container 940d4a0e6090
    Step 6 : CMD "/app/bin/rails server"
    ---> Running in c29b624574dd
    ---> f1a649fa6eff
    Removing intermediate container c29b624574dd
    Successfully built f1a649fa6eff

    View Slide

  20. Feedback

    View Slide

  21. Deployment

    View Slide

  22. Source https://josephscott.org/archives/2012/05/deploying-is-the-new-compiling/

    View Slide

  23. Never in
    production!
    git clone ...
    bundle install --deployment

    View Slide

  24. Docker
    Registry docker pull
    Server
    Farm

    View Slide

  25. View Slide

  26. rubygems.org
    Docker Hub
    APT
    jessie main
    Your Application Customers

    View Slide

  27. rubygems.org
    Docker Hub
    APT
    jessie main
    rubygems.org
    mirror
    Proxy Registry
    APT mirror
    Your Application
    Your Environment

    View Slide

  28. bundle config mirror.https://rubygems.org http://rubygems-mirror.dev
    # ~/.bundle/config
    ---
    BUNDLE_MIRROR__HTTPS://RUBYGEMS__ORG/: http://rubygems-mirror.dev
    gem sources --remove https://rubygems.org
    gem sources --add http://rubygems-mirror.dev

    View Slide

  29. View Slide

  30. Conclusion
    no magic
    coping with change
    operability

    View Slide

  31. Thank you
     @engineyard

    View Slide