Open Beta: Kostenlose Docker-Platform im Test

mydocker

oder auch: „Kostenloser CS:GO-Server für Jedermann“

Ich habe mir heute als eine mögliche OpenVPS-Alternative den Dienst MyDocker.io angesehen, bei dem man derzeitig während der Open Beta-Phase (und als Blogger auch dauerhaft danach!) kostenlos Docker-Container laufen lassen kann. Das klingt spannend und ist es auch. Was es bringt und wie das alles genau funktioniert habe ich mir mal angeschaut…

Was ist Docker?

Docker ist quasi die Evolution der VServer, bei denen man noch einen Schritt weitergeht und einzelne Anwendungen mit ihren direkten Abhängigkeiten in so etwas wie eine minimale, leichtgewichtige virtuelle Maschine stopft, dessen Image dann auch noch zwischen vielen Instanzen desselben Images geteilt werden kann. Dies bringt dem Hoster Vorteile, weil er etwa keine 200 MB pro Linux Installation wie bei einer OpenVPS mehrfach vorhalten muss und somit natürlich auch dem Kunden, weil dadurch solche Dienste nochmals günstiger angeboten werden können. Man darf sich einen Docker Container also wie eine VPS vorstellen, die man allerdings nach einem eigenen Rezept namens „Dockerfile“ auf seine Bedürfnisse zusammenstellen kann, beim zentralen Docker Hub hostet und bei beliebig vielen Hostern in beliebig vielen Instanzen ausführt.

Da ich in Kürze das Prinzip und die komplexe, aber hochinteressante Funktionsweise von Docker gar nicht greifbar erklären kann, verweise ich lieber hiermit auf einen Heise Developer Artikel, der dies in aller Ausführlichkeit besser erklärt: http://www.heise.de/developer/artikel/Anwendungen-mit-Docker-transportabel-machen-2127220.html

Wie funkioniert Docker bei MyDocker.io?

Der Hoster Linevast macht hier keine Experimente sondern setzt im Backend eine Software namens KuberDock ein, die laut ihrer Partnerliste auch von anderen bekannten Hostern wie etwa GoDaddy eingesetzt wird. Die Dokumentation unter http://docs.kuberdock.com/ ist jedenfalls ausreichend um sich schnell im MyDocker Hub zurecht zu finden. mydocker_kuberdock

Während also die Verwaltung im KuberDock das Muss für Profis ist, bietet MyDocker darüber hinaus für Einsteiger bzw. Nicht-Techniker noch einen vereinfachten Modus für die schnelle Installation gängiger Pakete wie etwa DokuWiki, WordPress, OwnCloud und… ich muss schmunzeln… einen CS:GO-Server (!).

mydocker_produktauswahl

Es werden für die Installation je nach Bedarf verschieden viele Kubes empfohlen:

mydocker_csgo

Die Installation erfolgt dann automatisch. Da ich kein Counterstrike-Spieler bin habe ich dies mal zum Spaß für OwnCloud durchgeführt:

mydocker_owncloud

Und es funktioniert! <3

Eigene Docker Images erstellen und deployen

Der Docker-Account

Eine Voraussetzung für den ganzen Spaß ist ein kostenloser Account auf docker.com . Dafür benötigt man nur einen Nutzernamen, eine E-Mail und ein Passwort und ist damit ohne weitere Angaben persönlicher Daten schnell mit dabei. Jetzt hat man Zugang zum Docker-Repository, in welchem man sogar kostenlos einen privaten, nicht öffentliche sichtbaren Container hochladen darf – weitere private muss man bezahlen oder eben doch öffentlich zur Verfügung stellen.

Der manuelle Weg

Ich habe für den Bau meines Docker-Images das experimentelle „Docker for Windows“ ausprobiert, welches hier beschrieben wird und heruntergeladen werden kann und schon recht stabil läuft.

Ich wollte für den Anfang ein einfaches Benchmarking-Image haben, welches Apache + PHP5 enthält, einen SSH Zugang anbietet und das PHP-Benchmark-Skript sowie UnixBench bereits vorinstalliert hat. Ich habe mich hierfür auf diese beiden Anleitungen gestützt:

