DOCKERFROM DEVELOPMENT ENV TO 

SCALABLE CLOUD APPLICATION
DOCKER
3 HOURS
ONE 10-MINUTE BREAK
QUESTIONS AFTER EACH PART
DOCKER
DOCKER INTERNALS
DOCKER BASICS
DOCKERFILE
DOCKER-COMPOSE
SCALING
DOCKER CLUSTERS
DOCKER
MICHAŁ KURZEJA
▸ CTO at accesto.com
▸ michal@accesto.com
▸ @michalKurzeja
WHY
DOCKER?
DOCKER
SYSTEM DEPENDENCIES
DOCKER
SYSTEM DEPENDENCIES
PROJECT 1
PROJECT 2
PROJECT 3
* M
DOCKER
SYSTEM DEPENDENCIES
Developer 1
Tester
Developer 2
CI
Staging
* N
DOCKER
PROJECT DEPENDENCY MATRIX FROM HELL
Dev Stage Prod CI
PHP ? ? ? ?
MySQL ? ? ? ?
Redis ? ? ? ?
RabbitMQ ? ? ? ?
Neo4j ? ? ? ?
Hadoop/
Spark
? ? ? ?
DOCKER
PROJECT DEPENDENCY MATRIX FROM HELL
Dev Stage Prod CI
PHP ? ?
MySQL ? ? ?
Redis ? ? ? ?
RabbitMQ ? ? ? ?
Neo4j ? ? ? ?
Hadoop/
Spark
? ? ? ?
PROFITS?
BUILD ONCE,
EXECUTE
EVERYWHERE*
NO DEPENDENCY
& NO INCOMPATIBILITY
ISSUES
VM WITHOUT
OVERHEAD
FULLY
AUTOMATED
EASY
TO DEPLOY*
SEPARATION
OF DUTIES
SCALABILITY*
HUGE
COMMUNITY
TECHNICAL
BACKGROUND
IMAGE
IMAGE LAYER
imagelayers.io
CONTAINER
REGISTRY
DOCKER HUB
DOCKER
VIRTUAL MACHINES VS CONTAINERS
DOCKER
WHY IS DOCKER FAST?
LET’S PLAY
A GAME!
Let me know if you have any issues!
DOCKER
PREREQUISITES
▸ Git
▸ Docker
▸ Docker-compose
▸ Linux prefered
▸ OSX -> Docker for Mac
▸ Windows -> Docker for Windows :/
https://github.com/accesto/docker-workshop
docker run
firecyberice/whalesay
"PHP rocks"
docker run
firecyberice/whalesay
"PHP rocks"
docker run
firecyberice/whalesay
"PHP rocks"
DOCKER
IMAGE NAME
▸ name #official image
▸ vendor/name
▸ name:tag #official image with tag
▸ vendor/name:tag
docker run
firecyberice/whalesay
"PHP rocks"
docker ps -a
?
docker run -v $PWD:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
docker run -v $PWD:/app

-p 8082:80 #local:container

php:5.6-apache
docker run -v $PWD:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
READY TO
DIVE DEEPER?
OWN
DOCKER IMAGE
DOCKERFILE
META
MAINTAINER
LABEL
EXPOSE
VOLUME
ARG
BASICS
FROM
RUN
ADD
COPY
ENV
EXECUTION
CMD
ENTRYPOINT
USER
WORKDIR
AND MORE…
SHELL
HEALTHCHECK
STOPSIGNAL
ONBUILD
.DOCKERIGNORE
EXAMPLE?
FROM firecyberice/whalesay:latest
Dockerfile
FROM firecyberice/whalesay:latest



ADD fortune.sh /usr/bin/




Dockerfile
Dockerfile
FROM firecyberice/whalesay:latest



ADD fortune.sh /usr/bin/
RUN chmod +x /usr/bin/fortune.sh



Dockerfile
FROM firecyberice/whalesay:latest



ADD fortune.sh /usr/bin/
RUN chmod +x /usr/bin/fortune.sh



ENTRYPOINT /usr/bin/fortune.sh | cowsay







docker build -t accesto/docker-whale .
Dockerfile
FROM firecyberice/whalesay:latest



ADD fortune.sh /usr/bin/
RUN chmod +x /usr/bin/fortune.sh



