Slide 1

Slide 1 text

github.com/GoogleContainerTools/jib Build containers faster with Jib A container image builder for Java applications

Slide 2

Slide 2 text

Our Team Cloud Tools for Java Appu Goundan @loosebazooka Qingyang “Q” Chen @coollog

Slide 3

Slide 3 text

github.com/GoogleContainerTools/jib Containers “Write once, run anywhere”

Slide 4

Slide 4 text

github.com/GoogleContainerTools/jib Building a Java container

Slide 5

Slide 5 text

github.com/GoogleContainerTools/jib Me Java Developer Building website for pet clinic Wants to containerize the backend Wants container on registry ilovejava.io/petclinic-app

Slide 6

Slide 6 text

github.com/GoogleContainerTools/jib

Slide 7

Slide 7 text

So I read some tutorials

Slide 8

Slide 8 text

github.com/GoogleContainerTools/jib FROM ubuntu:14.04 RUN apt-get update && apt-get install -y python-software-properties software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections RUN apt-get update && apt-get install -y oracle-java8-installer maven ADD . /usr/local/petclinic RUN cd /usr/local/petclinic && mvn install CMD ["/usr/bin/java" , "-cp", "/usr/local/petclinic/target/petclinic-1.0.jar" , "petclinic.WebServer" ]

Slide 9

Slide 9 text

So I read some more tutorials

Slide 10

Slide 10 text

github.com/GoogleContainerTools/jib FROM openjdk:8 COPY target/petclinic-*.jar /app.jar ENTRYPOINT java -jar /app.jar

Slide 11

Slide 11 text

github.com/GoogleContainerTools/jib Problem: openjdk:8 is 284MB FROM openjdk:8 COPY target/petclinic-*.jar /app.jar ENTRYPOINT java -jar /app.jar

Slide 12

Slide 12 text

Some more searching

Slide 13

Slide 13 text

github.com/GoogleContainerTools/jib FROM openjdk:8-jre-alpine COPY target/petclinic-*.jar /app.jar ENTRYPOINT java -jar /app.jar 82 MB

Slide 14

Slide 14 text

github.com/GoogleContainerTools/jib docs.docker.com/develop/develop-images/dockerfile_best-practices

Slide 15

Slide 15 text

github.com/GoogleContainerTools/jib ** !target/petclinic-*.jar .dockerignore

Slide 16

Slide 16 text

Some more tutorials later

Slide 17

Slide 17 text

