Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $...

66
Kickass Development Environments with Docker PHP Dorset

Transcript of Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $...

Page 1: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Kickass Development Environments with Docker

PHP Dorset

Page 2: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

[email protected]

@rawkode

github.com/rawkode

~Software Consultant

Docker Glasgow Organiser

● PHP / Go / Elixir / Java / Obj-C

● DevOps / CI / CD / Docker

● CQRS & Event Sourcing

● Domain-Driven Design

● Framework agnostic code

● TDD / BDD

Page 3: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

let’s travel through time ...

Page 4: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Development Environments circa 2000$ tree

awesome-million-pound-project

└── src ├── game.php ├── game.php.bk-david ├── game.php.bk-deano ├── main.php ├── main.php.maybe-fixed ├── main.php.bk-1999-12-02 ├── main.php.bk-1999-12-02.2 ├── player.php ├── player.php.orig └── .swp.player.php

Page 5: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Production Environments circa 2000$ tree

awesome-million-pound-project

└── src ├── game.php ├── game.php.bk-david ├── game.php.bk-deano ├── main.php ├── main.php.maybe-fixed ├── main.php.bk-1999-12-02 ├── main.php.bk-1999-12-02.2 ├── player.php ├── player.php.orig └── .swp.player.php

Page 6: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

things got better ...

Page 7: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

but not for another six years ...

Page 8: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

how did we survive those six years, you ask?

Page 9: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david
Page 10: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Let travel through time a little quicker ...

Page 11: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

2006

Page 12: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Dev/Prod parity becomes a twinkle in our eye

Page 13: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

2009

Page 14: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

DSL Hell

Page 15: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

2011

Page 16: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david
Page 17: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david
Page 18: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Vagrant Problems

● You’re creating and managing

VMs for each project / service

● Those VM’s are mutable / prone

to error by user changes

● They’re built JIT (most cases)

● How long goes your vagrant up

take?

Page 19: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Let’s check out another option

Page 20: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

What is Docker?

Page 21: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

What is Docker?

Docker allows you to package an application with all of its dependencies into a

standardized unit for software development.

docker.com

Page 22: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

What’s the goal?

A single, runnable, distributable executable

Page 23: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

The Docker Family● Docker

● Docker Engine

● Docker Registry

● Docker Compose

● Docker Machine

● Docker Swarm

Page 24: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Image

Page 25: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Layering

Page 26: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

COPY ON WRITE

Page 27: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Official Imageshttp://hub.docker.com

● php (5.5, 5.6, 7.0)

● redis

● memcached

● elasticsearch

● mysql

● postgres

● mongo

● node

● rabbitmq

● …

Page 28: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

FROM php:7.0

Page 29: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

ADD ./ /var/wwwCOPY ./ /var/www

Warning: Be careful with ADD

Page 30: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

WORKDIR /var/www

Page 31: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

ENTRYPOINT [ “php” ]

Page 32: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

CMD [ “-v” ]

Page 33: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Container

Page 34: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Demo

Page 35: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david
Page 36: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Do I have to rebuild

my container when I update my

code?

Page 37: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Volumes

Page 38: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

… -v `pwd`:/var/www

Page 39: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

… -v /var/log/apache2

Page 40: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

… --volumes-from=app

Page 41: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Demo

Page 42: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

I’m on OSX and it’s really really slow!

Page 43: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker on OSX isn’t native

Page 44: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

VirtualBoxFs

Page 45: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

VirtualBox Fileshare is slow ...

Page 46: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

rsync!github.com

/rawkode

/docker-developer-utils

docker-machine create -d

virtualbox \

--virtualbox-no-share \

Development

docker-machine-rsync

Page 47: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

That’s great, but what about the

database, cache,

elasticsearch, etc

Page 48: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Project Dependencies

Page 49: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Project Dependencies

Page 50: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

docker run memcacheddocker run postgresdocker run elasticsearch

Page 51: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

docker run -e APP_ENV=development -v .:/var/www -p 0.0.0.0:10000:80 --link elasticsearch:elasticsearch --link postgres:postgres --link memcached:memcached edpug:1

Page 52: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Compose

Page 53: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

version: ‘2’services:

application: image: php-7.0-apache

redis:image: redis:version

Page 54: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Compose Demo

Let’s setup a project with:

● PHP 7● Elasticsearch● PostgreSQL● memcached

… and let’s do it in under one minute* …

* docker pull commands done on the train and this text will be too small to read on a projector

Page 55: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Docker Tips

Page 56: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

composer install --ignore-platform-reqs

● IDE AutoComplete

● Cached to ~/.composer

● Not passing keys or tokens to Docker

container for satis / private

repositories

ComposerKeep it local

Page 57: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

FROM alpine:3.3Alpine Linux~ 5 MiB

(with solid package management!)

Page 58: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Base ImageONBUILD FTW

# Dockerfile

ONBUILD COPY . /var/www

# docker-compose.yml

application:

image: base-image

volumes:

- .:/var/www

# CI build

FROM base-image

Page 59: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Base ImageNIGHTLY BUILDS

cron / curl / wget / whatever!

# There’s no cascading builds

# in Docker. Automate it.

FROM your-company:base:latest

FROM your-company:base:dev

FROM your-company:base:prod

Page 60: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Arbitrary Commands

github.com

/rawkode

/docker-developer-utils

docker-compose-run-command \

php -v

Page 61: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Image SizeKeep it Lean!

RUN DEBIAN_FRONTEND=noninteractive \

apt-get update \

&& apt-get install -y \

--no-install-recommends apache2 \

&& rm -rf /var/lib/apt/lists/*

Page 62: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Image SizeGOTCHAS

ADD . /var/www

RUN chown www-data -R /var/www

THIS WILL COST YOU TWICE THE

MiBs!

Do it at entrypoint, if really

needed

Page 63: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Image SizeIf in doubt, check!

docker history myimage

Page 64: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

volumes:

- cache_and_logs

cache_and_logs:

- image: busybox

- volumes:

- /var/www/app/cache

- /var/www/app/logs

Data ContainersContainerised logs and cache!

Page 65: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Abuse Docker

testing-database-pdo:

extends:

service: testing-php-5.5

environment:

- DATABASE_USER=root

- DATABASE_PASS=testing

- DATABASE_NAME=testing

testing-database-mysql:

extends:

service: testing-database-pdo

links:

- mysql:mysql

environment:

- DATABASE_DRIVER=pdo_mysql

- DATABASE_HOST=mysql

- DATABASE_PORT=3306

Page 66: Kickass Development Environments with Docker - PHP Dorset · Development Environments circa 2000 $ tree awesome-million-pound-project └── src ├── game.php ├── game.php.bk-david

Thanks for having me!

Questions?

Free advice, tweet:@rawkode

Not so free, but super-awesome, training for you and/or [email protected]

Send constructive (ish) feedback to:joind.in/talk/17628