Top Banner
PATTERNS AND ANTIPATTERNS IN DOCKER IMAGE LIFECYCLE
77

Patterns & Antipatterns in Docker Image Lifecycle

Jan 12, 2017

Download

Software

yoavl
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Patterns & Antipatterns in Docker Image Lifecycle

PATTERNS AND ANTIPATTERNSIN DOCKER IMAGE LIFECYCLE

Page 2: Patterns & Antipatterns in Docker Image Lifecycle

whoami• Yoav Landman• Co-founder & CTO at JFrog• @_yoav_

Page 3: Patterns & Antipatterns in Docker Image Lifecycle

JFrog Xray

Page 4: Patterns & Antipatterns in Docker Image Lifecycle

JFrog + Docker

Page 5: Patterns & Antipatterns in Docker Image Lifecycle

Poll Time!DOCKER

DOCKER EVERYWHERE

Page 6: Patterns & Antipatterns in Docker Image Lifecycle

Poll Time!Can do the tutorialPoCing, playing etc.Production, baby!

Page 7: Patterns & Antipatterns in Docker Image Lifecycle

Y U NO

DOCKER PRODUCTION?

Page 8: Patterns & Antipatterns in Docker Image Lifecycle

I LIKE YOU

BUT I DON’T TRUST YOU

Page 9: Patterns & Antipatterns in Docker Image Lifecycle

CONTINUOUSIMAGE

INTEGRITY

Page 10: Patterns & Antipatterns in Docker Image Lifecycle

Who’s using Docker and nothing else?

Page 11: Patterns & Antipatterns in Docker Image Lifecycle

DO WE HAVE AN EXISTING PATTERN?

CAN WE ADAPT IT?

Page 12: Patterns & Antipatterns in Docker Image Lifecycle

CI/CD PIPELINES?

DOING THESE FOR YEARS.

Page 13: Patterns & Antipatterns in Docker Image Lifecycle

The Promotion Pyramid

Development builds

Dev Integration tests

Integr. tests

StagingPre-Prod

Prod

Frequency of builds

Build

/Dep

loy

time

Num

ber of binaries

Page 14: Patterns & Antipatterns in Docker Image Lifecycle

Pipeline: Quality Gates and Visibility

Source: Agile ALM, Michael Hüttermann, Manning Publications Co.

Page 15: Patterns & Antipatterns in Docker Image Lifecycle

$docker build

Page 16: Patterns & Antipatterns in Docker Image Lifecycle

DOCKER BUILD

ALL THE THINGS!

Page 17: Patterns & Antipatterns in Docker Image Lifecycle

Simple!

Page 18: Patterns & Antipatterns in Docker Image Lifecycle

FAST AND CHEAP BUILDS

NOT ALWAYS THE WAY TO GO

Page 19: Patterns & Antipatterns in Docker Image Lifecycle

This is why

Page 20: Patterns & Antipatterns in Docker Image Lifecycle

Let’s fix it!

Page 21: Patterns & Antipatterns in Docker Image Lifecycle

Let’s fix it (again)!

Page 22: Patterns & Antipatterns in Docker Image Lifecycle

Let’s fix it (again)!

Page 23: Patterns & Antipatterns in Docker Image Lifecycle

Docker content mistrust

Page 24: Patterns & Antipatterns in Docker Image Lifecycle

I DON’T ALWAYS BUILD PROMOTION PIPELINES

BUT WHEN I DO, IT’S WITH IMMUTABLE AND STABLE BINARIES

Page 25: Patterns & Antipatterns in Docker Image Lifecycle
Page 26: Patterns & Antipatterns in Docker Image Lifecycle

What’s up with the gates?!

Page 27: Patterns & Antipatterns in Docker Image Lifecycle
Page 28: Patterns & Antipatterns in Docker Image Lifecycle

What’s up with the gates?!

Page 29: Patterns & Antipatterns in Docker Image Lifecycle

What’s up with the gates?! - QA shouldn’t test dev images

Page 30: Patterns & Antipatterns in Docker Image Lifecycle

What’s up with the gates?! - QA shouldn’t test dev images - non-QA’ed images shouldn't be staged

Page 31: Patterns & Antipatterns in Docker Image Lifecycle

