Package your
 Java EE applications
 using
 Docker and Kubernetes
 Arun Gupta, @arungupta Red Hat
Arun Gupta Director, Developer Advocacy @arungupta blog.arungupta.me arungupta@redhat.com
What is Docker?
What is Docker? • Open source project and company
 
 
 
 
 

What is Docker? • Open source project and company
 
 
 
 
 
 • Used to create containers for software applications
What is Docker? • Open source project and company
 
 
 
 
 
 • Used to create containers for software applications • Package Once Deploy Anywhere (PODA)
Advantages
Advantages • Faster deployments
Advantages • Faster deployments • Isolation
Advantages • Faster deployments • Isolation • Portability - “it works on my machine”
Advantages • Faster deployments • Isolation • Portability - “it works on my machine” • Snapshotting
Advantages • Faster deployments • Isolation • Portability - “it works on my machine” • Snapshotting • Security sandbox
Advantages • Faster deployments • Isolation • Portability - “it works on my machine” • Snapshotting • Security sandbox • Limit resource usage
Advantages • Faster deployments • Isolation • Portability - “it works on my machine” • Snapshotting • Security sandbox • Limit resource usage • Simplified dependency
Advantages • Faster deployments • Isolation • Portability - “it works on my machine” • Snapshotting • Security sandbox • Limit resource usage • Simplified dependency • Sharing
Underlying Technology
Underlying Technology • Written in Go

Underlying Technology • Written in Go
 • Uses several Linux features
Underlying Technology • Written in Go
 • Uses several Linux features • Namespaces to provide isolation
Underlying Technology • Written in Go
 • Uses several Linux features • Namespaces to provide isolation • Control groups to share/limit hardware resources
Underlying Technology • Written in Go
 • Uses several Linux features • Namespaces to provide isolation • Control groups to share/limit hardware resources • Union File System makes it light and fast
Underlying Technology • Written in Go
 • Uses several Linux features • Namespaces to provide isolation • Control groups to share/limit hardware resources • Union File System makes it light and fast • libcontainer defines container format
Is it only Linux?
Is it only Linux? • Natively supported in Linux
Is it only Linux? • Natively supported in Linux • Can be installed on Mac or Windows using boot2docker
Is it only Linux? • Natively supported in Linux • Can be installed on Mac or Windows using boot2docker • Tiny Core Linux VM
• Image defined in text-based Dockerfile
• Image defined in text-based Dockerfile • List of commands to build the image
 
 
 
 FROM fedora:latest
 
 CMD echo “Hello world”
• Image defined in text-based Dockerfile • List of commands to build the image
 
 
 
 • docker build or pull FROM fedora:latest
 
 CMD echo “Hello world”
• Images shared using registry
• Images shared using registry • Docker Hub is public SaaS
 
 
 
 
 
 

• Images shared using registry • Docker Hub is public SaaS
 
 
 
 
 
 
 • Private registries can be setup inside firewall
• Images shared using registry • Docker Hub is public SaaS
 
 
 
 
 
 
 • Private registries can be setup inside firewall • docker push or pull <IMAGE_ID>
• Container built from the image
 
 
 
 
 
 

• Container built from the image
 
 
 
 
 
 
 • Runtime representation of the image
• Container built from the image
 
 
 
 
 
 
 • Runtime representation of the image • Self contained execution environment
• Container built from the image
 
 
 
 
 
 
 • Runtime representation of the image • Self contained execution environment • docker run <IMAGE_ID>
Docker commands • docker ps: List running containers • docker stop: Stop a running container • docker rm: Remove a running container • docker rmi: Remove an image • … https://docs.docker.com/reference/commandline/cli/
Docker
 Hub
 Docker
 Host
 DaemonDocker
 Client Docker Workflow
Docker
 Hub
 Docker
 Host
 DaemonDocker
 Client docker run <image> docker … Docker Workflow
Docker
 Hub
 Docker
 Host
 DaemonDocker
 Client docker run <image> docker … Docker Workflow
Docker
 Hub
 Image 1 Image 2 Image 3 Image M Docker
 Host
 DaemonDocker
 Client docker run <image> docker … Docker Workflow
Docker
 Hub
 Image 1 Image 2 Image 3 Image M Docker
 Host
 Image 1 Image 2 Image 3 Image N DaemonDocker
 Client docker run <image> docker … Docker Workflow
