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
- Docker installiert auf Linux oder Windows (mit Linux-Containern)
- Linux bzw. Windows Grundkenntnisse (insbesondere Kenntnisse über Terminal und Kommandozeile notwendig)
- Grundkenntnisse im Umgang mit der Konfiguration eines MTA Servers
- 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
Achtung: Es sollte sichergestellt sein, dass Konfiguration und Ressourcen persistent in einem Volume Map oder in einem Volume abgelegt sind.
Folgende Schritte sind für ein Update notwendig:
docker pull registry.audifire.ch/mtasa/mtasa:latest # Pullen des aktuellen images
docker stop mtaServer # Stoppen des derzeit laufenden Servers
docker rm mtaServer # Löschen des Containers (sicherstellen, dass alle Daten gespeichert sind!)
docker run ... # Run Command von oben, um den Container zu erstellen und laufen zu lassen
Verwendung mit docker-compose
version: '3.7'
services:
mta-server:
image: registry.audifire.ch/mtasa/mtasa
volumes:
- "/srv/mtaserver:/srv/mta/mods/deathmatch"
restart: always
ports:
- "22003:22003/udp"
- "22005:22005"
- "22126:22126/udp"
Alles anzeigen
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 4
Audifire
Durch ein automatisiertes Buildsystem wird nun immer die aktuellste Version in der Registry verfügbar sein, welche auf https://linux.mtasa.com/ angeboten wird.
In näherer Zukunft werden noch die Kapitel Update und docker-compose ausgerabeitet.
Audifire
Das Image ist selbstverständlich auf der aktuell nun erhältlichen Version 1.5.9 verfügbar.
INCepted
Audifire Echt super, vielen Dank! Kannst du evtl auch das Docker Image mal in einer Repo hochladen?
Audifire
Das Repo ist wie im Tutorial erwähnt unter folgenden Adressen zu finden: