März 2016 Archive

Im letzten Blogpost haben wir uns angeschaut wie einfach Docker Network die bidirektionale Container-Kommunikation über mehrere Nodes hinweg ermöglicht. Selbstredend haben wir Galera dazu vewendet :)

Im heutigem Blogpost machen wir die selbe Chose nur via Docker Swarm. Docker Swarm wird vorausgesetzt. Der Aufbau eines Docker Swarm "Clusters" (Multi-Node-Setup) kann bei Bedarf gesondert behandelt werden.

Warum schauen wir uns Docker Swarm an?

Im letzten Blogpost wurde jeder Host direkt angesprochen. Das ist langfristig nicht praktisch. Mit Docker Swarm existiert eine Endpunkt um auf den ganzen Mulit-Host-Setup zuzugreifen. Wir wollen gar nicht expliziet wissen/bestimmen wo die Container laufen.

Der Einfachheit halber läuft auf dem Rechner mit der IP 172.17.152.11 der Management Prozess von Swarm (quasi ein Proxy) und horcht auf Port 2376.

Um uns Tipparbeit zu sparen:

export DOCKER_HOST=tcp://172.17.152.11:2376

Damit greifen wir mit docker immer auf den Swarm Management Port zu. Schauen wir uns noch den laufenden Galera Cluster des letzten Blogposts an(gekürzte Ausabe):

$ docker ps -f name=galera3 -f name=galera2 -f name=galera1
CONTAINER ID        IMAGE                      NAMES
751f4f071359        erkules/galera:basic       swarm3/galera3
24d4a2dfe3e2        erkules/galera:basic       swarm2/galera2
d3410d308171        erkules/galera:basic       swarm1/galera1

Zu beachten ist, dass die NAMES Spalte erweitert ist. Sie zeigt auf welchem Host der Container (swarm1,swarm2,swarm3) läuft.

Entfernen wir erst mal den alten Galera Cluster:

$ docker rm -f swarm3/galera3 swarm2/galera2 swarm1/galera1 
swarm3/galera3
swarm2/galera2
swarm1/galera1

Nun deployen wir einen neuen Cluster. Hierbei nutzen wir das Overlay-Netzwerk vom letzten Blogpost. Neu ist:

  • Wir sagen nicht auf welchem Host der Container laufen soll.
  • Der Container bekommt das Label galera=setup1.
  • Der Container soll auf keinem Host laufen, auf dem noch ein weiterer Container mit diesem Label läuft (affinity:...). Dadurch ist gewährleistet, dass nicht zwei Container des Clusters auf den gleichen Host laufen.

Bootstrapcontainer (galera1):

$ docker run -d --name galera1 --net galera  -e affinity:galera!=setup1 \
   --label galera=setup1 erkules/galera:basic \
   --wsrep-cluster-address=gcomm://galera1,galera2,galera3 --wsrep-new-cluster
1c3f8576cb124261c35412c7e643b341ec6f69d70c6a601b7dde8c3574774c42

galera2

$ docker run -d --name galera2 --net galera  -e affinity:galera!=setup1 \
   --label galera=setup1 erkules/galera:basic \
   --wsrep-cluster-address=gcomm://galera1,galera2,galera3 
611501de09b64475e9356dfb50be7f5bf179919a9e94e60b9d1e466bb7450437

galera3

$ docker run -d --name galera3 --net galera  -e affinity:galera!=setup1 \
   --label galera=setup1 erkules/galera:basic \
   --wsrep-cluster-address=gcomm://galera1,galera2,galera3 
582aaf272bb449733ca1b95cced1ae7b3ef2e20e105d09261a36b6a0912d9f07

Mal schnell verifizieren, dass alles geklappt hat:

$ docker ps   -f  label=galera=setup1 
CONTAINER ID        IMAGE                  NAMES
582aaf272bb4        erkules/galera:basic   swarm2/galera3
611501de09b6        erkules/galera:basic   swarm1/galera2
1c3f8576cb12        erkules/galera:basic   swarm3/galera1


$ docker exec  swarm1/galera2 \
   mysql -e 'show global status like "wsrep_cluster_size"'
Variable_name Value
wsrep_cluster_size 3

Jihaa!!!!

