Close your eyes for one moment and imagine that everything you host runs in docker containers. You no longer need to battle system dependencies, and configurations are more manageable; it is now easier to backup and transfer your applications. In my quest to dockerize everything, I am now dockerizing my Minecraft server. Minecraft is a relatively simple application to host since it is just a single Java application that you need to run. To put this in Docker, we need to declare a Java Docker image that launches our Minecraft server. ```bash FROM openjdk:8u232 WORKDIR /root/minecraft CMD java -Xmx2048M -jar spigot-1.10.jar -o true ``` To make this Docker container work, we need to mount the volume containing our Minecraft files to the path "/root/minecraft" in our Docker container. By mounting the volume, it enables us the persist the data between consecutive runs. To orchestrate all of my Docker containers, I am using Docker-compose. Although there is only one container for this instance, I can add additional services to this file; for example, If I had a website that went along with my server, I could use docker-compose to launch both the Minecraft server and the server's website. ```yaml version: "2.2" networks: bridge-network: external: name: bridge-network services: minecraft: restart: always image: minecraft build: ./minecraft-docker networks: - bridge-network volumes: - "./minecraft:/root/minecraft" ports: - "8123:8123" - "25565:25565" ``` To expose the Minecraft server to the internet, we need to tell docker-compose the applications ports. I am using a bridged docker network along with appending the ports in the docker-compose configuration file. Port 25565 is the default Minecraft server port, and port 8123 gets used by Dynmap. To create the network bridge, you need to run this command once. ```bash docker network create -d bridge bridge-network ``` We need to execute the build command to generate our new Minecraft Docker container: ```bash docker-compose build ``` To launch the server, we just run the compose-up command. ```bash docker-compose up ``` One quick note on the file structure that I am employing for this project: I like to keep the Dockerfiles in a directory separate from any volumes that I am mounting within those containers. Additionally, it is a good practice to have your docker-compose file at the root directory. ```bash ╭─jeff@dangerous ~/Docker ╰─$ tree -L 2 . ├── docker-compose.yml ├── minecraft │ ├── banned-ips.json │ ├── banned-players.json │ ├── bukkit.yml │ ├── commands.yml │ ├── crash-reports │ ├── eula.txt │ ├── logs │ ├── ops.json │ ├── permissions.yml │ ├── plugins │ ├── run.bat │ ├── server-icon.png │ ├── server.properties │ ├── spigot-1.10.jar │ ├── spigot.yml │ ├── survival ├── minecraft-docker │ └── Dockerfile └── README.md ``` Docker will scan the entire director before building a project-- Docker does this so it knows what caches it can use during an incremental build. To improve the build time, I add the Minecraft server folder to the docker-ignore file to prevent Docker from scanning all the world artifacts. ```bash # .dockerignore file minecraft ```