6. Minecraft v Dockeru

Letní škola sítí

Průvodce vytvořením vlastního Docker image a kontejneru

Co dnes probereme

  1. Proč spouštět Minecraft v Dockeru
  2. Příprava složky a stažení server.jar
  3. Vytvoření startovacího skriptu start.sh
  4. Napsání vlastního Dockerfile
  5. Konfigurace docker-compose.yml
  6. Síťové porty a trvalé úložiště (Volumes)
  7. Sestavení (build), spuštění a připojení ze hry
  8. Správa admin práv a konzole
  9. Zálohování a samostatné cvičení

Kategorie 1

Úvod a základní pojmy

Co je to herní server?

  • Program běžící na počítači, ke kterému se připojují hráči.
  • Počítá fyziku, uchovává bloky a synchronizuje hráče.
  • Klasicky vyžaduje instalaci Javy a manuální konfiguraci v systému.

Proč použít Docker?

  • Javu nemusíme instalovat do hostitele: Použijeme ji uvnitř kontejneru.
  • Žádný nepořádek v systému: Server běží v izolovaném prostředí.
  • Učíme se build: Napíšeme si vlastní Dockerfile a skripty.

Náš vlastní Minecraft image

  • Nepoužijeme hotový image z Docker Hubu.
  • Sestavíme vlastní image z čistého Java základu (JRE 26).
  • Přidáme oficiální server.jar a náš startovací skript.

Kategorie 2

Příprava skriptu start.sh a Dockerfile

Krok 1: Vytvoření složky

V terminálu vytvoříme novou složku pro náš Minecraft server:


# Vytvořit složku mc-server
mkdir mc-server

# Přepnout se do vytvořené složky
cd mc-server
            

Krok 2: Připravíme server.jar

Stáhneme oficiální Java server a uložíme ho do složky mc-server:

  1. Otevřete minecraft.net/en-us/download/server.
  2. Stáhněte server pro požadovanou verzi (např. 1.20.4).
  3. Uložte soubor jako server.jar ve složce mc-server.

ls -lh server.jar
            

Krok 3: Vytvoření start.sh

Startovací skript zkontroluje souhlas s EULA a spustí Minecraft z adresáře /data:


nano start.sh
            

Ukázka start.sh


#!/bin/sh
set -eu

if [ "${EULA:-FALSE}" != "TRUE" ]; then
  echo "Server se nespustí: nastav EULA=TRUE v compose." >&2
  exit 1
fi

mkdir -p /data
chown -R minecraft:minecraft /data 2>/dev/null || true
chmod 777 /data 2>/dev/null || true
printf 'eula=true\n' > /data/eula.txt

cd /data

exec su -s /bin/sh minecraft -c "exec java -Xms${MEMORY:-1G} -Xmx${MEMORY:-2G} -jar /opt/minecraft/server.jar nogui"
            

Nastavení spustitelných práv pro start.sh

Aby mohl Linux skript spustit, dáme mu práva k vykonání:


chmod +x start.sh
            

Krok 4: Vytvoření Dockerfile

Nyní napíšeme předpis (Dockerfile), ze kterého Docker vytvoří náš image:


nano Dockerfile
            

Ukázka Dockerfile


FROM eclipse-temurin:26-jre

WORKDIR /opt/minecraft

COPY server.jar /opt/minecraft/server.jar
COPY start.sh /usr/local/bin/start-minecraft

RUN chmod +x /usr/local/bin/start-minecraft && \
    useradd --create-home minecraft && \
    mkdir -p /data && \
    chown -R minecraft:minecraft /opt/minecraft /data

EXPOSE 25565
VOLUME ["/data"]
ENTRYPOINT ["start-minecraft"]
            

Vysvětlení instrukcí Dockerfile

  • FROM - Základní image s Java Runtime Environment (Temurin Java 26).
  • COPY - Zkopíruje server.jar a start.sh do kontejneru.
  • RUN - Nastaví práva a vytvoří neprivilegovaného uživatele minecraft.
  • EXPOSE 25565 - Deklaruje síťový port hry.
  • ENTRYPOINT - Spustí náš skript, který opraví vlastnictví složky /data a spustí Minecraft pod neprivilegovaným uživatelem.

Kategorie 3

Konfigurace docker-compose.yml

Co je docker-compose.yml?

  • Textový soubor (recept), který definuje běh kontejneru.
  • Propojuje náš Dockerfile, porty, paměť a trvalá data.

Krok 5: Vytvoření souboru Compose

Otevřeme editor nano pro docker-compose.yml:


nano docker-compose.yml
            

Ukázka docker-compose.yml


services:
  mc-server:
    build:
      context: .
      dockerfile: Dockerfile
    image: muj-minecraft:1.20.4
    container_name: lss-minecraft-server
    ports:
      - "25565:25565"
    environment:
      EULA: "TRUE"
      MEMORY: "2G"
    volumes:
      - ./data:/data
    restart: unless-stopped
            