Starten wir noch schnell einen 4. Knoten:

    $ docker run -d --name galera4 --net galera  -e affinity:galera!=setup1 \
      --label galera=setup1 erkules/galera:basic \
      --wsrep-cluster-address=gcomm://galera1,galera2,galera3 
    docker: Error response from daemon: unable to find a node that satisfies galera!=setup1.
    See 'docker run --help'

Das ist gut so. Es kann und soll ja nicht klappen, da wir nur drei Nodes zur Verfügung haben :) Ach so wegen Planetmysql sollte im Blog wohl noch mal MySQL stehen ... dumdidum

Viel Spaß

Erkan

Moinsen,

heute ist die iX mit dem 2. Teil des Docker Tutorials heraus gekommen, den ich mit immenser Unterstützung des Redakteurs wuppen durfte :)

Viel Spaß
Erkan

Moinen,

Am Dienstag machen wir in Ffm ein Docker Meetup. Quasi wie ist der Stand von Docker mit HOFFENTLICH viel Diskussion :)
(Nur wer kommt kann mitblöken)

Grüßle
Erkan


Galera und Docker Network

tl;dr Docker Network ermöglicht zwischen Containern bidirektionale (und ungenattete) Kommunikation über hosts hinweg. Damit sind Galera-Setups ein Kinderspiel.

Einen Galera-Docker-Cluster über mehrer Hosts zu betreiben ist gelinde gesagt mühsam. Wer eine Idee davon erhalten will kann hier nachlesen.

Mit Docker-Network (ab 1.9) ist dies erfreulicher Weise Geschichte. Docker-Network ermöglicht es Container über mehrere Hosts hinweg in ein eigenes Netz zu stecken. Dazu ist noch ein einfaches (an DNS erinnerndes) Discovery über den gesetzten Containernamen möglich.

Dies vereinfacht Galera-Deployments ungemein, wie folgendes Beispiel zeigen soll. Es dient selbstredend nicht für Produktion und nicht nur weil das mein Image ist:) Wir gehen hier von drei Rechnern mit Docker-Network aus. Bei Bedarf kann ich was zum Setup schreiben.

  • Swarm1 IP=172.17.152.11
  • Swarm2 IP=172.17.152.12
  • Swarm3 IP=172.17.152.13

Noch existiert kein Netzwerk mit dem Namen galera:

$ DOCKER_HOST=172.17.152.11:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER

Das Netzwerk wird schnell erstellt:

$ DOCKER_HOST=172.17.152.11:2375 docker network create -d overlay galera 
b0cadfa914206c212cce0de611d500620cd07bcae289841f7dc03c26d19b6e91


$ DOCKER_HOST=172.17.152.11:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay

Auch die beiden anderen Rechner kennen nun das Netz:

$ DOCKER_HOST=172.17.152.12:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay             

$ DOCKER_HOST=172.17.152.13:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay

Nun Starten wir einfach ein Galera Cluster auf den drei Rechnern. Entscheidend für den Discovery sind die Containernamen. Zu achten ist auf die --net Option.

$ DOCKER_HOST=172.17.152.11:2375 docker run -d --name galera1 \
  --net galera erkules/galera:basic --wsrep-cluster-address=gcomm://
d3410d308171df5a3ef2da3b37a7d11ea6479dc8550eea24447d488cbf490a0d

$ DOCKER_HOST=172.17.152.12:2375 docker run -d --name galera2 \
  --net galera  erkules/galera:basic --wsrep-cluster-address=gcomm://galera1
24d4a2dfe3e2ba6914c83c92f814116ff72d5de8daba8304fe89ed3661f57270

$ DOCKER_HOST=172.17.152.13:2375 docker run -d --name galera3 \
 --net galera  erkules/galera:basic --wsrep-cluster-address=gcomm://galera1
751f4f071359495a28e31bc996b62c2042283ee08df0194b7871402e2f851e06

Schauen wir mal ob wir einen Cluster haben:

$ DOCKER_HOST=172.17.152.13:2375 docker exec -ti galera3 \
  mysql -e 'show status like "wsrep_cluster_size"' 
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Verglichen mit dem obigen Link ist das sehr simple. Docker Network vereinfacht auch klassische MySQL Replikationsdeplyments. Gerade wenn dazu --links verwendet wurde. Schon allein weil --links deprecated ist;) Im nächsten Blogpost machen wir das mit Docker Swarm.

