Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Containerizing PHP Applications (True North PHP 2016)

Josh Butts
November 03, 2016

Containerizing PHP Applications (True North PHP 2016)

Lets face it, Docker is hot right now. If you’re itching to get started but aren’t sure how, you’ve come to the right place. In this tutorial, we’ll spend some time going over basic Docker concepts like Dockerfiles, containers, images and registries. Then we’ll look at some sample applications including Wordpress, Drupal and some framework-based examples and talk about strategies for building Docker images for these various different scenarios. We’ll also cover how to handle external dependencies such as file storage, databases, caches in both development and production environments.

Josh Butts

November 03, 2016

More Decks by Josh Butts

Other Decks in Technology


  1. About Me • VP of Engineering
 at Offers.com • Austin

    PHP Organizer • github.com/jimbojsb • @jimbojsb 2
  2. 3

  3. About Offers.com • We help people save money • Launched

    in 2009 • 200k lines of PHP across several apps • Billions of requests / month • Runs entirely in Docker 4
  4. Agenda In No Particular Order • What is Docker •

    Docker Terminology • Running Docker in Dev vs Prod • Docker CLI tools • Anatomy of a Dockerfile • Building a Dockerfile for PHP apps • Wordpress Example • Laravel Example • Docker orchestration • Docker Compose • Registries & Sharing Containers
  5. What is Docker? • Docker allows you to package applications

    with infrastructure • Docker uses Linux kernel container technology • Docker is well suited for distributed and highly available applications 10
  6. Who Cares? • Docker allows engineers to choose exactly the

    stack for any app • Containers run anywhere that runs Docker • Ops focuses on infrastructure instead of stacks 12
  7. Docker Dictionary - Container • Container • A running instance

    of your app and it’s complete software stack • You might have many identical containers running • Often runs just one process 13
  8. Docker Dictionary - Image • An image is the compiled

    distributable version of your app and it’s stack • Images are built from Dockerfiles • You can start many containers from the same image 14
  9. Docker Dictionary - Layer • Docker uses a layering system

    to optimize storage • Each line in your Dockerfile is a layer • Many layers make up an image • Images share common layers where possible 15
  10. Docker Dictionary - Dockerfile • The Dockerfile is a text

    file that lives in your project root • Describes how to build your image • Installs software packages, configures runtimes, etc • Tells Docker what command to run and what ports to open 16
  11. Docker Dictionary - Registry • A server that stores images

    • Provides organization and authentication as needed • Facilitates sharing of pre-built images • Example: DockerHub, Amazon ECR 17
  12. The Docker Binary • Both the CLI client and the

    server • Written in Go • Speaks REST-ish over Unix socket or TCP/SSL • CLI and server can be on different hosts 18
  13. How Containers Run • Docker daemon runs as root and

    starts containers • Containers are basically stateless • Can expose local storage if you need to • Can’t see each other’s files • State is gone on exit 20
  14. Outsource your Persistence • Cloud (AWS) example: • RDS for

    database storage • Sessions in Memcached or Redis • File storage in S3 • This may require changes to your app! 21
  15. Docker vs Virtualization • Docker is lightweight • No overhead

    of a guest OS • Docker can be controlled / contained by systemd and cgroups 22
  16. Running the Docker Daemon • Unless you’re running Linux, you

    need a VM (i.e. dev environment) • For MacOS / Windows, Docker provides a VM tool • docker -d 24
  17. A Word on the Control OS • Any modern Linux

    should be able to run Docker • I personally don’t recommend Ubuntu • CoreOS is a small Linux distro that is designed to run Docker in production 25
  18. Typical Non-Linux Setup 26 MacOS Projects / Source Code VM

    Linux Docker Daemon Containers Containers Containers Containers Docker CLI
  19. Naming Containers • Containers get a name • It’s different

    from the name of the image • It’s dumb by default • use --name 29
  20. Dockerfiles • FROM - specify your base image • RUN

    - run commands in the context • ADD - put your files in • EXPOSE - listen on ports • ENV - set environment vars • VOLUME - persistent storage 30
  21. Building Images from Dockerfiles • docker build . • use

    -t to give it a repo / tag • docker images to see what’s available on your system • docker rmi to delete images 32
  22. Running Containers • docker run --name [image] • At runtime

    you can • add volumes • specify port mappings • change the CMD 33
  23. My Container Philosophy • ONE Dockerfile for your app •

    Use that docker file for dev and prod • Default to prod, configure for dev 35
  24. Docker Compose • Docker Compose lets you orchestrate containers •

    Doesn’t do anything that Docker itself can’t do • YAML config file • Speaks the Docker Remote API 36