|
@ -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 |
|
|
|
|
|
``` |