This is a new Docker container to automatically set up and run a Minecraft server that both Java and Bedrock players can connect to! This allows everyone to play on your server no matter which edition of Minecraft you are using. It uses the Geyser and Floodgate plugins to accomplish this.
Since it uses the Paper Minecraft server it also supports any additional plugins that are compatible with Paper / Spigot. This gives you the ability to do many things that are currently impossible to do in Bedrock if you are hosting the official Bedrock dedicated server.
It is fully compatible with my Paper Minecraft Java Server Container and you can swap between these two containers without changing any configuration.
The official GitHub page is located here.
The Docker Hub page for the container is located here.
It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information.
Features
- Sets up fully operational Minecraft server that allows both Java and Bedrock clients to connect
- Runs the highly efficient “Paper” Minecraft server
- Runs Geyser to allow Bedrock clients to connect and Floodgate to allow them to authenticate with their Bedrock credentials to a Java server
- Plugin support for Paper / Spigot / Bukkit
- Uses named Docker volume for safe and easy to access storage of server data files (which enables more advanced Docker features such as automatic volume backups)
- Installs and configures OpenJDK 18
- Automatic backups to minecraft/backups when server restarts
- Full logging available in minecraft/logs folder
- Updates automatically to the latest version when server is started
- Runs on all Docker platforms including Raspberry Pi
Usage
First you must create a named Docker volume. This can be done with:
docker volume create yourvolumename
Now you may launch the server and open the ports necessary with one of the following Docker launch commands.
With default ports:
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
With custom ports:
docker run -it -v yourvolumename:/minecraft -p 12345:12345 -e Port=12345 -p 54321:54321/udp -p 54321:54321 -e BedrockPort=54321 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
With a custom Minecraft version (add -e Version=1.X.X, must be present on Paper’s API servers to work):
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.17.1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
With a maximum memory limit in megabytes (optional, prevents crashes on platforms with limited memory, -e MaxMemory=2048):
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=2048 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Using a custom timezone:
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e TZ="America/Denver" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Skipping backups on a certain folder:
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoBackup="plugins" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Skipping permissions check:
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoPermCheck="Y" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Change number of backups:
docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Configuration / Accessing Server Files
The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files.
You can find your exact path by typing:
docker volume inspect yourvolumename
This will give you the fully qualified path to your volume like this:
{ "CreatedAt": "2022-05-09T21:08:34-06:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data", "Name": "yourvolumename", "Options": {}, "Scope": "local" }
On Linux it’s typically available at:
/var/lib/docker/volumes/yourvolumename/_data
On Windows it’s at
C:\ProgramData\DockerDesktop
but may be located at something more like
\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
if you are using WSL (Windows Subsystem for Linux).
On Mac it’s typically
~/Library/Containers/com.docker.docker/Data/vms/0/
If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first:
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect.
Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective.
Backups are stored in the “backups” folder
Log files with timestamps are stored in the “logs” folder.
Plugin Support for Paper / Spigot / Bukkit
This is a “Paper” Minecraft server which has plugin compatibility with Paper / Spigot / Bukkit.
Installation is simple. There is a “plugins” folder on your Docker named volume.
Navigate to your server files on your host operating system (see accessing server files section if you don’t know where this is) and you will see the “plugins” folder.
You just need to drop the extracted version of the plugin (a .jar file) into this folder and restart the container. That’s it!
Some plugins have dependencies so make sure you read the installation guide first for the plugin you are looking at.
A popular place to get plugins is: dev.bukkit.org
Troubleshooting Note – Oracle Virtual Machines
A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.
It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both:
- Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list
- *and* set the ingress ports in a Network Security Group assigned to your instance
Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself.
I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people.
Troubleshooting Note – Hyper-V
There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The easy workaround for this is that you have to use a Generation 1 VM with the Legacy LAN network driver.
There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading.
Here’s an example:
# The primary network interface auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 offload-tx off
This can also be done non-persistently with the following ethtool command:
ethtool -K eth0 tx off
Additional Support
The comments section right here is the best place for support. The second best place is the GitHub issues section.
I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things!
Thanks for the great docker. I’m using a digitalOcean instance. The docker loads however strangely the console is complete unresponsive. For example even if type “list” nothing happens. Any command I enter is just return the prompt? Below is some of the output. Can you let me know what might be the issue?
Starting Minecraft server...
Starting org.bukkit.craftbukkit.Main
System Info: Java 19 (OpenJDK 64-Bit Server VM 19.0.2+7-Ubuntu-4) Host: Linux 6.5.0-9-generic (amd64)
Loading libraries, please wait...
[13:08:20 INFO]: Environment: Environment[sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, name=PROD]
[13:08:21 INFO]: Found new data pack file/bukkit, loading it automatically
[13:08:23 INFO]: No existing world data, creating new world
[13:08:23 WARN]: Failed to parse level-type default, defaulting to minecraft:normal
[13:08:26 INFO]: Loaded 1174 recipes
[13:08:27 INFO]: Loaded 1271 advancements
[13:08:27 INFO]: Starting minecraft server version 1.20.4
[13:08:27 WARN]: To start the server with more ram, launch it as "java -Xmx1024M -Xms1024M -jar minecraft_server.jar"
[13:08:27 WARN]: ****************************
[13:08:27 WARN]: YOU ARE RUNNING THIS SERVER AS AN ADMINISTRATIVE OR ROOT USER. THIS IS NOT ADVISED.
[13:08:27 WARN]: YOU ARE OPENING YOURSELF UP TO POTENTIAL RISKS WHEN DOING THIS.
[13:08:27 WARN]: FOR MORE INFORMATION, SEE https://madelinemiller.dev/blog/root-minecraft-server/
[13:08:27 WARN]: ****************************
[13:08:27 INFO]: Loading properties
[13:08:28 INFO]: This server is running Paper version git-Paper-496 (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 7ac24a1 on ver/1.20.4)
[13:08:30 INFO]: Server Ping Player Sample Count: 12
[13:08:30 INFO]: Using 4 threads for Netty based IO
[13:08:31 WARN]: [!] The timings profiler has been enabled but has been scheduled for removal from Paper in the future.
We recommend installing the spark profiler as a replacement: https://spark.lucko.me/
For more information please visit: https://github.com/PaperMC/Paper/issues/8948
[13:08:31 INFO]: [ChunkTaskScheduler] Chunk system is using 1 I/O threads, 1 worker threads, and gen parallelism of 1 threads
[13:08:32 INFO]: Default game type: SURVIVAL
[13:08:32 INFO]: Generating keypair
[13:08:32 INFO]: Starting Minecraft server on *:25565
[13:08:32 INFO]: Using epoll channel type
[13:08:33 INFO]: Paper: Using libdeflate (Linux x86_64) compression from Velocity.
[13:08:33 INFO]: Paper: Using OpenSSL 3.0.x (Linux x86_64) cipher from Velocity.
[13:08:34 INFO]: [floodgate] Loading server plugin floodgate v2.2.2-SNAPSHOT (b98-0fa00a8)
[13:08:38 INFO]: [floodgate] Took 3,450ms to boot Floodgate
[13:08:38 INFO]: [ViaVersion] Loading server plugin ViaVersion v4.10.1-SNAPSHOT
[13:08:38 INFO]: [ViaVersion] ViaVersion 4.10.1-SNAPSHOT is now loaded. Registering protocol transformers and injecting...
[13:08:40 INFO]: [ViaVersion] Loading block connection mappings ...
[13:08:41 INFO]: [ViaVersion] Using FastUtil Long2ObjectOpenHashMap for block connections
[13:08:41 INFO]: [Geyser-Spigot] Loading server plugin Geyser-Spigot v2.2.3-SNAPSHOT
[13:08:43 INFO]: [Geyser-Spigot] Loading extensions...
[13:08:43 INFO]: [Geyser-Spigot] Loaded 0 extension(s)
[13:08:43 INFO]: Server permissions file permissions.yml is empty, ignoring it
[13:08:43 INFO]: Preparing level "world"
[13:08:43 WARN]: Failed to parse level-type default, defaulting to minecraft:normal
> list
> list
Hey Alex,
It looks like your console is unresponsive because it’s still preparing the world. Have you let it sit for a while? You should get additional messages after preparing level world.
Hey James, been a while. I have tried enabling backups (after disabling them a while ago with your help) using -e BackupCount=20. This does not seem to be working. When restarting the container or restarting by issuing the server command ‘restart’ no backups are saved. This is how i started the server: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=7000 -e BackupCount=20 –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Hey Ray J,
Can you try again with the latest version I just released?
Hi James, the new version still didn’t work. I ran this command to start the server: docker run –name bee -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=15 -e MaxMemory=7000 –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
Hey Ray J,
I would try removing all instances of the container with docker image ls and then docker image rm each one of the entries on the list.
I think your old backup settings are probably being retained somehow!
Okay, I will try that. Thanks James
Hi James. I just removed the container and the image, pulled the latest one again, and ran this to get the server up and running once again: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=20 -e TZ=”America/Detroit” -e MaxMemory=7350 –name bee –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest
When entering ‘stop’ or ‘restart’ into the server console, or when running ‘docker restart xxxx’ it restarts as it should but no backup is made and there are no errors. I have a feeling that whats causing this is very minor and dumb and I’m wondering if I should try making a new volume and moving the server files there (which I will try tonight), or if there’s a plugin affecting the backups from being made. I currently have these running: AuthMe, BetterRTP, Chunky, DiscordSRV, floodgate, Geyser-Spigot, Graves, GriefPrevention, LaggRemover, SetHome, SkinsRestorer, spark, ViaBackwards, and ViaVersion
Also, could you share whatever script or code creates the backups? Maybe i could just run it manually. Thanks.
Hey Ray J,
Well let’s look at the backup code:
# Back up server
if [ -d "world" ]; then
Did you change the name of your world/level away from world? That would definitely do it.
Specifically you have modified server.properties and changed your:
level-name=world
right? Yeah, you won’t get any backups if you do that. You’ve changed the paths (which won’t do anything but break things). You would need to customize the container and compile your own version to get it to work with custom world paths.
There is no point in changing the level-name setting. It doesn’t do anything other than change the paths to your world files. No players will ever know you changed it. They don’t see it anywhere. If you want to change the one they see that is actually:
motd=A Minecraft Server
You may have a hard time changing it back at this point. If you try I would make sure you do have backups taken (even if you do them manually). Theoretically you would need to rename your folders back to world, world_nether, etc. with the server closed and fix server.properties and relaunch. I know if you try this with Bedrock you have trouble though as it’s embedded in the NBT files. Hopefully Java will be a bit more forgiving.
Hopefully that helps!
ahhhhh so that’s the issue! I’ll make a backup and try changing the level names and check the results. I knew it was a stupid issue, especially on my side haha. Thanks so much for the help James. I might’ve changed the name because bedrock players saw it or something but it was so long ago that I forgot. I had my own backup script going but issues began happening plus it took a while to back up. Thanks again for helping with this, it means a lot to get support with issues that I am unfamiliar with.
Hello James Chambers,
Does this server docker support internet multiplayer? I was able to run this locally but not over the internet. Is internet playing supported or not? I launched the server with custom ports
This is basically the first time i’ve used docker.
Thanks
Hello Paul,
Usually the issues with problems like this fall into the following categories:
– You have two routers (one for wired and one for WiFi for example) which is called double NAT (the solution is to put one of the devices in bridge mode)
– You have a 4G/5G/wireless internet connection (these are rare to have inbound connectivity without getting on a special plan from your provider)
– You have a shared internet connection through school/apartments/etc. (these often require working with whoever manages the connection to get inbound connectivity)
– You potentially have a firewall running on the machine
If you check for those things it will typically be one of those. Hopefully that helps!
Hi James, thanks a lot for this container. Nice job ! My son loves it a lot. I installed for him the bedrock version one year ago. How to manage permission levels and activate Operator mode here? It is not in server.properties.
Hey juanlu,
The best way is to simply type “op player” in the server console. You can pull up the console with docker container ls and then docker container attach xxxx.
Hopefully that helps!
I would just like to report back that this whole thing opened up sort of a Pandora’s Box for me – I started trying to get a simple Bedrock Server going on my new RPi 5. When that failed, I tried this Java/Geyser container by James and it worked almost immediately despite not knowing much about docker. It worked so well that we got excited about the possibilities and I ended up adding a bunch of plugins (Multiverse, Luckperms, Anti griefing) and worlds (World of Worlds is a cool download). Then it got me excited about docker and VM type technology and I ended up repurposing an HP EliteDesk 800 G3 with an i7 7700 and 16GB of RAM, running Proxmox. I created a really lean headless debian server VM on it with 2 cpu cores and 8GB of RAM and moved over the docker volume from the Pi. I ran the container in the new VM and everything was picked up perfectly on the first go. The difference in performance is noticeable especially when loading new chunks or switching dimensions.
Major thanks to James for this excellent container and the flexibility it provides. And definitely recommend Proxmox and a second hand HP Elitedesk 800 G3 (similar price as a new RPi 5).
Hey Sander,
What a great setup! Sorry for sending you down the rabbit hole with the Pi 5 issue. That’s a tricky one to fix.
I have some ideas on how to fix it but they’re nasty. Detecting which system model the host is using in Docker and taking special action based upon it kind of defeats the purpose of Docker’s place and run anywhere.
In reality I may have to do something like a special switch for the Pi5 you have to start the container with. I just hate the whole idea of having to do that since my whole goal with the container was portability. A switch may be the least evil way to do it.
I completely agree with all of your recommendations though and am absolutely thrilled with where you ended up. Thank you for sharing and enjoy and take care!
Hi James,
I’m still running this on my RPi 4 and it’s been great! I have a question I’m a little embarrased to ask: how do I use the backup files? My pi and server restart every morning via crontab, so I have 10 backups in the folder. I made a rookie error and my son and I would like to just go back to today’s back up. I found the file, but don’t know how to revert the server to that point. I’m sure it’s super easy, but I don’t want to mess it up and upset my 7 year old more.
Hey Tony,
Great question! So the backup file is basically a tar / zip file that you just extract over the top of your existing files.
In other words the backup file is just a full copy of the folders / files that make up your server. Make sure you stop the server before trying to extract over the top but that is basically all there is to it.
Hopefully that helps!
Thank you! I muddled my way through it and got it to work although I’m sure there was an easier way 🙂
Great work Tony, enjoy and take care!
Dear James
Thanks for this fantastic creation. I’m new to RPi but this worked flawlessly.
I have one problem, though. I want to allow (all) players to perform commands. My daughter wants to be able to summon things. I have tried several things without success. In the console, writing /op gives “Unknown command. Type “/help” for help.” Even /help gives the same answer. The console is working, I can see the players joining and things happening. I’ve also tried to edit server.properties without effect. No commands are available to the players, only, e.g., floodgate, bukkit.
allow-cheats=true
allow-flight=false
allow-nether=true
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
debug=false
default-player-permission-level=4
difficulty=normal
enable-command-block=true
enable-jmx-monitoring=false
enable-query=false
enable-rcon=false
enable-status=true
enforce-secure-profile=false
enforce-whitelist=false
entity-broadcast-range-percentage=100
force-gamemode=false
function-permission-level=2
gamemode=survival
generate-structures=true
generator-settings={}
hardcore=false
hide-online-players=false
initial-disabled-packs=
initial-enabled-packs=vanilla
level-name=world
level-seed=
level-type=default
log-ips=true
max-chained-neighbor-updates=1000000
max-players=20
max-tick-time=120000
max-world-size=29999984
motd=Minecraft-server\!\!
network-compression-threshold=512
online-mode=true
op-permission-level=4
player-idle-timeout=0
prevent-proxy-connections=false
pvp=true
query.port=25565
rate-limit=0
rcon.password=
rcon.port=25575
require-resource-pack=false
resource-pack=
resource-pack-id=
resource-pack-prompt=
resource-pack-sha1=
server-ip=
server-port=25565
simulation-distance=10
spawn-animals=true
spawn-monsters=true
spawn-npcs=true
spawn-protection=0
sync-chunk-writes=true
text-filtering-config=
use-native-transport=true
view-distance=10
white-list=false
Hey Michael,
So you actually have it right. The problem is when you use the console you need to not put a / in front of the commands. That is only used in-game.
The way to use it in the server console would be like this:
op playername
or
op "player name"
Hopefully that helps!
Dear James, thanks for the reply. Indeed, it was the / which was causing the problems. 😀
Hey Michael,
Thanks for the follow up and confirming, enjoy and take care!