Slide 1

Slide 1 text

Docker Swarm the Docker-native clustering system Docker Online Meetup [#SwarmWeek Edition] - 03/10/2016 @vieux

Slide 2

Slide 2 text

Running containers on multiple hosts

Slide 3

Slide 3 text

Without Docker Swarm Docker CLI Docker CLI Docker CLI

Slide 4

Slide 4 text

With Docker Swarm Docker CLI Docker CLI Swarm

Slide 5

Slide 5 text

Swarm in a nutshell • Exposes several Docker Engines as a single virtual Engine • Serves the standard Docker API • Extremely easy to get started • Batteries included but swappable

Slide 6

Slide 6 text

Setup: Without networking

Slide 7

Slide 7 text

Setup using the hosted discovery service /!\ Not to be used in production, for testing only /!\ • Create a cluster: $ swarm create • Add nodes to a cluster: $ swarm join --advertise=: token:// • Start Swarm $ swarm manage <…> token://

Slide 8

Slide 8 text

Setup using your own K/V store • Add nodes to a cluster: $ swarm join --advertise=: \ consul://: • Start Swarm $ swarm manage <…> consul://: You can also use etcd or zookeeper

Slide 9

Slide 9 text

Setup using a file (static list of nodes) • Add nodes to the file: $ echo 10.0.0.1:2375 > my_cluster $ echo 10.0.0.2:2375 >> my_cluster $ echo 10.0.0.3:2375 >> my_cluster • Start Swarm $ swarm manage <…> file://my_cluster

Slide 10

Slide 10 text

Setup: With networking

Slide 11

Slide 11 text

Setup using your own K/V store • Configure networking on engine $ docker daemon --cluster-advertise=: \ --cluster-store=consul://: • Start Swarm $ swarm manage <…> --discovery-opt kv.path=docker/docker \ consul://: You can also use etcd or zookeeper

Slide 12

Slide 12 text

Docker Swarm internals

Slide 13

Slide 13 text

Resource Management • Memory $ docker run -m 1g … • CPU $ docker run -c 1 … • Ports $ docker run -p 80:80 …

Slide 14

Slide 14 text

Constraints • Standard constraints induced from docker info docker run -e “constraint:operatingsystem==*fedora*” … docker run -e “constraint:storagedriver==*aufs*” … • Custom constraints with host labels docker daemon --label “region=us-east” docker run -e “constraint:region==us-east” … • Pin a container to a specific host docker run –e “constraint:node==node-2” …

Slide 15

Slide 15 text

Affinities • Containers affinities docker run --name web nginx docker run -e “affinity:container==web” logger • Containers Anti-affinities docker run --name redis-master redis docker run --name redis-slave -e “affinity:container!=redis*” … • Images affinities docker run -e “affinity:image==redis” redis

Slide 16

Slide 16 text

Soft Affinities/Constraints • Soft Contraints docker run -e “constraint:operatingsystem==~*fedora*” … docker run -e “constraint:region==~us-east” … • Soft Affinities docker run --name redis-master redis docker run --name redis-slave -e “affinity:container!=~redis*” …

Slide 17

Slide 17 text

Swarm Scheduler 2 steps: • 1- Apply filters to exclude nodes - ports - constraints - affinity - health - dependency • 2- Use a strategy to rank and pick the best node - binpack - spread - random

Slide 18

Slide 18 text

New in Swarm 1.1 • Improved node management • Rescheduling (EXPERIMENTAL) • New events

Slide 19

Slide 19 text

Improved node management: docker info Nodes: 3 (unknown): 10.0.0.9:2375 … ʦ Status: Pending node-1: 10.0.0.1:2375 ʦ Status: Unhealthy … ʦ Error: Cannot connect to the docker engine endpoint ʦ UpdatedAt: 2016-02-09T19:52:56Z node-2: 10.0.0.0:2375 ʦ Status: Healthy … ʦ Labels: kernelversion=4.2.0-23-generic, operatingsystem=Ubuntu 14.04.3 LTS, … ʦ Error: (none) ʦ UpdatedAt: 2016-02-09T19:52:56Z

Slide 20

Slide 20 text

Rescheduling • Experimental feature swarm --experimental manage … • On node failure docker run -e “reschedule:on-node-failure” …

Slide 21

Slide 21 text

On-failure rescheduling Docker CLI Docker CLI “on-node-failure” “off”

Slide 22

Slide 22 text

On-failure rescheduling Docker CLI Docker CLI Node Failure

Slide 23

Slide 23 text

On-failure rescheduling Docker CLI Docker CLI Node Failure

Slide 24

Slide 24 text

New events $ docker events … 2016-02-09T12:02:01 container create XXX (com.docker.swarm.id=YYY, image=busybox, node.addr=10.0.0.1:2375, node.name=node-1) … 2016-02-09T12:02:01 network connect ZZZ (node.name=node-1, type=bridge, container=XXX, name=bridge, node.addr=10.0.0.1:2375,) … 2016-02-09T12:03:10 swarm engine_connect (node.name=node-2, node.addr=10.0.0.2:2375) …

Slide 25

Slide 25 text

Demo Docker CLI Docker CLI = RAM: 1GB CPU: 1core

Slide 26

Slide 26 text

Demo Docker CLI Docker CLI = RAM: 1GB CPU: 1core

Slide 27

Slide 27 text

Voting App Redis queue Java worker PG database Results app

Slide 28

Slide 28 text

Voting App Redis queue Java worker PG database Results app “vote” network “result” network 10.0.1.0/24 10.0.2.0/24

Slide 29

Slide 29 text

http://github.com/docker/swarm #docker-swarm on freenode @vieux Thank You. Questions?