Docker, Kubernetes & OpenShift
Build, containerize & orchestrate
Marko Lukša, Red Hat
mluksa@redhat.com
Docker
Docker concepts
Docker layers
Creating Docker images
Dockerfile
Dockerfile - example
# Use latest jboss/base-jdk:7 image as the base�FROM jboss/base-jdk:7��# Set the WILDFLY_VERSION env variable�ENV WILDFLY_VERSION 8.1.0.Final��# Add the WildFly distribution to /opt�RUN cd $HOME && curl http://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar zx && mv $HOME/wildfly-$WILDFLY_VERSION $HOME/wildfly��# Set the JBOSS_HOME env variable�ENV JBOSS_HOME /opt/jboss/wildfly��# Expose the ports we're interested in�EXPOSE 8080 9990��# Set the default command to run on boot�CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]
Kubernetes
Kubernetes architecture
Kubernetes concepts
Pods
apiVersion: v1beta1
id: www
desiredState:
manifest:
version: v1beta1
id: X
containers:
- name: nginx
image: dockerfile/nginx
- name: mydb
image: foo/mycooldb
Minion (Host) 1
A
Pod X
B
Pods (continued)
Minion (Host) 1
A
Pod X
B
Volumes
desiredState: manifest:
containers:
- name: A
image: foo/A
volumeMounts:
- name: vol1
mountPath: /data/vol1
volumes:
- name: vol1
source:
emptyDir: {}
Or:
hostDir: /opt/data/vol1
Minion (Host) 1
A
Pod X
B
Vol 1
Labels
“env”:”dev”, “env”:”prod”, “env”:”qa”
“rel”:”stable”, “rel”:”canary”
“partition”:”custA”, “partition”:”custB”
Minion (Host) 1
A
Pod X
B
Vol 1
“name”: “podX”,
“env”: “dev”
Replication controllers
id: replicationControllerY
kind: ReplicationController
desiredState:
replicas: 2
replicaSelector:
env: prod
rel: stable
podTemplate:
desiredState:
manifest:
...
labels:
- env: prod
- rel: stable
Minion (Host) 1
A
Pod X
Minion 2
Replication controller Y
(replicas: 2, podTemplate, replicaSelector: {“env”:”prod”, “rel”:”stable”})
B
Vol 1
“name”: “podX”,
“env”: “dev”
C
D
Pod Y1
“env”: “prod”,
“rel”: “stable”
C
D
Pod Y2
“env”: “prod”,
“rel”: “stable”
Services
id: myApp
kind: Service
apiVersion: v1beta1
port: 1234
selector:
env: prod
containerPort: 2345
Minion (Host) 1
A
Pod X
Minion 2
Replication controller Y
(replicas: 2, podTemplate, replicaSelector: {“env”:”prod”, “rel”:”stable”})
B
Vol 1
“name”: “podX”,
“env”: “dev”
C
D
Pod Y1
“env”: “prod”,
“rel”: “stable”
C
D
Pod Y2
“env”: “prod”,
“rel”: “stable”
myApp (selector: {env:prod})
Phased rollout / canary releases
Minion (Host) 1
A
Pod X
Minion 2
Replication controller Y
(replicas: 1, podTemplate, replicaSelector: {“env”:”prod”, “rel”:”stable”})
B
Vol 1
“name”: “podX”,
“env”: “dev”
Replication controller Y’ (replicas: 1, podTemplate, replicaSelector: {“env”:”prod”, “rel”:”canary”})
C
D
Pod Y1
“env”: “prod”,
“rel”: “stable”
myApp (selector: {env:prod})
“env”: “prod”,
“rel”: “stable”
C
D
Pod Y2
C’
D’
Pod Y’1
“env”: “prod”,
“rel”: “canary”
Remove/debug malfunctioning pod
Minion (Host) 1
A
Pod X
Minion 2
Replication controller Y
(replicas: 2, podTemplate, replicaSelector: {“env”:”prod”, “rel”:”stable”})
B
Vol 1
“name”: “podX”,
“env”: “dev”
C
D
Pod Y1
“env”: “prod”,
“rel”: “stable”
myApp (selector: {env:prod})
“env”: “prod”,
“rel”: “stable”
C
D
Pod Y2
C
D
Pod Y3
“env”: “prod”,
“rel”: “stable”
“env”: “debug”,
“rel”: “stable”
OpenShift v3