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. This is the Purpur version. It uses the Geyser and Floodgate plugins to accomplish this.
Since it uses the Purpur Minecraft server it also supports any additional plugins that are compatible with Purpur / 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 (as well as the Geyser + Floodgate version) and you can swap between these 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 “Purpur” 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 Purpur / 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-purpur-geyser: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-purpur-geyser:latest
With a custom Minecraft version (add -e Version=1.X.X, must be present on Purpur’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-purpur-geyser: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-purpur-geyser: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-purpur-geyser
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-purpur-geyser: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-purpur-geyser: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.
File Locations
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 Purpur / Paper / Spigot / Bukkit
This is a “Purpur” Minecraft server which has plugin compatibility with Purpur / 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. A 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
Buy A Coffee / Donate
People have expressed some interest in this (you are all saints, thank you, truly)
- PayPal: 05jchambers@gmail.com
- Venmo: @JamesAChambers
- CashApp: $theremote
- Bitcoin (BTC): 3H6wkPnL1Kvne7dJQS8h7wB4vndB9KxZP7
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!
Hi James,
Loving this container and how it lets us join via mobile and java version pc edition – however recently our server got griefied and only just found out the backups aren’t being generated :/ . I’ve stopped the server and restarted it, and we get the following issues when loading the plugins:
[08:05:02 INFO]: [PluginInitializerManager] Initializing plugins…
[08:05:04 ERROR]: [PluginRemapper] Encountered exception remapping plugins
java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed to open plugin jar plugins/ViaVersion.jar
at java.base/java.util.concurrent.CompletableFuture.reportJoin(CompletableFuture.java:413) ~[?:?]
at java.base/java.util.concurrent.CompletableFuture.join(CompletableFuture.java:2118) ~[?:?]
at io.papermc.paper.pluginremap.PluginRemapper.waitForAll(PluginRemapper.java:410) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:206) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.plugin.provider.source.DirectoryProviderSource.prepareContext(DirectoryProviderSource.java:42) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.plugin.provider.source.DirectoryProviderSource.prepareContext(DirectoryProviderSource.java:17) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(EntrypointUtil.java:14) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.plugin.PluginInitializerManager.load(PluginInitializerManager.java:113) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at net.minecraft.server.Main.main(Main.java:129) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.PaperBootstrap.boot(PaperBootstrap.java:21) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at org.bukkit.craftbukkit.Main.main(Main.java:289) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paperclip.Paperclip.lambda$main$0(Paperclip.java:42) ~[app:?]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Caused by: java.lang.RuntimeException: Failed to open plugin jar plugins/ViaVersion.jar
at io.papermc.paper.pluginremap.PluginRemapper.remap(PluginRemapper.java:339) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.pluginremap.PluginRemapper.remapPlugin(PluginRemapper.java:266) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:204) ~[purpur-1.21.jar:1.21-2284-4e55e26]
… 9 more
Caused by: java.util.zip.ZipException: zip END header not found
at jdk.zipfs@21.0.3/jdk.nio.zipfs.ZipFileSystem.findEND(ZipFileSystem.java:1320) ~[jdk.zipfs:?]
at jdk.zipfs@21.0.3/jdk.nio.zipfs.ZipFileSystem.initCEN(ZipFileSystem.java:1541) ~[jdk.zipfs:?]
at jdk.zipfs@21.0.3/jdk.nio.zipfs.ZipFileSystem.(ZipFileSystem.java:179) ~[jdk.zipfs:?]
at jdk.zipfs@21.0.3/jdk.nio.zipfs.ZipFileSystemProvider.getZipFileSystem(ZipFileSystemProvider.java:125) ~[jdk.zipfs:?]
at jdk.zipfs@21.0.3/jdk.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:120) ~[jdk.zipfs:?]
at java.base/java.nio.file.FileSystems.newFileSystem(FileSystems.java:528) ~[?:?]
at java.base/java.nio.file.FileSystems.newFileSystem(FileSystems.java:440) ~[?:?]
at io.papermc.paper.pluginremap.PluginRemapper.remap(PluginRemapper.java:290) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.pluginremap.PluginRemapper.remapPlugin(PluginRemapper.java:266) ~[purpur-1.21.jar:1.21-2284-4e55e26]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:204) ~[purpur-1.21.jar:1.21-2284-4e55e26]
… 9 more
I’m running Minecraft Version 1.21 – and I’ve downloaded the newest version of ViaVersion.jar from their github page – but this has made no difference. Is this what is stopping the backups being generated?
Thanks in advance for the help!
James
Hello, how are you? I’m new to using docker but I was already using your previous bedrock script, but I see that this one is a little more complicated.
I realized that the console won’t let me change the difficulty of the game.
I went to the data folder and changed it manually with server.properties and first I tried to restart the server from the console but at the beginning the configuration remained the same so what I did was restart the container with “sudo docker” container restart xxxxx” but when you start again the difficulty remains the same. I hope you can help me James.
Hello James,
1.20.5 pull does not work, I am getting up to date msg while still on 1.20.4.
thank you
Peter
Hello P J,
Can you try with the latest version? It should pull 1.20.6 now which actually exists!
Hi James,
thank you, 1.20.6 is there now,
Peter
Hi James, i am totaly confused. What happens to my current server if I start your command again? I actually just want to update the versions of Geyser and Spigot, wasn’t there an update.sh for that?? I can’t find it in my data anymore…do I have to go to the volume directory? Is there a simple guide for a newcomer to the Docker environment? Thank you very much and greetings from good old Germany!
Hi James,
I get an error starting the container:
[Geyser-Spigot] Your server software does not support the Java version that Geyser requires (1.20.2). Please install ViaVersion (https://ci.viaversion.com/job/ViaVersion/) or update your server software!
and another one
[Geyser-Spigot] There’s a new Geyser update available to support Bedrock version 1.20.50. Download it here: https://geysermc.org/download
do you have any idea?
Hey Thomas,
You need to update to 1.20.4 to support 1.20.50. Either pull the latest version of the container (after stopping the server) or run with -e Version=1.20.4.
That should get it going!