Die essentielle „Dockerfile“ sowie die zusätzlich benötigten Dateien für meinen eigenen Docker-Container finden sich in meinem GitHub: https://github.com/StefanOltmann/docker-benchmark

Wenn man in der Eingabeaufforderung im selben Verzeichnis wie die „Dockerfile“ ist, geht das Bauen des Images mit diesen Befehlen recht einfach:

docker build -t stefanoltmann/docker-benchmark .

Dieser Befehl erstellt für den Namespace „stefanoltmann“ (= meine Docker-ID) ein Docker Image namens „docker-benchmark“ ausgehend vom aktuellen Verzeichnis („.“).

docker run -d -P --name benchmark_test stefanoltmann/docker-benchmark

Hiermit wird das gerade erstellte Docker-Image als Container „benchmark_test“ gestartet. Mit dem Befehl „docker ps“ gibt es eine Übersicht der gerade laufenden Container. In dieser Ansicht wird auch angezeigt auf welche Ports die Services wie etwa SSH und Apache gemapped worden sind, damit man sich testweise einloggen bzw. die Apache Willkommen-Seite anzeigen lassen kann.

docker login

Mit diesem Befehl ist ein Login in den Docker-Account möglich. Dies ist erforderlich, um im nächsten Schritt das erstellte Image hochzuladen.

docker push stefanoltmann/docker-benchmark

Hiermit wird das erstellte Docker-Image hochgeladen und steht zur Installation auf MyDocker.io bzw. allen anderen Docker-Plattformen bereit.

Der automatische Weg über GitHub

Die Seite https://docs.docker.com/docker-hub/github/ beschreibt, wie ein automatischer Build über GitHub ausgelöst werden kann, wodurch die lokale Installation von Docker komplett entfallen kann.

Solange Docker die Autobuild-Funktionalität in der Beta hat kostet dies auch nichts. 🙂

Im Wesentlichen muss man seinen Docker-Account nur mit seinem GitHub-Account verknüpfen und alles andere findet sich. Vielleicht liefere ich dazu ja nochmal ein Tutorial nach, wenn Interesse besteht.

Die Performance

Wie schon bei den OpenVPS haben wir auch beim Docker-Service wieder das gleiche Problem dass alles in „Cores“ bzw. hier in „Kubes“ angegeben wird und ich mir ohne konkrete Performance-Messungen dazu überhaupt nichts vorstellen kann.

Daher möchte ich hier einmal ein paar Messergebnisse vorstellen und gegenrechnen, ob sich für den Einsatz einer PHP-Anwendung nun eine VPS oder ein Docker-Pod eher eignet.

Das System under Test

Die kostenlose Open Beta Test-Maschine ist als „Low CPU“ betitelt und bildet mit „0.5 Cores“ wohl eine durchschnittliche Leistung des geplanten Portfolios. Die ausgegrauten Einträge „Tiny“, „Standard“, „High Memory“ sind nach Auskunft von MyDocker die Standardeinträge von Kuberdock und für das Portfolio nicht geplant. Es wird somit lediglich die Auswahl zwischen „High CPU“ und „Low CPU“ geben.

mydocker_kubes

Als Host-System verwendet MyDocker 2x Intel(R) Xeon(R) CPU E5-2670 oder besser. Die Ausgabe von „lscpu“ weist allerdings nur eine „Virtual CPU“ aus, damit es bei einer Live-Migration auf ein anderes Hostsystem nicht aufgrund verschiedener CPU Flags zu Problemen kommt. Die interessante Information hier ist also, dass es 8 Kerne gibt und diese auf 2.6 GHz takten.

Getestet wurde mit dem im ersten Teil des Artikels aufbereiteten Docker-Image.

Vergleich

Zur Einordnung der Werte hier nochmal aus dem alten Post die Werte der „VPS Starter„, die es als lange zum Promotion-Preis für 29€ pro Jahr gab. Dieses System hat 2 vCore a 3 GHz.