ENTRYPOINT /usr/bin/fortune.sh | cowsay







docker build -t accesto/docker-whale .


docker run accesto/docker-whale
Dockerfile
EVERYTHING IN ONE CONTAINER ?
MOAR CONTAINERS!
DOCKER
COMPOSE
(CONTAINER ORCHESTRATION)
docker run -v $PWD/www:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
docker run -v $PWD/www:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7X
docker run www
docker run mariadb
docker run redis
?
docker run www
docker run mariadb
docker run redis
?X
#docker-compose.yml
www:

image: webdevops/php-apache:alpine-3-php7
docker run -v $PWD/www:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
#docker-compose.yml
www:

image: webdevops/php-apache:alpine-3-php7
volumes: 

- ./www:/app

docker run -v $PWD/www:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
#docker-compose.yml
www:

image: webdevops/php-apache:alpine-3-php7
volumes: 

- ./www:/app

ports:

- 8082:80
docker run -v $PWD/www:/app

-p 8082:80 

webdevops/php-apache:alpine-3-php7
#docker-compose.yml
www:

image: webdevops/php-apache:alpine-3-php7
volumes: 

- ./www:/app

ports:

- 8082:80
DOCKER-COMPOSE UP
LINKING
CONTAINERS
WWW REDIS
www:

image: webdevops/php-apache:…

volumes: 

- ./www:/app

ports:

- 8082:80



redis:

image: redis:alpine
www:

image: webdevops/php-apache:…

volumes: 

- ./www:/app

ports:

- 8082:80

links:

- redis

redis:

image: redis:alpine
<?php
/* www/index.php */
require_once __DIR__.'/vendor/autoload.php';
$client = new PredisClient(['host' => 'redis']);
$counter = $client->incr('counter');
echo "Hostname: ".gethostname().PHP_EOL;
echo " Counter: ".$counter.PHP_EOL;
docker-compose up -d
docker-compose ps
MANY
CONFIGURATION
POSSIBILITIES
CHECK OUT DOCKER-COMPOSE FILE REFERENCE
SCALING
APPLICATIONS
FILE SYSTEM
ABSTRACTION
CENTRALIZED
LOGS
SESSION
EXTERNAL
SERVICES
DATABASE
12FACTOR.NET
WWW REDIS
WWW
WWW
…
HAPROXY
version: '2'

services:

www:

image: webdevops/….

volumes: 

- ./www:/app

ports:

- 8082:80

links:

- redis

redis:

image: redis:alpine
version: '2'

services:

www: …

haproxy:

image: 'dockercloud/haproxy:latest'

redis: …
version: '2'

services:

www: …

haproxy:

image: 'dockercloud/haproxy:latest'

links:

- www

redis: …
version: '2'

services:

www: …

haproxy:

image: 'dockercloud/haproxy:latest'

links:

- www

ports:

- '8082:80'

redis: …
version: '2'

services:

www: …

haproxy:

image: 'dockercloud/haproxy:latest'

links:

- www

ports:

- '8082:80'

volumes:

- /var/run/docker.sock:/var/run/docker.sock


redis: …
docker-compose up -d
docker-compose scale www=3
docker-compose ps
DEPLOYMENT
PRACTICES -
DEVELOPMENT
USE
COMPOSE
SHARE
SOURCES
MULTIPLE
CONTAINERS
USE
VERY SPECIFIC
IMAGE TAGS
OWN
DOCKER FILE
AND REPOSITORY
INHERIT
FROM
PRODUCTION
PRACTICES -
PRODUCTION
SHARE
SOURCES
DON’T
(USE COPY)
AUTOMATE
DEPLOYMENT
(ANSIBLE, PUPPET, CHEF, ….)
KEEP
IT SMALL
PRODUCTION VS DEVELOPMENT
LET THEM BE
DIFFERENT
USE INHERITANCE
PRACTICES -
DOCKERFILE
USE ENV
VARIABLES
ADD INIT.D
SCRIPTS SUPPORT
REMOVE
GARBAGE FILES
CHANGE
USER
DEEPER?
DOCKER SWARM
MESOSPHERE
KUBERNETES
AMAZON
RANCHER
CHALLENGE
ACCEPTED?
QUESTIONS?
Docker workshop

Docker workshop