github.com/GoogleContainerTools/jib FROM openjdk:8-jre-alpine COPY target/dependencies /app/dependencies COPY target/classes /app/classes ENTRYPOINT java -cp /app/dependencies/*:/app/classes petclinic.WebServer $ mvn dependencies:copy-dependencies to target/dependencies/

Slide 18

Slide 18 text

github.com/GoogleContainerTools/jib ... com.spotify docker-maven-plugin 1.0.0 ilovejava.io/petclinic-app gcr.io/distroless/java ["java", "-jar", "/${project.build.finalName}.jar" ] / ${project.build.directory} ${project.build.finalName}.jar ...

Slide 19

Slide 19 text

github.com/GoogleContainerTools/jib What did we do? 1. Write first Dockerfile 2. Reduce image size 3. Don’t run installs 4. Use better base image 5. Write .dockerignore 6. Improve incremental speed 7. Switch to use a Maven plugin Order of layers to optimize for cache hits Use of multi-stage builds Understanding Docker cache mechanism and quirks Download and install Docker Have elevated privileges to run Docker daemon saturnism.me/talk/docker-tips-and-tricks

Slide 20

Slide 20 text

github.com/GoogleContainerTools/jib Containerizing with Docker Project JAR docker Docker Daemon Container Image Dockerfile build send build push Registry

Slide 21

Slide 21 text

github.com/GoogleContainerTools/jib I’m a Java developer, I don’t want to have to care about Dockerfiles Some Java Developer Somewhere

Slide 22

Slide 22 text

github.com/GoogleContainerTools/jib Containerizing, simplified Project Container image build on registry

Slide 23

Slide 23 text

github.com/GoogleContainerTools/jib Containerizing, simplified PetClinic project ilovejava.io/petclinic-app build

Slide 24

Slide 24 text

github.com/GoogleContainerTools/jib 1. Apply the plugin. 1. Apply the plugin. 2. mvn jib:build Steps: (or gradle jib)

Slide 25

Slide 25 text

github.com/GoogleContainerTools/jib Demo $ git clone https://github.com/spring-projects/spring-petclinic && cd spring-petclinic $ ./mvnw compile com.google.cloud.tools:jib-maven-plugin:0.9.7:build \ -Dimage=gcr.io/my-project/petclinic

Slide 26

Slide 26 text

github.com/GoogleContainerTools/jib Project ilovejava.io/petclinic-app build Docker daemon build Docker context generate Advanced Configuration JVM flags OCI image format credentials program arguments

Slide 27

Slide 27 text

github.com/GoogleContainerTools/jib A “compiler” for containers

Slide 28

Slide 28 text

github.com/GoogleContainerTools/jib Dockerfile “script” FROM base container image Run commands to install dependencies COPY application files over Configure the entrypoint Run the container Produces some layers Produces some layers

Slide 29

Slide 29 text

github.com/GoogleContainerTools/jib Compile Containerize

Slide 30

Slide 30 text

github.com/GoogleContainerTools/jib Code Executable Compile

Slide 31

Slide 31 text

github.com/GoogleContainerTools/jib Code Executable Compile Java Container Containerize

Slide 32

Slide 32 text

github.com/GoogleContainerTools/jib Code Executable Compile Java Container Containerize Containers are the executables of the cloud.

Slide 33

Slide 33 text

github.com/GoogleContainerTools/jib Java JAR jar

Slide 34

Slide 34 text

github.com/GoogleContainerTools/jib Java JAR jar Java Container Jib

Slide 35

Slide 35 text

How Jib Works

Slide 36

Slide 36 text

github.com/GoogleContainerTools/jib Pure Java Speed What benefits do we get from Jib Reproducibility

Slide 37

Slide 37 text

github.com/GoogleContainerTools/jib Pure Java

Slide 38

Slide 38 text

github.com/GoogleContainerTools/jib A container image is a directory of files

Slide 39

Slide 39 text

github.com/GoogleContainerTools/jib Docker Image Format Tarballs that compose into a single filesystem Tarball A Tarball B Tarball C /bin /usr /tmp /var /jdk /app.jar

Slide 40

Slide 40 text

github.com/GoogleContainerTools/jib Docker Image Format Tarballs that compose into a single filesystem And a container configuration Tarball A Tarball B Tarball C /bin /usr /tmp /var /jdk /app.jar Environment variables, entrypoint, etc. Container configuration

Slide 41

Slide 41 text

github.com/GoogleContainerTools/jib { "architecture" : "amd64", "os": "linux", "config": { "Env": [], "Entrypoint" : [ "java", "-cp", "/app/libs/*:/app/resources/:/app/classes/" , "com.test.HelloWorld" ] }, "rootfs": { "type": "layers", "diff_ids" : [ "sha256:46e7865bff73b5a0c610bf9f20c91dfafa2518ace8703faaffff551a4773b947" , "sha256:6189abe095d53c1c9f2bfc8f50128ee876b9a5d10f9eda1564e5f5357d6ffe61" , "sha256:e8292403028e724f0c7686ede4cd89180faa85aeb63cd0e7d560e8a459d83afe" , "sha256:ff7666ffd3d45500f4af71f091a603413acb04d028ba03a6698f63819d246cb5" , "sha256:db22fdca5c6344265d841ec106e683fb39914f356fb1d8e69accb466a396dc62" , "sha256:9aa41c013edd2a6311dcdd4d26129b01b3ba0b08c8adb51759c63501a69d27f5" ] } } checksums

Slide 42

Slide 42 text

github.com/GoogleContainerTools/jib Docker Image Format Tarballs that compose into a single filesystem And a container configuration And a manifest Tarball A Tarball B Tarball C /bin /usr /tmp /var /jdk /app.jar Tarballs A, B, C, and the configuration Manifest Environment variables, entrypoint, etc. Container configuration

Slide 43

Slide 43 text

github.com/GoogleContainerTools/jib { "schemaVersion" : 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json" , "config": { "mediaType": "application/vnd.docker.container.image.v1+json" , "digest": "sha256:181b9f9c20bb2f7f485ffd038140551a758507d6255d46f4f62b3e504948fb86" , "size": 635 }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip" , "digest": "sha256:eb05f3dbdb543cc610527248690575bacbbcebabe6ecf665b189cf18b541e3ca" , "size": 7695857 }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip" , "digest": "sha256:ba7c544469e514f1a9a4dec59ab640540d50992b288adbb34a1a63c45bf19a24" , "size": 622796 }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip" , "digest": "sha256:15705ab016593987662839b40f5a22fd1032996c90808d4a1371eb46974017d5" , ... ] } Unique identifiers

Slide 44

Slide 44 text

github.com/GoogleContainerTools/jib distroless application layers application layers Jib image github.com/GoogleContainerTools/distroless

Slide 45

Slide 45 text

github.com/GoogleContainerTools/jib Speed

Slide 46

Slide 46 text

github.com/GoogleContainerTools/jib Docker registry Set of layers, container configurations, and manifests build 100MB layer 50MB layer registry send

Slide 47

Slide 47 text

github.com/GoogleContainerTools/jib Docker registry Set of layers, container configurations, and manifests build 100MB layer 50MB layer registry cached send

Slide 48

Slide 48 text

github.com/GoogleContainerTools/jib Docker registry Set of layers, container configurations, and manifests build 100MB layer 40MB layer registry 9MB layer 1MB layer

Slide 49

Slide 49 text

github.com/GoogleContainerTools/jib 1MB layer Docker registry Set of layers, container configurations, and manifests build 100MB layer 40MB layer registry 9MB layer send

Slide 50

Slide 50 text

github.com/GoogleContainerTools/jib Jib does an optimized build like FROM gcr.io/distroless/java COPY target/dependencies /app/dependencies COPY target/resources /app/resources COPY target/classes /app/classes ENTRYPOINT java -cp /app/dependencies/*:/app/resources:/app/classes my.app.Main

Slide 51

Slide 51 text

github.com/GoogleContainerTools/jib Jib vs Docker

Slide 52

Slide 52 text

github.com/GoogleContainerTools/jib Jib vs Docker

Slide 53

Slide 53 text

github.com/GoogleContainerTools/jib Reproducibility

Slide 54

Slide 54 text

github.com/GoogleContainerTools/jib Why reproducible ? Version Control Reduce variation between prod and dev

Slide 55

Slide 55 text

github.com/GoogleContainerTools/jib How? Wipe metadata that vary between builds Timestamps Users Groups

Slide 56

Slide 56 text

github.com/GoogleContainerTools/jib Possibilities for a container “compiler”

Slide 57

Slide 57 text

github.com/GoogleContainerTools/jib Possibilities for a container “compiler” Smart inferences Container optimizations Even faster builds Smaller images Tools for running the container Run and debug on Kubernetes

Slide 58

Slide 58 text

github.com/GoogleContainerTools/jib Demo $ gcloud container clusters create jib-demo

Slide 59

Slide 59 text

github.com/GoogleContainerTools/jib Project kubernetes-dev:debug

Slide 60

Slide 60 text

github.com/GoogleContainerTools/jib The Future More containerization tools and Java library for building container images Release Maven/Gradle plugin for run and debug on Kubernetes (with Skaffold) Be able to write code and have it run automatically in a distributed container cluster ...

Slide 61

Slide 61 text

github.com/GoogleContainerTools/jib github.com/GoogleContainerTools/distroless saturnism.me/talk/docker-tips-and-tricks