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
▸ [email protected]
▸ @michalKurzeja
DOCKER
SYSTEM DEPENDENCIES
DOCKER
SYSTEM DEPENDENCIES
PROJECT 1
PROJECT 2
PROJECT 3* M
DOCKER
SYSTEM DEPENDENCIES
Developer 1
Tester
Developer 2
CIStaging
* 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 ? ? ? ?
BUILD ONCE, EXECUTE EVERYWHERE*
NO DEPENDENCY & NO INCOMPATIBILITY ISSUES
VM WITHOUT OVERHEAD
SEPARATION OF DUTIES
TECHNICAL BACKGROUND
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 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?
METAMAINTAINER LABEL EXPOSE VOLUME ARG
BASICSFROM RUN ADD COPY ENV
EXECUTIONCMD ENTRYPOINT USER WORKDIR
AND MORE…SHELL HEALTHCHECK STOPSIGNAL ONBUILD .DOCKERIGNORE
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.shENTRYPOINT /usr/bin/fortune.sh | cowsaydocker build -t accesto/docker-whale .
Dockerfile
FROM firecyberice/whalesay:latest ADD fortune.sh /usr/bin/
RUN chmod +x /usr/bin/fortune.shENTRYPOINT /usr/bin/fortune.sh | cowsaydocker build -t accesto/docker-whale .
docker run accesto/docker-whale
Dockerfile
EVERYTHING IN ONE CONTAINER ?
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: 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 Predis\Client(['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 POSSIBILITIESCHECK OUT DOCKER-COMPOSE FILE REFERENCE
SCALING APPLICATIONS
FILE SYSTEM ABSTRACTION
EXTERNAL SERVICES
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
PRACTICES - DEVELOPMENT
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, ….)
PRODUCTION VS DEVELOPMENT
LET THEM BE DIFFERENT
USE INHERITANCE
PRACTICES - DOCKERFILE
USE ENV VARIABLES
ADD INIT.D SCRIPTS SUPPORT
REMOVE GARBAGE FILES
DOCKER SWARM MESOSPHERE KUBERNETES AMAZON
CHALLENGE ACCEPTED?