MTA Server mit Docker erstellen

Liebe Community,

ich habe zur einfachen Handhabung des MTA Servers in einem Container ein kleines Docker Image zusammengestellt, mit dem es recht einfach ist, einen Server ohne grossen Konfigurationsaufwand zum Laufen zu bringen.

Bei dem Image handelt es sich um ein Git Repository, bei dem jeder mitwirken kann, wenn er möchte. Das Image wird anschliessend gebuilded und in einer Docker Registry zur Verfügung gestellt (Verwendung im Laufe erwähnt).


Das Repository ist zu finden unter: https://git.audifire.ch/MTASA/mtasa

Link zur Docker Registry: https://git.audifire.ch/MTASA/mtasa/container_registry

INFO: Durch ein automatisiertes Buildsystem ist immer die aktuellste Version in der Registry verfügbar, welche auf https://linux.mtasa.com/ angeboten wird.

Voraussetzungen

  1. Docker installiert auf Linux oder Windows (mit Linux-Containern)
  2. Linux bzw. Windows Grundkenntnisse (insbesondere Kenntnisse über Terminal und Kommandozeile notwendig)
  3. Grundkenntnisse im Umgang mit der Konfiguration eines MTA Servers
  4. Geduld, Motivation und gute Laune

Ausführung des Docker Containers

Die einfachste Möglichkeit dieses Image zur Ausführung zu bringen ist mit folgendem Kommando:

docker run -it --rm -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp registry.audifire.ch/mtasa/mtasa


Erklärung des Kommandos:

  • run - Übermittelt Docker das Kommando, einen Container ausführen zu wollen.
  • -it - Der Container wird interaktiv ausgeführt und die Ausgabe, sowie die Eingabe sind an die Konsole gebunden
  • --rm - Der Container wird nach dem Stop sauber abgeräumt.
  • -p PORT_SRC:PORT_DST - Der PORT_SRC ist der eingehende Port auf dem Host, auf dem Docker ausgeführt wird. Der Host leitet den Netzwerkverkehr an den Port PORT_DST des Containers weiter. Üblicherweise sind das für MTA 22003 (UDP), 22005 (TCP) und 22126 (UDP). Natürlich gilt auch hier, dass die Ports von aussen (vom Internet) erreichbar sein müssen, damit globale Spieler den Server betreten können.
  • registry.audifire.ch/mtasa/mtasa - Der Imagename ist die effektive Umgebung, in der der Container läuft. In dem angegebenen Image wird übermittelt, was ausgeführt werden soll.

Mit dem gegebenen Kommando führt man einen MTA Server in einem Docker Container aus, der interaktiv auf der Konsole angezeigt wird. Mit dieser Methode ist es möglich, direkt Befehle an den MTA Server zu schicken.

Der Nachteil dieser direkten Ausführung ist jedoch, dass der MTA Server beendet wird, sobald man die Sitzung beendet. Ein Detach der Konsole ist in diesem Modus nicht möglich.

Vergleichbar ist diese Methode mit einem ./mta-server64.


Besser wäre hingegen schon folgendes Kommando:

docker run -d -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp registry.audifire.ch/mtasa/mtasa

Im Vergleich zum vorhergehenden Kommando haben wir nun das -it gegen ein -d ersetzt. Dieses führt das Image nun im "Detached-Modus" aus. In diesem Modus wird die Ausgabe/Eingabe nicht mehr an die/von der Konsole weitergeleitet/entgegengenommen.

Konfiguration des Containers/Servers

Ein Problem unseres bisherigen Kommandos ist, dass man nicht an die Serverkonfiguration, bzw. die Ressourcen heran kommt.

Hier kommt das Konzept der Volumes (Shared Filesystems) ins Spiel. Im Docker Image ist der Deatchmatch Ordner als ein Volume hinterlegt.

Es ist uns nun möglich, dieses Volume mit einem physischen Ort des Host Systems zu verbinden.


