Docker dev, test & production (afas)

Preview:

Citation preview

Docker: dev, test & production

Wouter Lagerweij & Michiel Rook@wouterla @michieltcs

Agile / Lean coach@wouterla

Developer, trainer & coach@michieltcs

TODAY

▸ Introduction

▸ Dev

▸ Test

▸ Production

▸ Closing

CONTINUOUS EVERYTHING

DEV BUILD / TEST

CONTINUOUS INTEGRATION

DEV BUILD / TEST ACCEPTANCE PRODUCTION

CONTINUOUS DELIVERY

DEV BUILD / TEST STAGING PRODUCTION

CONTINUOUS DEPLOYMENT

WHY CONTINUOUS DEPLOYMENT

▸ Small steps

▸ Early feedback

▸ Reduce cycle time

▸ Reduce risk

▸ Experiments!

SUCCESSFUL TEAMS HAVE

DEVOPS

AGILE

DockerfileFROM java:openjdk-8MAINTAINER development@make.io

ADD target/universal/stage /opt/landingpageADD deploy/logback.xml /opt/landingpage/conf/logback.xml

EXPOSE 9000

WORKDIR /opt/landingpage

CMD bin/landingpage

Building the imagedocker build -t landingpage-demo .

docker images

Running a containerdocker run landingpage-demo

docker ps

docker stop landingpage-demo

docker stop <id>

docker run -p 9000:9000 landingpage-demo

Networkingdocker run -p 9999:9000 --name demo landingpage-demo

docker rm -f demo

docker run -p 9000:9000 --name demo -d landingpage-demo

TESTING

ConfigurationEnvironment variables

docker run -d -p 27017:27017 -p 28017:28017 -e AUTH=no --name mongo tutum/mongodb

docker psdocker logs mongo

Inject configuration file

docker run -v ${PWD}/conf/application.conf.local:/opt/landingpage/conf/application.conf --name demo landingpage-demo

Linking containers (compose)version: '2'services: demo: build: . ports: - "9000:9000" depends_on: - mongodb mongodb: image: tutum/mongodb ports: - "27017:27017" - "28017:28017" environment: - AUTH=”no”

docker exec -it landingpagedemo_demo_1 bash

vim /opt/landingpage/conf/application.conf

apt-get update && apt-get install vim

rm /opt/landingpage/RUNNING_PIDexit

docker stop demodocker start demodocker exec -it demo bashvim /opt/landingpage/conf/application.confexit

Debugging

docker-compose stopdocker-compose rmdocker-compose updocker exec -it demo bashcat /opt/landingpage/conf/application.confexit

PRODUCTION

First Steps● Ansible for deployment (pets, not cattle)● All of our own services on all production hosts● Supporting services (elastic, rabbit) on separate, dedicated machines● Load-balanced by port

Orchestration● Clustering● Scheduling● Self-healing● Autoscaling● Networking● Immutable

Kubernetes

Kubernetesminikube

eval $(minikube docker-env)docker build -t landingpage-demo:step-3 .

kubectl create -f kube-deploy.yaml

apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: demo-podspec: replicas: 1 template: metadata: labels: app: demo spec: containers: - name: demo image: landingpage-demo:step-3 ports: - containerPort: 9000 # hostPort: 9000 - name: mongodb image: tutum/mongodb:latest ports: - containerPort: 27017 env: - name: AUTH value: 'no'

KubernetesapiVersion: v1kind: Servicemetadata: name: demo labels: app: demospec: type: NodePort ports: - targetPort: 9000 nodePort: 32000 port: 9000 name: http selector: app: demo

Rolling update

PULL IMAGE

START NEW CONTAINER

WAIT FOR PORT

SMOKE TESTS / HEALTH CHECKS

ADD NEW CONTAINER TO LB

REMOVE OLD CONTAINER FROM LB

STOP OLD CONTAINER

Storage● Dynamic provisioning● Cloud: AWS, GCE, Azure, ...● Volume claims● Region & zone matching

Networking● Weave, Flannel, …● Assign IPs to containers, services● Virtual networks● Ingress● Routing

Turn-key Continuous Deployment

Zero downtime deployments

Modern, autoscaling infrastructure with built-in monitoring

Pipeline in five minutes

Recommended