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
Tweet

More Decks by Josh Butts

Other Decks in Technology

Transcript

  1. Containerizing PHP Applications
    Josh Butts
    True North PHP 2016

    View full-size slide

  2. About Me
    • VP of Engineering

    at Offers.com
    • Austin PHP Organizer
    • github.com/jimbojsb
    • @jimbojsb
    2

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  5. SURVEY
    Quick
    6

    View full-size slide

  6. CAVEATS
    A Few
    7

    View full-size slide

  7. DOCKER?
    What is
    8

    View full-size slide

  8. BUILDING, RUNNING AND
    DISTRIBUTING APPLICATION
    CONTAINERS
    Docker is a tool for
    9

    View full-size slide

  9. 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

    View full-size slide

  10. High Level Overview
    11

    View full-size slide

  11. 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

    View full-size slide

  12. 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

    View full-size slide

  13. 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

    View full-size slide

  14. 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

    View full-size slide

  15. 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

    View full-size slide

  16. 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

    View full-size slide

  17. 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

    View full-size slide

  18. Building Images
    19
    Dockerfile Image
    Container
    Registry
    Image
    Image
    Build
    Push/Pull
    Run

    View full-size slide

  19. 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

    View full-size slide

  20. 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

    View full-size slide

  21. Docker vs Virtualization
    • Docker is lightweight
    • No overhead of a guest OS
    • Docker can be controlled /
    contained by systemd and
    cgroups
    22

    View full-size slide

  22. DOCKER
    What does it mean to run
    23

    View full-size slide

  23. 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

    View full-size slide

  24. 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

    View full-size slide

  25. Typical Non-Linux Setup
    26
    MacOS
    Projects /
    Source Code VM
    Linux
    Docker
    Daemon
    Containers
    Containers
    Containers
    Containers
    Docker
    CLI

    View full-size slide

  26. HELLO WORLD
    EXAMPLE
    Lets try a
    27

    View full-size slide

  27. Naming Images
    • hello-world
    • hello-world:latest
    • _/hello-world
    • dockerhub.com/_/hello-world
    28

    View full-size slide

  28. Naming Containers
    • Containers get a name
    • It’s different from the name of
    the image
    • It’s dumb by default
    • use --name
    29

    View full-size slide

  29. 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

    View full-size slide

  30. DOCKERFILE
    Lets actually write a
    31

    View full-size slide

  31. 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

    View full-size slide

  32. Running Containers
    • docker run --name [image]
    • At runtime you can
    • add volumes
    • specify port mappings
    • change the CMD
    33

    View full-size slide

  33. PHP APPLICATIONS
    Building Dockerfiles for
    34

    View full-size slide

  34. My Container Philosophy
    • ONE Dockerfile for your app
    • Use that docker file for dev and
    prod
    • Default to prod, configure for
    dev
    35

    View full-size slide

  35. 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

    View full-size slide

  36. WORDPRESS
    Lets build a Dockerfile for
    37

    View full-size slide

  37. LARAVEL
    Lets build a Dockerfile for
    38

    View full-size slide

  38. Github Links
    • http://github.com/jimbojsb/wp-docker-
    demo
    • http://github.com/jimbojsb/phpcli-
    docker-demo
    • http://github.com/jimbojsb/phpweb-
    docker-demo
    • http://github.com/jimbojsb/laravel-
    docker-demo
    39

    View full-size slide

  39. JOIND.IN/TALK/5BE98
    I’d love your feedback:
    40

    View full-size slide