Folgendes Argument muss dafür in die Ausführung des Containers eingebaut werden:

-v /srv/mtaserver:/srv/mta/mods/deathmatch


Der Pfad vor dem Doppelpunkt entspricht dabei einem absoluten Pfad (auch ein relativer ist möglich, verwirrt meist jedoch nur) auf dem Host System. Das Ziel muss für "Other" auf dem Linux-System beschreibbar sein, da sonst der Container nichts darin schreiben kann.

Der Pfad nach dem Doppelpunkt entspricht dem Pfad in dem Container und muss so bleiben.

Nach der ersten Ausführung des Containers ist an dem angegebenen Pfad die Konfiguration des MTA Servers und die Standardressourcen zu finden.


Die hier gezeigte Methode ist die die einfachste Methode, um die Daten nach dem Löschen eines Containers zu behalten.

Eine weitere Methode kann in den Docker Docs nachgeschlagen werden: docker volume create | Docker Documentation

Überwachung des Containers

Auch wenn der Container im "Detached-Mode" läuft, muss man auf die Aufgabe des Servers nicht verzichten.

Mit folgendem Befehl lässt sich die Ausgabe des Servers auf die Konsole bringen:

docker logs CONTAINER


Die grosse Frage ist nur: Was muss als CONTAINER eingetragen werden? Jeder Docker Container besitzt eine einzigartige Container-ID, mit welche der Container identifizierbar ist.

Mit dem Kommando docker ps listet man alle laufenden Container auf und erhält die dazugehörigen Container-IDs. Auch beim Erstellen eines Detached-Containers wird eine lange Zeichenkette in der Konsole angezeigt. Dies ist die ID des erstellten Containers.

Doch um das ganze noch ein wenig einfacher zu gestalten, kann man dem Container auch einen Namen geben. Mit der Option --name NAME im docker run Befehl kann man dem Container einen einzigartigen Namen vergeben.

Darüber ist der Container nun auch identifizierbar.


Mit dem jetzigen Befehl hat man nun die Ausgabe des Servers - doch leider nicht in Echtzeit. Doch auch dies ist recht einfach umzusetzen. Mit der Option -f im Log Kommando kann man die Log-Ausgabe des Containers an die Konsole heften.

Das vollständige Kommando lautet nun:

docker logs -f NAME

Update des Servers

Coming soon.

Verwendung mit docker-compose

Coming soon.

Command Cheat-Sheet

  • MTA-Server interaktiv auf der Konsole ohne persistenten Speicher ausführen:
    docker run -it --rm -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp registry.audifire.ch/mtasa/mtasa
  • MTA-Server "detached" ohne persistenten Speicher ausführen:
    docker run -d -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp registry.audifire.ch/mtasa/mtasa
  • MTA-Server "detached" mit einem Volume-Link zu /srv/mtaserver ausführen:
    docker run -d -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp -v /srv/mtaserver:/srv/mta/mods/deathmatch registry.audifire.ch/mtasa/mtasa
  • MTA-Server "detached" mit einem Volume-Link zu /srv/mtaserver inkl. Bezeichnung (mtaServer) ausführen:
    docker run -d -p 22003:22003/udp -p 22005:22005/tcp -p 22126:22126/udp -v /srv/mtaserver:/srv/mta/mods/deathmatch --name mtaServer registry.audifire.ch/mtasa/mtasa
  • Den statischen Log des MTA-Servers aufrufen:
    docker logs NAME
  • Den dynamischen Log des MTA-Servers aufrufen:
    docker logs -f NAME
  • Docker-Compose Projekt detached starten:
    docker-compose up -d

Ich hoffe, ich konnte euch mit diesem Tutorial ein wenig einen Einblick in die Welt von Docker und dessen Administration gewähren.

Vielen Dank für's lesen und bis zum nächsten Tutorial.


Freundliche Grüsse, Audifire.

Antworten 1