Viel Spaß :)

Erkan

Galera und Docker Network

tl;dr Docker Network ermöglicht zwischen Containern bidirektionale (und ungenattete) Kommunikation über hosts hinweg. Damit sind Galera-Setups ein Kinderspiel.

Einen Galera-Docker-Cluster über mehrer Hosts zu betreiben ist gelinde gesagt mühsam. Wer eine Idee davon erhalten will kann hier nachlesen.

Mit Docker-Network (ab 1.9) ist dies erfreulicher Weise Geschichte. Docker-Network ermöglicht es Container über mehrere Hosts hinweg in ein eigenes Netz zu stecken. Dazu ist noch ein einfaches (an DNS erinnerndes) Discovery über den gesetzten Containernamen möglich.

Dies vereinfacht Galera-Deployments ungemein, wie folgendes Beispiel zeigen soll. Es dient selbstredend nicht für Produktion und nicht nur weil das mein Image ist:) Wir gehen hier von drei Rechnern mit Docker-Network aus. Bei Bedarf kann ich was zum Setup schreiben.

  • Swarm1 IP=172.17.152.11
  • Swarm2 IP=172.17.152.12
  • Swarm3 IP=172.17.152.13

Noch existiert kein Netzwerk mit dem Namen galera:

$ DOCKER_HOST=172.17.152.11:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER

Das Netzwerk wird schnell erstellt:

$ DOCKER_HOST=172.17.152.11:2375 docker network create -d overlay galera 
b0cadfa914206c212cce0de611d500620cd07bcae289841f7dc03c26d19b6e91


$ DOCKER_HOST=172.17.152.11:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay

Auch die beiden anderen Rechner kennen nun das Netz:

$ DOCKER_HOST=172.17.152.12:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay             

$ DOCKER_HOST=172.17.152.13:2375 docker network ls --filter "name=galera"
NETWORK ID          NAME                DRIVER
b0cadfa91420        galera              overlay

Nun Starten wir einfach ein Galera Cluster auf den drei Rechnern. Entscheidend für den Discovery sind die Containernamen. Zu achten ist auf die --net Option.

$ DOCKER_HOST=172.17.152.11:2375 docker run -d --name galera1 \
  --net galera erkules/galera:basic --wsrep-cluster-address=gcomm://
d3410d308171df5a3ef2da3b37a7d11ea6479dc8550eea24447d488cbf490a0d

$ DOCKER_HOST=172.17.152.12:2375 docker run -d --name galera2 \
  --net galera  erkules/galera:basic --wsrep-cluster-address=gcomm://galera1
24d4a2dfe3e2ba6914c83c92f814116ff72d5de8daba8304fe89ed3661f57270

$ DOCKER_HOST=172.17.152.13:2375 docker run -d --name galera3 \
 --net galera  erkules/galera:basic --wsrep-cluster-address=gcomm://galera1
751f4f071359495a28e31bc996b62c2042283ee08df0194b7871402e2f851e06

Schauen wir mal ob wir einen Cluster haben:

$ DOCKER_HOST=172.17.152.13:2375 docker exec -ti galera3 \
  mysql -e 'show status like "wsrep_cluster_size"' 
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Verglichen mit dem obigen Link ist das sehr simple. Docker Network vereinfacht auch klassische MySQL Replikationsdeplyments. Gerade wenn dazu --links verwendet wurde. Schon allein weil --links deprecated ist;) Im nächsten Blogpost machen wir das mit Docker Swarm.

Viel Spaß :)

Erkan

Moinsen,

Ich habe feststellen dürfen, dass ich nächsten Monat noch zwei Kurse im Linuxhotel gebe: 

Für alle, die wissen wollen welche damalige Zukunft heute Gegenwart für Linuxadmins ist:
Linux Admin Update vom 18.-19.04 (Cgroups/Namespaces/Capabilities/systemd)

Und für alle, die auch mal OS-Container machen wollen. Ich denke wir werden auch noch
LXD machen :) 
LXC LinuxContainers vom 20.-21.04. Geht auch beides in einem Rutsch :)

Viel Spaß
Erkan