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!
Hi James,
I’m guessing you have moved onto other things.
Could you possibly provide the source for this, so that one of us could possibly continue your great work?
I currently am having issue with ViaVersion, and it’s preventing the server from running.
It would be great to allow someone the ability to continue keeping this running.
Wishing you all the best in whichever endeavour you are chasing now. 🙂
Question for everyone running this server. Is there a bukkit plug-in for proximity voice chat that works for both Java and Bedrock players?
DiscordSRV might work
Hey James,
I feel like I must be missing something really simple here. I am trying to restore a from a backup, but when I decompress the backup into the minecraft folder and start the container nothing changes. I am shutting down the container before decompressing.
I am at a loss. I’ve done this before and never had a problem.
Late reply but make sure you remove the old container and start a new one using the docker run command you ran previously
Hello James,
I´ve erased container, volume and image and pulled latest version. But still message
*** Warning, you’ve not updated in a while! ***
*** Please download a new build as per instructions from https://papermc.io/downloads/paper *** appears. Any solutions? Image uses paperclip verion 130.
Please help!!
Best regards!
Michael
Hey Michael,
There is no paperclip in the image. None of the Minecraft files are in the image. All the image has is a script to download them to your Docker volume.
You will always get this message if you are running an older version than the latest version basically. I see that 130 is the last version ever released for 1.20. The latest version is 1.20.1. You are running an old version (1.20).
If you want to fix this then just do -e Version=1.20.1 or override the version on the docker compose file if you are using compose. You will no longer get that error as it will download build #57 (at time of writing) of 1.20.1. Since you aren’t specifying a version you are on 1.20 only. I haven’t updated the container to automatically download 1.20.1 yet (and you shouldn’t wait for me to either).
Paper always shows that message if the build is more than like a few weeks old. Since you aren’t specifying -e Version=1.20.1 you are running an old version (1.20 by default) so this message is correct. That build for 1.20 hasn’t been updated in a while and probably won’t be ever again.
Again, understand that the image does not contain ANY Minecraft files. None. It’s just a script. That’s why you updating by typing -e Version=1.20.1 is *exactly* the same as me pushing a new version of the container. All I do when I update is change the text from 1.20 to 1.20.1. That’s it. There are no Minecraft files shipped in the image.
In other words the default version doesn’t mean anything. You can put the version as whatever you want. When a new version of Minecraft comes out all I do is change the text of the version. That’s why I’m saying it doesn’t make a lot of sense to be pulling images or deleting anything when you need to update. None of that is in there. It’s all on your volume and it will update it if you tell it to without waiting for me to do anything.
You can tell the container it’s supposed to be on Minecraft 1.25 and it will believe you. It has no idea what versions of Minecraft exist or will exist. It would work too as long as the Java currently in the image is new enough to run them (that is something I do update in the image, Java itself). Realistically though I only change the files in the image every year or two and they’re related to Java (and not Minecraft).
Of course there is no version 1.25 yet so you’ll get an error that it can’t find it but the point is that the container doesn’t know about that or care. If that version did exist it would download it and run it just fine. Be advised though it will *always* tell you that you are on an old version if it hasn’t been updated for more than a couple of weeks (meaning all old versions will give you this message, they’re not being updated anymore at all and certainly haven’t been in the past couple of weeks). That’s just how Paper is programmed basically.
I’m about to update the default version. It will take me 2 minutes to update all containers. All I do is go through the files and change the default text from 1.20 to 1.20.1. I highly recommend you start managing it yourself though.
I’ve been more and more tempted to remove shipping with a default version at all and telling people if you don’t give it a version it won’t work. Why? Because it seems to be unclear to people that the container doesn’t need to be updated for new Minecraft versions. That’s not how it works and by making them specify a version and it not shipping with any default at all they would definitely understand it then. It would also make it so I have to update the container like once every year or two instead of basically constantly just to change the dumb version # that is not even actually needed.
Hopefully that helps!
Hi James,
I found it by myself and updated it with e=1.21.1. Sometimes I‘m not sure, what to do because of learning it by myself. Thx for your great support!!
Now I‘ve got an error in console :
[09:31:33 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) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:206) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.plugin.provider.source.DirectoryProviderSource.prepareContext(DirectoryProviderSource.java:42) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.plugin.provider.source.DirectoryProviderSource.prepareContext(DirectoryProviderSource.java:17) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(EntrypointUtil.java:14) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.plugin.PluginInitializerManager.load(PluginInitializerManager.java:113) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at net.minecraft.server.Main.main(Main.java:123) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.PaperBootstrap.boot(PaperBootstrap.java:21) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at org.bukkit.craftbukkit.Main.main(Main.java:281) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
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) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.pluginremap.PluginRemapper.remapPlugin(PluginRemapper.java:266) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:204) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
… 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) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.pluginremap.PluginRemapper.remapPlugin(PluginRemapper.java:266) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
at io.papermc.paper.pluginremap.PluginRemapper.rewritePluginDirectory(PluginRemapper.java:204) ~[paper-1.21.1.jar:1.21.1-74-971a7a5]
… 9 more
Any suggestions?
Best regards
Hello,
i´ve tried out a dev built of viaversion. That worked! Now starting the container this dev-version will be overwritten and the error occured again. How can I prevent this version from being overwritten at startup?
Best regards
Hey Michael, double check your Java version. You may need to update. I have the same issue, but 1.20.1 requires Java 22.
I’m still trying to sort out just how to get it updated myself as I’m running Java 19.0.2. I’ve pulled openjdk:22 but need to figure out how to point the minecraft server towards it yet… Still stuck on 19, and everything I’ve read says need to update or nothing is really going to work.
THX! for the hint
Hopefully it works! If you figure out a way to get this container to look at J22 before me, let me know! I’ll do the same.
I have the server running on a Pi4 under Ubuntu server. Unfortunately, I can’t find OpenJDK V22 there. I have now installed Java version 23 from ZULU. Unfortunately, the error still persists: failed to open viaversion.jar. However, I have manually put the latest viaversion5.0.5.jar into the plugin folder. I still get the error message, but then the server starts this version and the server runs.
I used the command “docker pull openjdk:22” in order to pull Java 22
From here: https://hub.docker.com/_/openjdk
Hello James, thx for your work and support! I will try to update the container by myself, but myabe you can explain by an example for viaversion. I´m running version 1.21.3. In the plugin-folder is an file calles viaversion, which is 9.758kb big. On the internet there exist an snapshot-version of viaversion, which is about 4.939.465kb big. How do I have to change which script, that the container download the correct last version of viaversion?
Best regards
Thx for Updating viaversion – It would be interesting to know how it is done for next time!