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

Building Development Environments with Docker (Zendcon 2015)

44a352b02a91a9e841da7533bc5d9b8e?s=47 Josh Butts
October 19, 2015

Building Development Environments with Docker (Zendcon 2015)

44a352b02a91a9e841da7533bc5d9b8e?s=128

Josh Butts

October 19, 2015
Tweet

Transcript

  1. Building Development Environments with Docker Josh Butts Zendcon 2015

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

    PHP Organizer • github.com/jimbojsb • @jimbojsb 2
  3. 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
  4. 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
  5. DOCKER? What is 5

  6. BUILDING, RUNNING AND DISTRIBUTING APPLICATION CONTAINERS Docker is a tool

    for 6
  7. 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
  8. High Level Overview 8

  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. Docker Dictionary - Registry • A server that stores images

    • Provides organization and authentication as needed • Facilitates sharing of pre-built images • Example: DockerHub 14
  15. 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
  16. Building Images 16 Dockerfile Image Container Registry Image Image Build

    Push/Pull Run
  17. 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
  18. 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
  19. Docker vs Virtualization • Docker is lightweight • No overhead

    of a guest OS • Docker can be controlled / contained by systemd and cgroups 19
  20. DOCKER What does it mean to run 20

  21. 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
  22. 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
  23. HELLO WORLD EXAMPLE Lets try a 23

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

    24
  25. Naming Containers • Containers get a name • It’s different

    from the name of the image • It’s dumb by default • use --name 25
  26. 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
  27. DOCKERFILE Lets actually write a 27

  28. Typical Non-Linux Setup 28 MacOS Projects / Source Code Vagrant

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

    Pay attention^^ • No package manager • Minimal wasted non-Docker resources 29
  30. 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
  31. DOCKER VM Running a development 31

  32. 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
  33. Running Containers • docker run --name [image] • At runtime

    you can • add volumes • specify port mappings • change the CMD 33
  34. PHP APPLICATIONS Building Dockerfiles for 34

  35. My Container Philosophy • ONE DOCKERFILE for your app •

    Use that docker file for dev and prod • Default to prod, configure for dev 35
  36. WORDPRESS Lets build a Dockerfile for 36

  37. 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
  38. 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
  39. 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
  40. QUESTIONS? Anyone have 40

  41. JOIND.IN/15498 I’d love your feedback: 41