What’s up with the gates?! - QA shouldn’t test dev images - non-QA’ed images shouldn't be staged - non-QA’ed, non-staged or dev images shouldn’t end up in production!

Page 32: Patterns & Antipatterns in Docker Image Lifecycle

Not so fast…

Page 33: Patterns & Antipatterns in Docker Image Lifecycle

Trumped-up limitations

Page 34: Patterns & Antipatterns in Docker Image Lifecycle

The Anatomy of Docker Tag

Page 35: Patterns & Antipatterns in Docker Image Lifecycle

Wait a second, how can I have more than one

repository per host now?!

Page 36: Patterns & Antipatterns in Docker Image Lifecycle

How can we support this?

https://host:8081/artifactory/docker-dev/busybox

https://host:8081/artifactory/docker-staging/busybox

https://host:8081/artifactory/docker-qa/busybox

https://host:8081/artifactory/docker-prod/busybox

Page 37: Patterns & Antipatterns in Docker Image Lifecycle

“One registry per host isought to be enough for

anybody.”

https://www.reddit.com/r/theydidthemath/comments/1x37rx/request_how_much_alcohol_is_needed_to_get_a_whale

Page 38: Patterns & Antipatterns in Docker Image Lifecycle

Panic!

Page 39: Patterns & Antipatterns in Docker Image Lifecycle

Virtual hosts/ports to the rescue

https://host:8081/artifactory/docker-dev/busybox

Context name

Virtual repository nameTag name

https://host:port/v2/busybox

Page 40: Patterns & Antipatterns in Docker Image Lifecycle

server { listen 5001;

server_name 192.168.99.100; if ($http_x_forwarded_proto = '') { set $http_x_forwarded_proto $scheme; } rewrite ^/(v1|v2)/(.*) /artifactory/api/docker/docker-dev/$1/$2; … }}

Page 41: Patterns & Antipatterns in Docker Image Lifecycle

But then you realize…Wait a second, now I need to pull, retag and push for

every step?!

Page 42: Patterns & Antipatterns in Docker Image Lifecycle

WHAT DO WE WANT?

MINIMIZE THE NUMBER OF REPOS DOCKER INTERACT

WITH

HOW CAN WE DO IT?

VIRTUAL REPOSITORIES!

Page 43: Patterns & Antipatterns in Docker Image Lifecycle

Virtual RepositoriesLocal Repository

Virtual RepositoryRemote Repository

Docker Hub

Page 44: Patterns & Antipatterns in Docker Image Lifecycle

What We’ll DO? - Minimize number of repositories docker interacts with

Page 45: Patterns & Antipatterns in Docker Image Lifecycle

What We’ll DO? - Minimize number of repositories docker interacts with - deploy to virtual (backed by dev repository)

Page 46: Patterns & Antipatterns in Docker Image Lifecycle

What We’ll DO? - Minimize number of repositories docker interacts with - deploy to virtual (backed by dev repository) - promote within artifactory

Page 47: Patterns & Antipatterns in Docker Image Lifecycle

What We’ll DO? - Minimize number of repositories docker interacts with - deploy to virtual (backed by dev repository) - promote within artifactory- Resolve from virtual (production-ready images)

Page 48: Patterns & Antipatterns in Docker Image Lifecycle

Virtual Repositories FTWdocker-dev-local

docker-prod-localdocker-virtual

Dev

docker-hub-remote

Docker Hub

resolve

resolve

resolve

resolve

resolve

Page 49: Patterns & Antipatterns in Docker Image Lifecycle

Virtual Repositories FTWdocker-dev-local

docker-prod-localdocker-virtual

Dev

docker-hub-remote

Docker Hub

resolve

resolve

resolve

resolve

resolve

deploy

deploy

Page 50: Patterns & Antipatterns in Docker Image Lifecycle

Virtual Repositories FTWdocker-dev-local

docker-prod-localdocker-virtual

Dev

docker-hub-remote

Docker Hub

resolve

resolve

resolve

resolve

resolve

deploy

deploy

promote

Page 51: Patterns & Antipatterns in Docker Image Lifecycle

Virtual Repositories FTWdocker-dev-local

docker-prod-localdocker-virtual

Dev

docker-hub-remote

Docker Hub

resolve

resolve

resolve

resolve

resolve

deploy

deploy

promote

Prod

resolve

resolve

