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

Building Development Environments with Docker (Zendcon 2015)

Josh Butts
October 19, 2015

Building Development Environments with Docker (Zendcon 2015)

Josh Butts

October 19, 2015
Tweet

More Decks by Josh Butts

Other Decks in Programming

Transcript

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

    PHP Organizer • github.com/jimbojsb • @jimbojsb 2
  2. About Offers.com • We help people save money • Launched

    in 2009 • 100k lines of PHP across several apps • Millions of Uniques / Month • Runs almost entirely in Docker 3
  3. Agenda In No Particular Order • What is Docker •

    Docker Terminology • Flow of Data in Docker • Running Docker • Docker CLI tools • Anatomy of a Dockerfile • Building a Dockerfile for PHP apps • Images & Containers • Docker orchestration • Docker Compose • Registries & Sharing Containers • Putting it all together
  4. 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 7
  5. 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 9
  6. 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 10
  7. 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 11
  8. 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 12
  9. 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 13
  10. Docker Dictionary - Registry • A server that stores images

    • Provides organization and authentication as needed • Facilitates sharing of pre-built images • Example: DockerHub 14
  11. 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 15
  12. 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 17
  13. 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! 18
  14. Docker vs Virtualization • Docker is lightweight • No overhead

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

    need a VM (i.e. dev environment) • For MacOS / Windows, you want Vagrant for this • docker -d 21
  16. 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 22
  17. Naming Containers • Containers get a name • It’s different

    from the name of the image • It’s dumb by default • use --name 25
  18. 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 26
  19. Typical Non-Linux Setup 28 MacOS Projects / Source Code Vagrant

    VM CoreOS Docker Daemon Containers Containers Containers Containers Docker CLI
  20. More on CoreOS • “Docker Native” • Auto Self-upgrading •

    Pay attention^^ • No package manager • Minimal wasted non-Docker resources 29
  21. Notes on Sample Docker VM • Based on CoreOS •

    Designed for development • Designed to be your only dev VM • Designed to run lots of containers simultaneously 30
  22. 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
  23. Running Containers • docker run --name [image] • At runtime

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

    Use that docker file for dev and prod • Default to prod, configure for dev 35
  25. 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 37
  26. Sharing Images • You probably want to run your own

    registry • SSL is required, you need a real TLD • This is a giant pain in the ass • Check out Quay.io 38
  27. CI Strategies • Auto build images from all pull request

    branches • Tag with :pr1234 • Use docker-compose to bring up test integration environment • Mysql with a ramdisk 39