Docker
 Hub
 Image 1 Image 2 Image 3 Image M Docker
 Host
 Image 1 Image 2 Image 3 Image N Daemon Container 1 Container 2 Container O Docker
 Client docker run <image> docker … Docker Workflow
Recipe #1.1 FROM jboss/wildfly RUN curl -L https://github.com/javaee-samples/javaee7-hol/raw/master/solution/ movieplex7-1.0-SNAPSHOT.war -o /opt/jboss/wildfly/standalone/deployments/ movieplex7-1.0-SNAPSHOT.war docker run -it -p 8080:8080 arungupta/javaee7-hol Host
 Application Server Database
Recipe #1.2 Host
 Application Server Database http://blog.arungupta.me/wildfly-javaee7-mysql-link-two-docker-container-techtip65/ data-source add --name=mysqlDS --driver-name=mysql --jndi-name=java:jboss/ datasources/ExampleMySQLDS --connection-url=jdbc:mysql://$DB_PORT_3306_TCP_ADDR: $DB_PORT_3306_TCP_PORT/sample?useUnicode=true&amp;characterEncoding=UTF-8 -- user-name=mysql --password=mysql --use-ccm=false --max-pool-size=25 --blocking- timeout-wait-millis=5000 --enabled=true
Recipe #1.3 Host
 Application Server Database http://blog.arungupta.me/docker-orchestration-fig-techtip67/
Recipe #1.4 Host
 Application Server http://blog.arungupta.me/docker-container-linking-across-multiple-hosts-techtip69/ Host
 Database
Recipe #1.4 Host
 Application Server http://blog.arungupta.me/docker-container-linking-across-multiple-hosts-techtip69/ Host
 Database
Recipe #1.4 Host
 Application Server http://blog.arungupta.me/docker-container-linking-across-multiple-hosts-techtip69/ Host
 Database
Recipe #1.4 Host
 Application Server http://blog.arungupta.me/docker-container-linking-across-multiple-hosts-techtip69/ Host
 Database
Arquillian Cube • Controls the lifecycle of Docker images as part of test cycle - automatically or manually • Uses Docker REST API to talk to container • Talk using WildFly remote adapter (in container) • Try it out http://blog.arungupta.me/run-javaee-tests-wildfly-docker-arquillian-cube/
Docker: Pros and Cons
Docker: Pros and Cons • PROS • Extreme application portability • Very easy to create and work with derivative • Fast boot on containers
Docker: Pros and Cons • PROS • Extreme application portability • Very easy to create and work with derivative • Fast boot on containers • CONS • Host-centric solution • No higher-level provisioning • No usage tracking/reporting
Application Operating Environment
Kubernetes
Kubernetes • Open source orchestration system for Docker containers
Kubernetes • Open source orchestration system for Docker containers • Provide declarative primitives for the “desired state” • Self-healing • Auto-restarting • Schedule across hosts • Replicating
Concepts
Concepts • Pods: collocated group of Docker containers that share an IP and storage volume Docker Pod 1 Pod 2 C1 C2 C3
Concepts • Pods: collocated group of Docker containers that share an IP and storage volume • Service: Single, stable name for a set of pods, also acts as LB Docker Pod 1 Pod 2 C1 C2 C3 Pod 1 JBoss Pod 2 JBoss Service “web” port 8080 port 8080
Concepts • Pods: collocated group of Docker containers that share an IP and storage volume • Service: Single, stable name for a set of pods, also acts as LB • Replication Controller: manages the lifecycle of pods and ensures specified number are running Docker Pod 1 Pod 2 C1 C2 C3 Pod 1 JBoss Pod 2 JBoss Service “web” port 8080 port 8080
Concepts • Pods: collocated group of Docker containers that share an IP and storage volume • Service: Single, stable name for a set of pods, also acts as LB • Replication Controller: manages the lifecycle of pods and ensures specified number are running • Label: used to organize and select group of objects Docker Pod 1 Pod 2 C1 C2 C3 Pod 1 JBoss Pod 2 JBoss Service “web” port 8080 port 8080
kubectl
kubectl • Controls the Kubernetes cluster manager
kubectl • Controls the Kubernetes cluster manager • kubectl get pods or minions
kubectl • Controls the Kubernetes cluster manager • kubectl get pods or minions • kubectl create -f <filename>
kubectl • Controls the Kubernetes cluster manager • kubectl get pods or minions • kubectl create -f <filename> • kubectl update or delete
kubectl • Controls the Kubernetes cluster manager • kubectl get pods or minions • kubectl create -f <filename> • kubectl update or delete • kubectl resize —replicas=3 replicationcontrollers <name>
export KUBERNETES_PROVIDER=vagrant ./cluster/kube-up.sh Mac OS X Kubernetes (Vagrant) Master Minion
Recipe #2.1 Mac OS X Kubernetes (Vagrant) Master Minion Pod Docker
 (WildFly) http://blog.arungupta.me/javaee7-wildfly-kubernetes-mac-vagrant/
