Dezember 2014 Archive

Docker Swarm für Dummies

Auf der Dockercon 2014 in Amsterdam wurde das neue Projekt Docker Swarm vorgestellt. Docker Swarm behauptet von sich ein *a Docker-native clustering system * zu sein. Zum jetzigen Zeitpunkt handelt es sich um nicht viel mehr als einen Proxy.

Die Projekthomepage ist hier zu finden: https://github.com/docker/swarm

Voraussetzung

Wir brauchen Docker mit einer Version ab 1.4. Zudem muss Docker so laufen, dass auf TCP (-H 0.0.0.0.0:2375)gelauscht wird.

Folgend wird bei gestopptem Docker Service der Daemon direkt auf der Kommandozeile gestartet.

docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock  --label hallo=welt

Die --label Option ist neu und erlaubt es Nodes weitere Eigenschaften zu definieren.

Mit der Installation von Docker Swarm beschäftige ich mich hier nicht weiter. Bei gesetztem GOPATH reicht:

go get -u github.com/docker/swarm

Unter ${GOPATH}/bin ist dann das Binary swarm zu finden.

Discovery

Anders als auf der Projekthomepage wo ein an etcd erinnernder Discovery Mechanismus genutzt wird, nehmen wir einen noch viel simpleren Anlauf. (Credits an aluzzardi von #docker-swarm)

Für dieses Setup haben wir nun zwei Docker Daemons/Rechner laufen. Einmal auf dem Host 192.168.178.50 (mit dem Label hallo=welt) und auf dem Host mit der IP 192.168.178.66. 192.168.178.50 ist ein Laptop und auf dem starte ich den Manager

./swarm manage --addr '192.168.178.66:4243' 192.168.178.66:2375 192.168.178.50:2375

Hier steht nichts weiter, als dass der Manager via 192.168.178.66:4243 erreichbar ist und 192.168.178.66:2375 192.168.178.50:2375 seine Backends sind.

Der Witz an Docker Swarm ist, dass die Docker API durchgängig genutzt werden kann. Anfragen werden nun schlicht an den Manager geschickt.

Folgendes gibt uns einen kleinen Überblick:

# docker -H 192.168.178.66:4243 info
Containers: 30
Nodes: 2
homeserver: http://192.168.178.50:2375
abla: http://192.168.178.66:2375

Das Erstellen der Container erfolgt analog zu sonst. Der Default-Scheduler (derzeit gibt es zwei) packt einen Server nach dem anderen voll. Wobei er hier nach Speicherverbrauch geht. Der zweite Scheduler verteilt die Aufträge random.

Wir können aber auch anhand von Labels (Informationen über die Nodes) entscheiden wo der Container gestartet werden soll. Schauen wir uns mal ein paar Kommandos an:

# docker -H 192.168.178.66:4243 run -d  --name eins  busybox sleep 1000                                                                       
13cad054af3c32b9171f8ebb3ec06bc761f7dd22125a6e757ea3f221adc37cd1
# docker -H 192.168.178.66:4243 run -d  --name zwei  busybox sleep 1000                                                                       
f4047debfdb21b571d17dc2ee37d88f129fc822195386f92093f4cc55cd11f20
# docker -H 192.168.178.66:4243 run -d  --name drei -e constraint:node=abla busybox sleep 100                                                 
30306c3c11192309612f50e25a1409a2b7cb15f2c691f49040b356d76d0bd638
# docker -H 192.168.178.66:4243 run -d  --name hallowelt -e constraint:hallo=welt  busybox sleep 100
b9c38a47c2aafffeb6ed28ea07d780a803a234261fcfb52a2a5ad88f982ad530
# docker -H 192.168.178.66:4243 ps 
CONTAINER ID        IMAGE                       COMMAND             CREATED                  STATUS                  PORTS               NAMES
b9c38a47c2aa        busybox:latest              "sleep 100"         Less than a second ago   Up Less than a second                       abla/hallowelt   
f4047debfdb2        busybox:latest              "sleep 1000"        29 seconds ago           Up 30 seconds                               homeserver/zwei        
30306c3c1119        busybox:buildroot-2014.02   "sleep 100"         36 seconds ago           Up 13 seconds                               abla/drei              
13cad054af3c        busybox:latest              "sleep 1000"        39 seconds ago           Up 40 seconds                               homeserver/eins

Wie an der NAMES Spalte zu erkennen sind Kontianer eins und zwei auf homeserver gestartet. Der Rechner abla (große Schwester) wurde einmal via Name und dem oben gesetztem Label angesprochen.

Docker Swarm ist lustig und nimmt stark fahrt auf. Mal sehen wann es sich mit z.B. CoreOS messen lassen kann.