Download - Docker dev, test & production (afas)
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 [email protected]
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