Page 52: Patterns & Antipatterns in Docker Image Lifecycle

Anatomy of a container

Page 53: Patterns & Antipatterns in Docker Image Lifecycle

Our LayersApplication: • .war file

Framework: • JDK8 + Tomcat

Base: • ubuntu-trusty

Page 54: Patterns & Antipatterns in Docker Image Lifecycle

Framework build- Verified base image- Add system dependencies

from artifactory- JDK- Tomcat

Page 55: Patterns & Antipatterns in Docker Image Lifecycle

Framework build

Own it!

Page 56: Patterns & Antipatterns in Docker Image Lifecycle

Minimal Framework build DockerfileFROM ubuntu:14.04MAINTAINER [email protected]

Page 57: Patterns & Antipatterns in Docker Image Lifecycle

Application build- Base==Framework image- Run app build- Add app files to base- Done!

Page 58: Patterns & Antipatterns in Docker Image Lifecycle

Application build Dockerfile

FROM yourorg-docker.jfrog.io/myorg/framework:latestMAINTAINER [email protected]

ADD https://yourorg.jfrog.io/java-release-local/…/app-[RELEASE].war /var/lib/tomcat7/webapps/app.war

?

Page 59: Patterns & Antipatterns in Docker Image Lifecycle

Application build Dockerfile

FROM yourorg-docker.jfrog.io/myorg/framework:latestMAINTAINER [email protected]

ADD https://yourorg.jfrog.io/java-release-local/…/app-[RELEASE].war /var/lib/tomcat7/webapps/app.war

? ?

Page 60: Patterns & Antipatterns in Docker Image Lifecycle

Application build Dockerfile

FROM yourorg-docker.jfrog.io/myorg/framework:latestMAINTAINER [email protected]

ADD https://yourorg.jfrog.io/java-release-local/…/app-[RELEASE].war /var/lib/tomcat7/webapps/app.war

? ?

???

Page 61: Patterns & Antipatterns in Docker Image Lifecycle
Page 62: Patterns & Antipatterns in Docker Image Lifecycle
Page 63: Patterns & Antipatterns in Docker Image Lifecycle

Framework Pipeline

Application Pipeline

Page 64: Patterns & Antipatterns in Docker Image Lifecycle

Framework Pipeline

Application Pipeline

Page 65: Patterns & Antipatterns in Docker Image Lifecycle

Framework Pipeline

Application Pipeline

Page 66: Patterns & Antipatterns in Docker Image Lifecycle
Page 67: Patterns & Antipatterns in Docker Image Lifecycle
Page 68: Patterns & Antipatterns in Docker Image Lifecycle

Install it! Installing with Docker compose Great for micro services located

on same host

Page 69: Patterns & Antipatterns in Docker Image Lifecycle
Page 70: Patterns & Antipatterns in Docker Image Lifecycle

End users have Docker installed

Don’t want to run/install docker-compose Or any other installer

Docker compose and docker client can introduce incompatibilities

Page 71: Patterns & Antipatterns in Docker Image Lifecycle

The Solution- Create An “Installer” Image- Provide variables for:

- Where to pull from- Docker Daemon to use

- Have it run docker compose- Install onto Client’s Docker!

Page 72: Patterns & Antipatterns in Docker Image Lifecycle

Installer Image

Page 73: Patterns & Antipatterns in Docker Image Lifecycle

Installer’s run.sh Just run docker-compose with

the right command start, stop, up, down, restart…

Check calling script version compatibility!

Page 74: Patterns & Antipatterns in Docker Image Lifecycle

app.sh (user script)

Set the repo to pull from

Set up script andapplication versions

Determine the docker daemon for docker-compose to use

Run the installer image

Page 75: Patterns & Antipatterns in Docker Image Lifecycle

The installer patternDocker pulls and runs the

installer image

app.sh

Executesrun.sh

installer image

Runs docker-compose

run.sh

Pulls down and installs

micro-services

Docker daemon Docker registry

docker-compose

Page 76: Patterns & Antipatterns in Docker Image Lifecycle

HIGH QUALITY(software and information) SPEED LOW COST

(automation)

Fast releases > Modular > Automation

Conclusions: Release Fast or Die!

Page 77: Patterns & Antipatterns in Docker Image Lifecycle

Thank you!