whoami
Baruch Sadogursky, JFrog Developer Advocate, @jbaruch
Show notes!
• http://jfrog.com/shownotes
– Video (soon!)
– Slides
– Links
– Feedback
– Raffle! (come early)
JFrog Xray
Poll Time!
Poll Time!
üHeard about Docker
üCan do the tutorial
üPoCing, playing etc.
üProduction, baby!
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
JFrog Artifactory + Docker
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Who’s using Docker and nothing else?
The Promotion Pyramid
Development	builds
Dev Integration	tests
Integr.	tests
Staging
Pre-Prod
Prod
Amount	of	builds
Build/Deploy	time
Amount	of	
binaries
Pipeline: Quality Gates and Visibility
Source:	Agile	ALM,	Michael	Hüttermann,	Manning	Publications	Co.	
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
$docker build
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Let’s docker build in every env!
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu
RUN apt-get install -y software-properties-common python
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Latest	version
Latest	version
Latest	version
Latest	version
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu:14.04
RUN apt-get install -y software-properties-common python
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Better	now?
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu:4033353383af19ec179c01dda7f355a246c6adcafaf93c8f98
RUN apt-get install -y software-properties-common python
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
And	now?
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu:4033353383af19ec179c01dda7f355a246c6adcafaf93c8f98
RUN apt-get install -y software-properties-common python
RUN apt-get install -y nodejs
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
And	now?What	about	those?
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu:4033353383af19ec179c01dda7f355a246c6adcafaf93c8f98
RUN mvn clean install
CMD ”java –jar Main.class"
What	about	this?
That’s why.
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
FROM ubuntu:4033353383af19ec179c01dda7f355a246c6adcafaf93c8f98
RUN download_random_sh*t_from_the_internet.sh
CMD ["/usr/bin/node", "/var/www/app.js"]
And	how	about	this?
That’s why you don’t trust Docker
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Traditional Server Pattern
http://martinfowler.com/bliki/ImmutableServer.html
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Immutable Server Pattern
http://martinfowler.com/bliki/ImmutableServer.html
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
What’s up with the gates?!
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
What’s up with the gates?!
What’s up with the gates?!
- QA shouldn’t test dev images
What’s up with the gates?!
- QA shouldn’t test dev images
- non-tested images shouldn't be
staged
What’s up with the gates?!
- QA shouldn’t test dev images
- non-tested images shouldn't be
staged
- non-staged, non-tested or dev
images shouldn’t end up in
production!!!
Not so fast…
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Trumped-up limitations
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
The Anatomy of Docker Tag
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Wait	a	second,	how	can	I	
have	more	than	one	
repository	per	host	now?!
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
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
“ONE REGISTRY PER HOST OUGHT
TO BE ENOUGH FOR ANYBODY.”
Panic!
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Virtual hosts/ports to the rescue
Registry	host Tag	name
docker tag host:port/busybox
Virtual hosts/ports to the rescue
https://host:port/v2/busybox
Registry	host Tag	name
docker tag host:port/busybox
Virtual hosts/ports to the rescue
https://host:8081/artifactory/docker-dev/busybox
Virtual	repository	name Tag	name
https://host:port/v2/busybox
Context	name
Registry	host Tag	name
docker tag host:port/busybox
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;
…
}
}
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
But then you realize…
Wait	a	second,	now	I	need	
to	pull,	retag	and	push	for	
every	step?!
Anatomy of a container
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Our Layers
Application:	
••.war	file
Framework:	
••JDK8	+	Wildfly
Base:	
••CentOS
Framework build
- Verified base image
- Add system dependencies
from artifactory
- JDK
- wildfly
- Own it!
Minimal Framework build Dockerfile
FROM centos:7
MAINTAINER you@yourorg.com
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Application build
- Framework is your base
- Run a java build
- Add a file to base
- Done!
Application build Dockerfile
FROM yourorg-docker.jfrog.io/yourorg/framework:latest
MAINTAINER you@yourorg.com
ADD https://yourorg.jfrog.io/yourorg/java-release-local/…/app-[RELEASE].war
/opt/jboss/wildfly/standalone/deployments/app.war
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Application build Dockerfile
FROM yourorg-docker.jfrog.io/yourorg/framework:latest
MAINTAINER you@yourorg.com
ADD https://yourorg.jfrog.io/yourorg/java-release-local/…/app-[RELEASE].war
/opt/jboss/wildfly/standalone/deployments/app.war
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Application build Dockerfile
FROM yourorg-docker.jfrog.io/yourorg/framework:latest
MAINTAINER you@yourorg.com
ADD https://yourorg.jfrog.io/yourorg/java-release-local/…/app-[RELEASE].war
/opt/jboss/wildfly/standalone/deployments/app.war
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Application build Dockerfile
FROM yourorg-docker.jfrog.io/yourorg/framework:latest
MAINTAINER you@yourorg.com
ADD https://yourorg.jfrog.io/yourorg/java-release-local/…/app-[RELEASE].war
/opt/jboss/wildfly/standalone/deployments/app.war
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
Framework	Pipeline
Application	Pipeline
Framework	Pipeline
Application	Pipeline
Framework	Pipeline
Application	Pipeline
@JBARUCH #DOCKERDC HTTP://JFROG.COM/SHOWNOTES
HIGH QUALITY
(software and information) SPEED LOW COST
(automation)
Fast releases > Modular > Automation
Conclusions: Release Fast or Die!
Q&A and Links
• @jbaruch
• #DockerDC
• http://jfrog.com/shownotes
– Video (soon!)
– Slides
– Links
– Feedback
– Raffle! (come early)

Patterns and antipatterns in Docker image lifecycle as was presented at DC Docker Meetup August 2017