You are on page 1of 82

Docker for PHP

Developers
Chris Tankersley
@dragonmantank
JetBrains, June 2016

JetBrains, June 2016 1


What Is Docker?
“Docker is an open platform for developers and sysadmins to build,
ship, and run distributed applications. Consisting of Docker Engine, a
portable, lightweight runtime and packaging tool, and Docker Hub, a
cloud service for sharing applications and automating workflows,
Docker enables apps to be quickly assembled from components and
eliminates the friction between development, QA, and production
environments.”

https://www.docker.com/whatisdocker/

JetBrains, June 2016 2


Containers

JetBrains, June 2016 3


Normal Bare-Metal Server

nginx PHP DB

Operating System

CPU RAM HD Network

JetBrains, June 2016 4


Virtual Machines

nginx PHP DB nginx PHP DB

Operating System Operating System

Hypervisor

Operating System

CPU RAM HD Network

JetBrains, June 2016 5


Containers

nginx PHP DB nginx PHP DB

Operating System

CPU RAM HD Network

JetBrains, June 2016 6


Containers Are Not New
• LXC (Linux Containers)
• OpenVZ
• Systemd-nspawn
• Qemu/kvm
• BSD Jails
• Solaris Zones
• chroot

JetBrains, June 2016 7


Docker is an Ecosystem

Docker Engine

JetBrains, June 2016 8


Docker is an Ecosystem

Docker Machine Docker Compose Docker Swarm

JetBrains, June 2016 9


How does it work?

Uses a variety of existing Server Containers


Container technologies Hyper-V Containers xhyve Virtualization

JetBrains, June 2016 10


Sorry OSX < 10.10 and Windows < 10 Users
Docker Toolbox

JetBrains, June 2016 11


Let’s use Docker

JetBrains, June 2016 12


Running a container
• `docker run` will run a container
• This will not restart an existing container, just create a new one
• docker run [options] IMAGE [command] [arguments]
• [options ]modify the docker process for this container
• IMAGE is the image to use
• [command] is the command to run inside the container
• [arguments] are arguments for the command

JetBrains, June 2016 13


Running a simple shell

JetBrains, June 2016 14


Running a simple shell

JetBrains, June 2016 15


Running a simple shell

JetBrains, June 2016 16


Running Two Webservers

JetBrains, June 2016 17


Running Two Webservers

JetBrains, June 2016 18


Running Two Webservers

JetBrains, June 2016 19


Running Two Webservers

JetBrains, June 2016 20


Running Two Webservers

JetBrains, June 2016 21


Running Two Webservers

JetBrains, June 2016 22


Running Two Webservers

JetBrains, June 2016 23


Running Two Webservers

JetBrains, June 2016 24


Some Notes
• All three containers are 100% self contained
• Docker containers share common ancestors, but keep their own files
• `docker run` parameters:
• --rm – Destroy a container once it exits
• -d – Run in the background (daemon mode)
• -i – Run in interactive mode
• --name – Give the container a name
• -p [local port]:[container port] – Forward the local port to the container port

JetBrains, June 2016 25


Volumes

JetBrains, June 2016 26


Modifying a running container
• `docker exec` can run a command inside of an existing container
• Use Volumes to share data

JetBrains, June 2016 27


Persistent Data with Volumes
• You can designate a volume with -v
• Volumes can be shared amongst containers
• Volumes can mount data from the host system

JetBrains, June 2016 28


Mounting from the host machine

JetBrains, June 2016 29


Mounting from the host machine

JetBrains, June 2016 30


Mounting from the host machine

JetBrains, June 2016 31


Mounting from the host machine

JetBrains, June 2016 32


Mounting from the host machine

JetBrains, June 2016 33


Mounting from the host isn’t perfect
• The container now has a window into your host machine
• Permissions can get screwy if you are modifying in the container
• Most things it creates will be root by default, and you probably aren’t root on
the host machine
• Host-mounted volumes are not portable at all

JetBrains, June 2016 34


Container Data Volumes
• Uses a small container that does nothing but store data
• Have our app containers use the data volume to store data
• Use ‘editor containers’ to go in and modify data when needed

JetBrains, June 2016 35


Mounting Data Volumes

JetBrains, June 2016 36


Mounting Data Volumes

JetBrains, June 2016 37


Mounting Data Volumes

JetBrains, June 2016 38


Mounting Data Volumes

JetBrains, June 2016 39


Mounting Data Volumes

JetBrains, June 2016 40


Mounting Data Volumes

JetBrains, June 2016 41


Mounting Data Volumes

JetBrains, June 2016 42


Mounting Data Volumes

JetBrains, June 2016 43


Why go through the hassle?
• Data volumes are portable
• Data volumes are safer
• Separates the app containers from data
• Production can use a data volume, dev can use a host volume
• Our app containers stay small

JetBrains, June 2016 44


