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 3
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
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 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 11
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 12
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 13
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 14
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 15
Docker Dictionary - Registry • A server that stores images • Provides organization and authentication as needed • Facilitates sharing of pre-built images • Example: DockerHub, Amazon ECR 16
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 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 19
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! 20
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 23
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 24
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 29
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 31
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 35