Introduction

Minecraft is a great game and when it comes to multiplayer, a dedicated server is the way to go (here’s why1). Myself and a few others recently decided to start playing this game again, and I took the opportunity to deploy the server in my lab.

A Minecraft server does not require a ton of resources to run, However from my experience the more resources you can throw at it the better, especially when you start to introduce mods and more than a few players.

I run our server on my main PC within WSL and Docker. This allows me to leverage the system resources in my PC 🦾 leaving the Pi Cluster to handle the rest of the stuff in my lab. The only reason I opted to go this route is that I don’t want our server to be limited by hardware resources as well as the Minecraft server effecting the overall performance of the Pis.

Prerequisites

  • Docker
  • Docker Compose

Requirements2

Minimum (1-5 Players)

  • Intel Pentium 4 or AMD Athlon based CPU
  • 512 MB RAM
  • 2 GB Storage space
  • Intel Core or AMD K8 based CPU
  • 3 GB RAM
  • 16 GB Storage Space

Optimal (20+ Players)

  • Intel i5/i7 or AMD Ryzen 5/7 Based CPU
  • 6 GB RAM
  • 35 GB Storage Space

Building the Container

Now we have the formalities sorted, we can get to work on creating the docker container for Minecraft.

  1. Create a directory in which you will keep the Minecraft server files

    • mkdir minecraft-server
    • cd minecraft-server
  2. Create an environment file to be used by the Docker Container

    • The .env file allows us to specify variables which we can use across the build process.
    • touch .env
    • Edit the file in a text editor, i.e. vim vim .env
      CONTAINER_NAME=minecraft-server
      SERVER_MEM=4096 #change this to your desired value (in MB)
      SERVER_JAR=minecraft_server.1.18.2.jar
      
  3. Create the docker-compose.yml file

    • The docker-compose.yml file specifies the container that we want to build, outlining the build context (Dockerfile), setting the variables (from .env), configuring storage volumes for persistence as well as ports and the container name.
    • touch docker-compose.yml
    • Edit the file in a text editor3, I.e. vim vim docker-compose.yml
      version: "3"
      
      services:
          minecraft-server:
              build:
                  context: .
                  args:
                      SERVER_MEM: ${SERVER_MEM}
                      SERVER_JAR: ${SERVER_JAR}
              volumes:
                  - .server-data:/server
              ports:
                  - 25565:25565
                  - 25575:25575
              container_name: ${CONTAINER_NAME}
              restart: unless-stopped
      
      volumes:
          server-data:
      
  4. Create the Dockerfile file

    • The Dockerfile builds the container. We take the 17-jre base image apply our variables change the working directory to /server and start the jar file, effectively starting the Minecraft server.
    • touch Dockerfile
    • Edit the file in a text editor, i.e. vim vim Dockerfile
      FROM eclipse-temurin:17-jre
      
      ARG SERVER_MEM
      ARG SERVER_JAR
      
      ENV SERVER_MEM=${SERVER_MEM}
      ENV SERVER_JAR=${SERVER_JAR}
      
      WORKDIR /server
      
      CMD echo "Minecraft Server is starting\n" && java -Xms128M -Xmx${SERVER_MEM}M -jar ${SERVER_JAR} nogui
      

Setup the Server files

We’re almost there, just a few steps left !!

The curious among you may have realised when trying to start the container that it fails with the error below:

Minecraft Server is starting

Error: Unable to access jarfile server.jar

This is because we have not downloaded the server jar file yet, that is our next step.

  1. Navigate to one of the following sites:4
  2. Create a folder in the Minecraft-server folder called .server-data
    • mkdir .server-data
    • cd .server-data
  3. Download the jar file - This will depend on the option above so read the instructions
  4. Go back to the root minecraft-server folder
    • cd ..
  5. Run the container
    • docker compose up (use CTRL+C to exit)
    • Once the server unpacks all the files you will see this:
      minecraft-server  | Starting net.minecraft.server.Main
      minecraft-server  | [18:05:50] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
      minecraft-server exited with code 0
      
  6. Accept the EULA
    • Go into the .server-data folder
      1. cd .server-data
    • Edit the file named eula.txt in a text editor i.e. vim vim eula.txt
      1. Simply change eula=false to eula=true
  7. While in the .server-data folder make any changes you want
    • Some files to note in here are
      • server.properties - properties like server name, game mode, world type etc…
      • ops.json - list of server operators (easier to set ingame)
      • whitelist.json - list of players allowed to join the server everyone else rejected access.
  8. Run the container
    • docker compose up -d (the -d means detatched so we can run the server in the background)
    • docker logs minecraft-server --follow Will show us the progress of the server startup (to exit out of this do CTRL+C)
    • If you see something like the following then you’re a winner 🥳
      [18:17:01] [Server thread/INFO]: Time elapsed: 25529 ms
      [18:17:01] [Server thread/INFO]: Done (34.571s)! For help, type "help"
      

Conclusion

Well done you have successfully setup a Minecraft server, now go play !! There is a lot of cool stuff you can do with a Minecraft server for example installing mods or creating scripts to manage the server, this will be covered in the next post so keep an eye out for it !!


  1. Hosting your own dedicated server allows you to modify every aspect of the server as you see fit. I.E you can modify the server-properties, you can implement a whitelist not to mention being able to add any mods you want ↩︎

  2. Requirements Gathered from here https://minecraft.fandom.com/wiki/Server/Requirements/Dedicated#Unix_.28Linux.2C_BSD.2C_macOS.29  ↩︎

  3. Yaml is very picky 😞 when it comes to formatting so if you encounter any errors double check your formatting !! ↩︎

  4. I have left Forge out as it is a more involved process plus Fabric is better 😜 ↩︎

  5. Right click the green link that says something like minecraft_server.x.xx.x.jar and copy the link address

    curl -o server.jar <link you copied here> ↩︎

  6. Select the Minecraft version, Fabric Loader Version and the Installer Version of your choice. I tend to go with the latest.

    Copy the curl command under CLI download ↩︎