Network Linking

JetBrains, June 2016 45


Docker Links
• Allows containers to ‘see’ each other over the network
• Each container thinks the other one is just another machine
• Containers all have an internal network address, so we don’t need to
expose everything through the host

JetBrains, June 2016 46


More Traditional Setup

INTARWEBS Nginx Port 9000 PHP-FPM

Data Volume

Editor

JetBrains, June 2016 47


Let’s Build It

JetBrains, June 2016 48


Let’s Build It

JetBrains, June 2016 49


Let’s Build It

JetBrains, June 2016 50


Let’s Build It

JetBrains, June 2016 51


Let’s Build It

JetBrains, June 2016 52


Let’s Build It

JetBrains, June 2016 53


More Notes!
• We can now rebuild sections of the app as needed
• We can restart nginx without impacting PHP
• We can extend much easier

• Docker 1.12 has added a whole bunch of new stuff

JetBrains, June 2016 54


Creating your own Images

JetBrains, June 2016 55


Dockerfile
• Dockerfile is the configuration steps for an image
• Can be created from scratch, or based on another image
• Allows you to add files, create default volumes, ports, etc
• Can be used privately or pushed to Docker Hub

JetBrains, June 2016 56


FROM php:7
RUN apt-get update \
&& apt-get install –y \
libmcrypt-dev \
libpng12-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
&& docker-php-ext-install iconv mcrypt pdo pdo_mysql

COPY build/app /var/www


# …
EXPOSE 80 443
VOLUME /var/www
VOLUME /var/log

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

JetBrains, June 2016 57


Build it
docker build -t tag_name ./

• This runs through the Dockerfile and generates the image


• We can now use the tag name to run the image

JetBrains, June 2016 58


Other Helpful Commands

JetBrains, June 2016 59


Inspect a container
docker inspect [options] CONTAINER_NAME

• Returns a JSON string with data about the container


• Can also query
• docker inspect -f “{{ .NetworkSettings.IPAddress }}” web_server
• Really handy for scripting out things like reverse proxies

JetBrains, June 2016 60


Work with images
• docker pull IMAGE – Pulls down an image before using
• docker images – Lists all the images that are downloaded
• docker rmi IMAGE – Deletes an image if it’s not being used

JetBrains, June 2016 61


Docker Machine

JetBrains, June 2016 62


What is Docker Machine?
• A provisioning tool that is used to set up a box with Docker
• Used in Docker Toolbox to create the VM
• Supports:
• EC2
• Azure
• Digital Ocean
• Hyper-V
• OpenStack
• Virtualbox
• VMWare

JetBrains, June 2016 63


Why use it?
• Makes it very easy to spin up new boxes
• Docker Machine handles all of the dirty stuff for you
• Docker Toolbox users are already using it
• Integrates with Docker Swarm

• It is not necessarily portable

JetBrains, June 2016 64


Docker Swarm

JetBrains, June 2016 65


What is Docker Swarm?
• Cluster management tool developed by Docker
• Looks like a machine running docker, but is actually many machines

• This has changed and grown a lot in Docker 1.12

JetBrains, June 2016 66


Docker Compose

JetBrains, June 2016 67


What is Docker Compose?
• Multi-container orchestration
• A single config file holds all of your container info
• Works with Docker Swarm and a few other tools, like Rancher

JetBrains, June 2016 68


Sample docker-compose.yml
phpserver:
build: ./docker/php
volumes:
- /home/ctankersley/Projects/dockerfordevs:/var/www/
links:
- mysqlserver
mysqlserver:
image: mysql
environment:
MYSQL_DATABASE: dockerfordevs
MYSQL_ROOT_PASSWORD: docker
volumes:
- /var/lib/mysql
nginx:
build: ./docker/nginx
ports:
- "80:80"
- "443:443"
links:
- phpserver

JetBrains, June 2016 69


JetBrains, June 2016 70
Install “Docker Integration” Plugin

JetBrains, June 2016 71


Let PhpStorm Know about Docker

JetBrains, June 2016 72


Open the Docker Panel

JetBrains, June 2016 73


Download an Image

JetBrains, June 2016 74


Download an Image

JetBrains, June 2016 75


Deploy a Project

JetBrains, June 2016 76


Configure a Deployment

JetBrains, June 2016 77


Configure a Deployment

JetBrains, June 2016 78


It Lives!

JetBrains, June 2016 79


It Lives!

JetBrains, June 2016 80


Notes
• Does support docker-compose.yml files and setups as
deployments
• Doesn’t support custom Docker Compose settings files

JetBrains, June 2016 81


Thank You!
• https://github.com/dragonmantank
• Author of “Docker for Developers”
• https://leanpub.com/dockerfordevs

• http://ctankersley.com
• chris@ctankersley.com
• @dragonmantank

JetBrains, June 2016 82

You might also like