Services • Abstract a set of pods as a single IP and port • Simple TCP/UDP load balancing • Creates environment variables in other pods • Like “Docker links” but across hosts • Stable endpoint for pods to reference • Allows list of pods to change dynamically
Recipe #2.2 Minion Pod Docker
 (WildFly) Pod Docker
 (MySQL) MySQL Service http://blog.arungupta.me/mysql-kubernetes-service-access-wildfly-pod-techtip72/
Minion 2 Recipe #2.3 Minion 1 Pod Docker
 (WildFly) Pod Docker
 (MySQL) MySQL Service
Replication Controller
Replication Controller • Ensures specified number of pod “replicas” are running
Replication Controller • Ensures specified number of pod “replicas” are running • Pod templates are cookie cutters
Replication Controller • Ensures specified number of pod “replicas” are running • Pod templates are cookie cutters • Rescheduling
Replication Controller • Ensures specified number of pod “replicas” are running • Pod templates are cookie cutters • Rescheduling • Manual or auto-scale replicas
Replication Controller • Ensures specified number of pod “replicas” are running • Pod templates are cookie cutters • Rescheduling • Manual or auto-scale replicas • Rolling updates
Recipe #2.4
Recipe #2.4
Recipe #2.4 Minion 2 Minion 1 Pod Docker
 (WildFly) Pod Docker
 (MySQL) MySQL Service Pod Docker
 (WildFly) WildFly Service
Recipe #2.4 Minion 2 Minion 1 Pod Docker
 (WildFly) Pod Docker
 (MySQL) MySQL Service Pod Docker
 (WildFly) WildFly Service
Kubernetes: Pros and Cons • PROS • Manage related Docker containers as a unit • Container communication across hosts • Availability and scalability through automated deployment and monitoring of pods and their replicas, across hosts
Kubernetes: Pros and Cons • CONS • Lifecycle of applications - build, deploy, manage, promote • Port existing source code to run in Kubernetes • DevOps: Dev -> Test -> Production • No multi-tenancy • On-premise (available on GCE) • Assumes inter-pod networking as part of infrastructure • Requires explicit load balancer
Pod 7 ActiveMQ Pod 8 ActiveMQ “mq” port 8161 port 8161 Pod 1 Apache Pod 2 Apache “web” port 80 port 80 Pod 5 MySQL Pod 6 MySQL “db” port 3306 port 3306 Pod 3 JBoss Pod 4 JBoss “javaee” port 8080 port 8080
Pod 7 ActiveMQ Pod 8 ActiveMQ “mq” port 8161 port 8161 Pod 1 Apache Pod 2 Apache “web” port 80 port 80 Pod 5 MySQL Pod 6 MySQL “db” port 3306 port 3306 Pod 3 JBoss Pod 4 JBoss “javaee” port 8080 port 8080
Container Host Container Cluster Management User Experience
OpenShift 3 Features
OpenShift 3 Features • Push to production - full DevOps
OpenShift 3 Features • Push to production - full DevOps • Client tools for building web applications
OpenShift 3 Features • Push to production - full DevOps • Client tools for building web applications • Centralized administration and management of application component libraries
OpenShift 3 Features • Push to production - full DevOps • Client tools for building web applications • Centralized administration and management of application component libraries • Team and user isolation of containers, builds, and network communication in an easy multi-tenancy system
Recipe #3.1 • Start OpenShift as Docker container
 
 
 • Or run natively • Use osc (OpenShift Client) instead of kubectl with Kubernetes configuration file
Recipe #3.2 • (Alpha) tools generate project JSON configuration file that provide build/deployment
40
Recipe #3.3 • Integration with JBoss Developer Studio (cooking)
Summary • Container runtime and image distribution • Roll your own solutions for everything • Runtime and operational management of containers
 • Lifecycle of applications - build, deploy, manage, promote • Manage tens of thousands of applications with teams
References • blog.arungupta.me/topics/containers/ • github.com/openshift/origin

Package your Java EE Application using Docker and Kubernetes