| @ -0,0 +1,105 @@ | |||
| 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 | |||
| ``` | |||