Vysvětlení: Souhlas s EULA a paměť

  • EULA: "TRUE" - Souhlas s licenčními podmínkami Mojangu. Skript start.sh ho zkontroluje a zapíše do eula.txt.
  • MEMORY: "2G" - Předá parametr RAM pro Java proces (max 2 GB).
  • build: context: . - Říká Compose, aby sestavil image z Dockerfile v aktuální složce.

Kategorie 4

Síťové porty a Úložiště (Volumes)

Co je to síťový port?

  • Číslo dveří, na kterých síťová služba poslouchá.
  • Minecraft Java Edition používá výchozí port 25565.

Mapování portu v Compose


ports:
  - "25565:25565"
            
  • První číslo: Port na vašem počítači (hostiteli).
  • Druhé číslo: Port uvnitř kontejneru.

Proč potřebujeme Úložiště (Volume)?

  • Kontejnery jsou ephemerální (dočasné) - nepamatují si změny po smazání.
  • Bez úložiště by se po vypnutí kontejneru smazal celý vygenerovaný svět.

Nastavení Volume v Compose


volumes:
  - ./data:/data
            
  • Propojí složku ./data na vašem počítači se složkou /data v kontejneru.
  • Veškeré stavby, mapa i konfigurace zůstanou bezpečně na disku.

Co se uloží do složky ./data?

  • world/ - Soubory mapy a terénu.
  • server.properties - Hlavní nastavení serveru.
  • ops.json - Seznam administrátorů serveru.

Kategorie 5

Spuštění serveru a připojení

Sestavení image a spuštění příkazem up

Nejprve sestavíme náš image z Dockerfile a pak vytvoříme kontejner:


# 1. Sestavit vlastní image
docker compose build

# 2. Spustit kontejner na pozadí
docker compose up -d
            

Co znamená parametr -d?

  • Spustí kontejner na pozadí (Detached mode).
  • Terminál zůstane volný pro další příkazy.

Sledování startu v logu

Generování světa a start Javy sledujeme v reálném čase:


docker compose logs -f
            

Sledování ukončíme stiskem kláves Ctrl + C.

Jak poznám, že server běží?

V logu se objeví řádek potvrzující dokončení načítání světa:


[Server thread/INFO]: Done (18.421s)! For help, type "help"
            

Připojení ze hry Minecraft

  1. Spusťte Minecraft klient (verze 1.20.4).
  2. Vyberte Hra pro více hráčů (Multiplayer).
  3. Zvolte Přímé připojení (Direct Connection).
  4. Zadejte adresu: localhost.

Kategorie 6

Admin práva a správa konzole

Co je serverová konzole?

  • Rozhraní pro zadávání příkazů přímo spuštěnému serveru.
  • Umožňuje spravovat server a příkazy i bez přihlášení do hry.
  • Připojíme se k ní příkazem docker attach lss-minecraft-server.

Udělení admin práv (OP)

Připojte se ke konzoli kontejneru a zadejte příkaz:


# Připojit se ke konzoli
docker attach lss-minecraft-server

# Uvnitř konzole zadat:
op student
            

Nahraďte student vaším herním jménem. Odpojení: Ctrl + P pak Ctrl + Q.

Základní příkazy v konzoli


# Nastavení dne ve hře (v konzoli nepíšeme lomítko /)
time set day

# Změna herního módu na Creative pro hráče student
gamemode creative student
            

Úprava nastavení serveru

  1. Otevřete soubor ./data/server.properties v nano.
  2. Upravte požadovaný parametr (např. pvp=false nebo motd=Vitej na serveru!).
  3. Uložte soubor.

Restartování kontejneru

Aby se změny v server.properties projevily, restartujeme kontejner:


docker compose restart
            

Kategorie 7

Zálohování a cvičení

Jak vytvořit zálohu světa?

Všechna data jsou ve složce ./data, stačí ji zabalit:


tar -czvf zaloha-mc.tar.gz ./data
            

Jak obnovit svět ze zálohy?


# 1. Zastavit server
docker compose down

# 2. Obnovit složku data ze zálohy
tar -xzvf zaloha-mc.tar.gz

# 3. Opět spustit server
docker compose up -d
            

Samostatné cvičení

  1. Vytvořte složku ~/muj-mc-server.
  2. Stáhněte server.jar.
  3. Vytvořte start.sh a nastavte spustitelná práva (`chmod +x`).
  4. Napište Dockerfile podle předlohy.
  5. Vytvořte docker-compose.yml.
  6. Sestavte image (`docker compose build`) a spusťte (`docker compose up -d`).
  7. Připojte se ze hry na localhost a dejte si admin práva (`op`).

Shrnutí modulu

  • Víme, jak sestavit vlastní Minecraft image z Java základu.
  • Rozumíme souborům start.sh, Dockerfile a docker-compose.yml.
  • Umíme namapovat port 25565 a uplatnit persistentní Volume v ./data.
  • Umíme spravovat admin práva přes konzoli (`docker attach`).
  • Umíme zálohovat a obnovovat svět na disku.