Files
blog-ahmza-com/content/posts/mc-server-on-docker/index.md
T

242 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Minecraft Server on Docker ⛏ 🐳
date: 2022-05-24
author: "ahmza"
draft: false
weight:
tags: ["games", "docker"]
description: "Ever wanted to build a Minecraft server in docker !! Start here"
---
## **Introduction**
Minecraft is a great game and better with friends. A dedicated server allows you
to do that[^1].
A Minecraft server does not require a ton of resources to run, but from my
experience the more resources you can throw at it the better when you start to
introduce mods and more players.
I run our server on my main PC. This allows me to leverage the system resources
in my PC 🦾 leaving the [Pi
Cluster](https://blog.ahmza.com/posts/building-a-docker-swarm-with-pis/) system
resources to handle the rest of the stuff in my lab.
## **Prerequisites**
- Docker
- Docker Compose
## **Requirements**[^2]
#### **Minimum (1-5 Players)**
- Intel Pentium 4 or AMD Athlon based CPU
- 512 MB RAM
- 2 GB Storage space
#### **Recommended (10-15 Players)**
- 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**
1. **Create a directory in which you will keep the Minecraft server files**
```bash
# Make the folder
mkdir minecraft-server
# Ender the folder
cd minecraft-server
```
2. **Create an environment file to be used by the Docker Container**
- The _.env_ file allows us to specify variables used in the build process.
```bash
# Create a .env file
touch .env
# Open in a text editor
vim .env
# Enter the following variables
CONTAINER_NAME=minecraft-server
SERVER_MEM=4096 #change this to your desired value (in MB)
SERVER_JAR=minecraft_server.<version>.jar # change the version
```
3. **Create the docker-compose.yml file**
- The _docker-compose.yml_ file specifies the container that we want to build [^3]
```bash
# Create the file
touch docker-compose.yml`
# Open in a text editor
vim docker-compose.yml
```
```yaml
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 image.
```bash
# Create the file
touch Dockerfile`
# Open the file in a text editor
vim Dockerfile
```
```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:
```bash
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]
- [Vanilla Minecraft Server](https://www.minecraft.net/en-us/download/server) - instructions found here[^5]
- [Fabric Mod loader server](https://fabricmc.net/use/server/) - instructions found here [^6]
2. **Create a folder in the Minecraft-server folder called .server-data**
```bash
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**
```bash
cd ..
```
5. **Run the container**
This will create our eula.txt as well as other files needed.
```bash
docker compose up # use CTRL+C to exit
```
```bash
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**
```bash
# enter the .server-data folder
cd .server-data
# edit eula.txt in a text editor
vim eula.txt
# change `eula=false` to `eula=true`
eula=true
```
7. **While in the .server-data folder make any changes you want**
- Notable files:
- **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**
```bash
# -d flag allows the container to run in detached mode i.e in the background
docker compose up -d
```
```bash
# monitor the logs as the server starts. CTRL+C to exit
docker logs minecraft-server --follow
# If you see the bottom line then your server is up and running
[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 setup a Minecraft server, now go play !!
There is a lot of cool stuff you can do from this point, for example installing
mods or creating scripts to manage the server.
[^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](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`