128
DOCKER FROM DEVELOPMENT ENV TO SCALABLE CLOUD APPLICATION

Docker workshop

Embed Size (px)

Citation preview

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

WHY DOCKER?

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 ? ? ? ?

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

METAMAINTAINER LABEL EXPOSE VOLUME ARG

BASICSFROM RUN ADD COPY ENV

EXECUTIONCMD 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.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 ?

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 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

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?