The main Minecraft container on this host is minecraft-server using image itzg/minecraft-server:java17. It is the default public server on host port 25565, not the secondary instance on 25566. docker inspect shows TYPE=PURPUR, VERSION=1.17.1, MEMORY=6G, USE_AIKAR_FLAGS=TRUE, ONLINE_MODE=TRUE, and a bind mount from /home/brian/minecraft/data to /data. The container is currently healthy, uses restart policy unless-stopped, and has been up since 2026-04-30T13:04:58Z.
The live config under /home/brian/minecraft/data/server.properties matches the container env: server-port=25565, motd=Brian's Minecraft Server, max-players=10, white-list=true, online-mode=true, view-distance=16, and simulation-distance=8. The world data directory is 2.3G and includes world, world_nether, world_the_end, plugins, purpur-1.17.1-1428.jar, and paper-1.17.1-411.jar, which confirms this is a persistent bind-mounted Purpur world rather than a throwaway container.
Runtime pressure is not trivial but it also does not look catastrophic right now. docker stats reported 12.73% CPU and 6.846GiB / 31.14GiB memory in use with 73 PIDs. That matters because the configured heap is 6G, so the observed resident usage is already above that and is consistent with the docs warning that heap sizing is not the whole container footprint.
The upstream itzg/docker-minecraft-server JVM docs state: "By default, the image declares an initial and maximum Java memory-heap limit of 1 GB" and MEMORY can be used to adjust both Xms and Xmx. They also warn: "The settings above only set the Java heap limits... An extra 25% is a general best practice." Source: https://raw.githubusercontent.com/itzg/docker-minecraft-server/master/docs/configuration/jvm-options.md
That lines up with the host evidence. A MEMORY=6G configuration does not mean the container will stay at 6 GiB total RSS. Your measured 6.846GiB container memory use is therefore plausible and not, by itself, evidence of a leak.
The same docs say Aikar tuning can be enabled with -e USE_AIKAR_FLAGS=true, and: "When MEMORY is greater than or equal to 12G, then the Aikar flags will be adjusted according to the article." Source: https://raw.githubusercontent.com/itzg/docker-minecraft-server/master/docs/configuration/jvm-options.md
Your main server has USE_AIKAR_FLAGS=TRUE but only MEMORY=6G, so you are getting the standard Aikar flag set, not the larger-memory adjustments. That is fine, but it means there is no hidden tuning magic here beyond the normal Paper/Purpur recommendations.
The upstream server-type docs describe Purpur as "a drop-in replacement for Paper servers designed for configurability and new, fun, exciting gameplay features" and say: "The VERSION variable is used to lookup a build of Purpur to download." Source: https://raw.githubusercontent.com/itzg/docker-minecraft-server/master/docs/types-and-platforms/server-types/paper.md
That matches the bind-mounted jar set on disk and explains why the container is straightforward to reason about: it is a normal Purpur-on-Docker deployment with persistent /data, not a bespoke modpack container.
The main operational issue is age, not current health. Minecraft Wiki states: "1.17.1 is a minor update to Java Edition, released on July 6, 2021... It is the last version to require Java 16." Source: https://minecraft.wiki/w/Java_Edition_1.17.1
By contrast, the current branch of Java Edition has moved far ahead. The 1.21.11 page says: "1.21.11... is a game drop for Java Edition released on December 9, 2025" and also notes it is "the final version to require Java 21." Source: https://minecraft.wiki/w/Java_Edition_1.21.11
So the host's main public server is pinned to a release that is roughly four and a half years behind current Java Edition. That does not automatically mean it is broken, but it does mean:
This also explains why the secondary container exists: minecraft-server-2 is already on VERSION=1.21.11 with only MEMORY=2G, ONLINE_MODE=FALSE, and an additional 8080 -> 8100 mapping. Operationally, that looks like the newer test or alternate instance while the real public world stays on the conservative legacy branch.
One historically relevant risk with this image family is healthcheck fragility around Purpur/Paper/Spigot message parsing. In issue #2545, an operator reported: "my web services in that container (through plugins) are no longer routed through my reverse proxy due to the health check failing" even though "the server seems to be running fine." The failing probe output was: failed to ping localhost:25565 : json: cannot unmarshal string into Go struct field ServerInfo.description of type mcpinger.RegularChatComponent. Source: https://github.com/itzg/docker-minecraft-server/issues/2545
That issue is not happening on your main container today because docker inspect shows health status healthy and the container has five recent successful health log entries. But it is still worth knowing because your stack is also TYPE=PURPUR on the java17 image line, which is the same general surface area that previously bit other operators.
The recent log tail does not show crash-loop behavior, watchdog stalls, OOM kills, or chunk-save failures. It shows ordinary player activity and disconnects:
Soldier456 moved wrongly!, (0.11177536172675546)AngryCactus12 joined the gamehidamari333 joined the gameThe moved wrongly warning is common and not enough on its own to indicate server instability. More importantly, the logs do not show the classic failure signatures I would expect if the container itself were the active incident.
The main Docker container was not the hidden culprit in the evidence I inspected. It is currently healthy, persistent, and serving the expected public world from /home/brian/minecraft/data on 25565.
The real finding is narrower and more useful: the "main" server is an intentionally old Purpur 1.17.1 deployment with a 6G heap, a 2.3G persisted world, whitelist enabled, and a stable bind mount. That makes it operationally understandable but strategically dated. If players are complaining about missing newer content, client-version mismatches, plugin weirdness, or outdated mechanics, the container investigation points back to version age and legacy-world conservatism, not to a dead or obviously misconfigured Docker runtime.
minecraft-server as the production legacy world and minecraft-server-2 as the modern branch. Do not conflate them during incident response.VERSION=1.17.1 pin versus current 1.21.11 reality./home/brian/minecraft/data/plugins, not generic Docker debugging.