--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2014-10-06 13:38:23  
Server : www.stefanoltmann.de@31.214.242.103  
PHP version : 5.4.4-14+deb7u14  
Platform : Linux  
--------------------------------------
test_math                 : 0.938 sec.  
test_stringmanipulation   : 0.902 sec.  
test_loops                : 0.622 sec.  
test_ifelse               : 0.413 sec.  
--------------------------------------
Total time:               : 2.875 sec.  
stefan@stefanoltmann:~$ time echo "scale=1000; 4*a(1)" | bc -l  
real 0m0.346s  
user 0m0.309s  
sys  0m0.015s  

Benchmark mit einem Kube

--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2016-07-02 12:40:49  
Server : 31.172.83.223@10.254.75.22  
PHP version : 5.6.22-0+deb8u1  
Platform : Linux  
--------------------------------------
test_math                 : 3.908 sec.  
test_stringmanipulation   : 4.075 sec.  
test_loops                : 1.918 sec.  
test_ifelse               : 1.813 sec.  
--------------------------------------
Total time:               : 11.714 sec.  
real    0m0.966s  
user    0m0.470s  
sys     0m0.002s  

Im htop ist sichtbar dass die Maschine tatsächlich 8 Kerne hat und während des Benchmarks zufällig einer davon genau zu 50% ausgelastet wird. So gehen also keine Überraschung.

Benchmark mit zwei Kubes

Das Upgrade des Containers auf „2 Kubes je 0.5 Cores = 1.0 Cores“ ist mit einem Klick im Kuberdock gemacht und dauert ca. 20 Sekunden bis zum Abschluss. Ein wirklich sehr kurzfristiges Upgrade der Leistung ohne Support-Interaktion ist damit also jederzeit möglich.

--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2016-07-02 13:04:56  
Server : 31.172.83.223@10.254.75.23  
PHP version : 5.6.22-0+deb8u1  
Platform : Linux  
--------------------------------------
test_math                 : 1.818 sec.  
test_stringmanipulation   : 1.861 sec.  
test_loops                : 0.894 sec.  
test_ifelse               : 0.667 sec.  
--------------------------------------
Total time:               : 5.24 sec.  
real    0m0.473s  
user    0m0.473s  
sys     0m0.000s  

Im htop zeigt sich, dass nun auch ein ganzer Kern ausgelastet wird. Entsprechend hat sich die Ausführungszeit der Skripte auch halbiert.

Das Unix-Bench-Ergebnis:

   BYTE UNIX Benchmarks (Version 5.1.3)

   System: 1582b5a2-c422-4210-82c7-59c1199af0c4-mcqyf: GNU/Linux
   OS: GNU/Linux -- 3.10.0-327.18.2.el7.x86_64 -- #1 SMP Thu May 12 11:03:55 UTC 2016
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 1: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 2: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 3: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 4: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 5: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 6: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   CPU 7: QEMU Virtual CPU version (cpu64-rhel6) (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   17:18:19 up 13 days, 16:00,  1 user,  load average: 0.71, 0.71, 0.54; runlevel unknown

------------------------------------------------------------------------
Benchmark Run: Wed Jul 06 2016 17:18:19 - 17:47:47  
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       27496874.8 lps   (10.0 s, 7 samples)  
Double-Precision Whetstone                     3329.0 MWIPS (9.7 s, 7 samples)  
Execl Throughput                               1568.0 lps   (29.5 s, 2 samples)  
File Copy 1024 bufsize 2000 maxblocks        625429.9 KBps  (30.0 s, 2 samples)  
File Copy 256 bufsize 500 maxblocks          186964.3 KBps  (30.0 s, 2 samples)  
File Copy 4096 bufsize 8000 maxblocks       1285361.4 KBps  (30.0 s, 2 samples)  
Pipe Throughput                             1126967.3 lps   (10.0 s, 7 samples)  
Pipe-based Context Switching                 129477.6 lps   (10.0 s, 7 samples)  
Process Creation                               3758.0 lps   (30.0 s, 2 samples)  
Shell Scripts (1 concurrent)                   2980.3 lpm   (60.0 s, 2 samples)  
Shell Scripts (8 concurrent)                    377.2 lpm   (60.0 s, 2 samples)  
System Call Overhead                        1849778.9 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX  
Dhrystone 2 using register variables         116700.0   27496874.8   2356.2  
Double-Precision Whetstone                       55.0       3329.0    605.3  
Execl Throughput                                 43.0       1568.0    364.7  
File Copy 1024 bufsize 2000 maxblocks          3960.0     625429.9   1579.4  
File Copy 256 bufsize 500 maxblocks            1655.0     186964.3   1129.7  
File Copy 4096 bufsize 8000 maxblocks          5800.0    1285361.4   2216.1  
Pipe Throughput                               12440.0    1126967.3    905.9  
Pipe-based Context Switching                   4000.0     129477.6    323.7  
Process Creation                                126.0       3758.0    298.3  
Shell Scripts (1 concurrent)                     42.4       2980.3    702.9  
Shell Scripts (8 concurrent)                      6.0        377.2    628.6  
System Call Overhead                          15000.0    1849778.9   1233.2  
                                                                   ========
System Benchmarks Index Score                                         824.0

------------------------------------------------------------------------
Benchmark Run: Wed Jul 06 2016 17:47:47 - 18:49:46  
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables       22558599.2 lps   (10.0 s, 7 samples)  
Double-Precision Whetstone                    24388.2 MWIPS (9.8 s, 7 samples)  
Execl Throughput                               1536.9 lps   (29.3 s, 2 samples)  
File Copy 1024 bufsize 2000 maxblocks        318702.6 KBps  (30.0 s, 2 samples)  
File Copy 256 bufsize 500 maxblocks           97648.8 KBps  (30.0 s, 2 samples)  
File Copy 4096 bufsize 8000 maxblocks        809791.8 KBps  (30.0 s, 2 samples)  
Pipe Throughput                              809016.1 lps   (10.0 s, 7 samples)  
Pipe-based Context Switching                  86597.1 lps   (10.0 s, 7 samples)  
Process Creation                               3500.4 lps   (30.0 s, 2 samples)  
Shell Scripts (1 concurrent)                   2664.3 lpm   (60.1 s, 2 samples)  
Shell Scripts (8 concurrent)                    332.5 lpm   (60.5 s, 2 samples)  
System Call Overhead                         634402.9 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX  
Dhrystone 2 using register variables         116700.0   22558599.2   1933.0  
Double-Precision Whetstone                       55.0      24388.2   4434.2  
Execl Throughput                                 43.0       1536.9    357.4  
File Copy 1024 bufsize 2000 maxblocks          3960.0     318702.6    804.8  
File Copy 256 bufsize 500 maxblocks            1655.0      97648.8    590.0  
File Copy 4096 bufsize 8000 maxblocks          5800.0     809791.8   1396.2  
Pipe Throughput                               12440.0     809016.1    650.3  
Pipe-based Context Switching                   4000.0      86597.1    216.5  
Process Creation                                126.0       3500.4    277.8  
Shell Scripts (1 concurrent)                     42.4       2664.3    628.4  
Shell Scripts (8 concurrent)                      6.0        332.5    554.1  
System Call Overhead                          15000.0     634402.9    422.9  
                                                                   ========
System Benchmarks Index Score                                         690.3  

Benchmark mit drei Kubes

Ein Test mit „3 Kubes je 0.5 Cores = 1.5 Cores“ bringt natürlich aufgrund der Natur des PHP-Benchmark-Skripts keine weiteren Verbesserungen, weil dieses nur einen CPU Kern auslasten kann.

Direkt verglichen mit der „VPS Starter“ mit 3 GHz hat dieses System mit nur 2.6 GHz ein erwartungsgemäß schlechteres Ergebnis:

--------------------------------------
|        PHP BENCHMARK SCRIPT        |
--------------------------------------
Start : 2016-07-02 13:27:06  
Server : 31.172.83.223@10.254.75.24  
PHP version : 5.6.22-0+deb8u1  
Platform : Linux  
--------------------------------------
test_math                 : 1.800 sec.  
test_stringmanipulation   : 1.782 sec.  
test_loops                : 0.866 sec.  
test_ifelse               : 0.667 sec.  
--------------------------------------
Total time:               : 5.115 sec.  
real    0m0.452s  
user    0m0.451  
sys     0m0.003s  

Vorläufiges Fazit

Da sich der Dienst noch im Beta-Test befindet und alles somit Subject to Change ist und sich noch finden muss ist natürlich nur ein vosichtiges vorläufiges Fazit zum aktuellen Stand möglich.

Definitiv flexibler…

Das Docker-System hat wie eingangs beschrieben wirklich viele Vorteile und ohne Vertragswechsel zwischen einem halben CPU-Kern ganz schnell auf bis zu 8 Kerne zu upgraden im Bedarfsfall ist jedenfalls eine Flexibilität die eine OpenVPS so nicht bieten kann.

… und leichter zu installieren

Bei einer VPS muss man alles selber machen, was ganz schön nerven kann. Sich durch unendlich lange Tutorials zu wälzen um Dienste wie OwnCloud sauber zu installieren kann eine Qual sein.

Die 1-Klick-Installation, die MyDocker jetzt bereits anbietet hingegen ist ein Traum.

Und wenn man jetzt genauso schnell zu einem Gaming-Server kommt, dann kann sich Nitrado warm anziehen.

… und der Preis?

Da aktuell alles auf „Free“ steht kann ich nur mal offen spekulieren:

Das ist schwer zu sagen, weil MyDocker zwar kurzzeitig schon Preise genannt hatte, diese aber wieder von der Webseite entfernt wurden. Ich denke mal, dass der Dienst hier in der Findungsphase ist. Klar ist aber für mich, dass es preislich schon auf dem Niveau der OpenVPS-Angebote liegen sollte.

Linevast hatte über ein Jahr lang eine Promotion auf eine 3 GHz VPS am Laufen mit der sie die Konkurrenz wie etwa NetCup, Server4You & OVH (siehe den alten Artikel mit Benchmarks hier) sowohl preislich stark unterboten als auch gut das Doppelte an Leistung draufgepackt haben. Vermutlich war das nicht unbedingt kostendeckend, weshalb die Promotion jetzt auch abgelaufen ist und dasselbe Angebot jetzt mit 5.99€ pro Monat das dreifache kostet – aber auch Wert ist.

Davon ausgehend dass die Leistung eines Cores nicht von 2.6 GHz auf 3.0 GHz nach oben korrigiert wird (was allerdings für wirklich hungrige single-threaded Apps wie Koken dringend nötig ist) und meiner bisherigen Erfahrung mit Linevast aufgrund ihrer aggressiven Preispolitik würde ich mal mutmaßen, dass man wohl die 2.6 GHz auch für um die 1.60€ / Monat (Abschlag von 2€ auf 1.80€ wegen weniger GHz) betreiben können wird, was dann für einen Kube (= 0.5 vCores) dann so für 0.40 € / Monat bekommt.

Lediglich die 0.64€ / Kube / Stunde für die „High CPU“ sind stehengeblieben. Das wären allerdings bei einem Rund-um-die-Uhr-Betrieb von 30 x 24 = 720 Stunden dann 461 € und ein unwahrscheinlicher Preis, da man ja schon bei Linevast für 40€ pro Monat ein dedicated root Performance Monster bekommt. 🙂

Ebenso wie die Kubes selber sind auch alle angebotenen vordefinierten Installationspakete bisher kostenfrei, wobei Bestell- und Bezahldialoge schon fertig sind und vermutlich so einiges an lizenzpflichtigen Angeboten folgen wird.

Es bleibt also spannend was Linevast haben will und ob die Leistung eines Cores nochmals verbessert wird.

Meine Aufforderung an alle Interessierten (und vor allem Blogger ist):

Probiert kostenlos MyDocker.io aus, berichtet darüber, ermittelt eure eigenen Benchmark-Ergebnisse und helft mit eurem Feedback diesen Dienst großartig zu machen. 🙂

mydocker_hauptseite