在 第 1 部分 和 第 2 部分 中,您了解了如何构建一个 Minecraft 服务器,并将它部署到在本地运行的 Docker 容器中,以及如何构建和部署服务器端插件来扩展您的本地 Minecraft 服务器。在这一部分中,我们将获取我们在第 2 部分中构建的 Docker 镜像,然后运行它们,使用它们作为可通过云访问的 Docker 容器。
但在开始之前,让我们回顾一下 Bluemix 和 Cloud Foundry 的一些特性。Bluemix 是 IBM 基于 Cloud Foundry 的平台即服务 (PaaS) 解决方案,它使得开发人员能够快速创建、部署、管理和监视云应用程序。Cloud Foundry 是一个开源的 PaaS 解决方案,它在构建云解决方案的方式上为开发人员和组织提供了许多选择。例如,开发人员可以选择使用 buildpack(基于社区、自定义构建或从头构建),它可以很方便地打包框架和运行时。
第 1 部分:设置您的本地 Minecraft 和 Docker 开发环境,开始在您自己的服务器上使用 Minecraft。
第 2 部分:设置您的本地 Eclipse 开发环境,然后开发、构建您自己的服务器端 Minecraft 插件,并将它导出到一个本地 Docker 镜像中。
第 3 部分:
将 Docker 镜像部署到 Bluemix,然后运行它们,使用它们作为可通过云访问的 Docker 容器。
第 4 部分:使用一个插件扩展 Spigot 服务器,该插件使用 Bluemix 上的 Watson 认知服务为您的游戏体验增添一些科学性。
要使用 Bluemix,第一步是 注册一个免费试用版帐户。创建您的帐户时,请记下您的访问凭证(用户名和密码),因为在本教程的后面部分将需要它们。
不同于 Cloud Foundry 的开源版本,Bluemix 使得将 Docker 容器部署到云中成为可能。将 Docker 容器部署在 Bluemix 上时,我们将同时使用 Cloud Foundry 命令行接口 (cf
) 和您已在 第 1 部分 中安装的用于 IBM Containers 的 Cloud Foundry 插件 (cf ic
)。
cf ic
命令用于管理 Bluemix 环境中的容器。命令 cf ic login
向 Bluemix 存储库验证用户,并提供用于在 Bluemix 中存储镜像的私有注册表的信息。cf ic
命令实际上是 Docker 的一个扩展,支持所有 Docker 命令以及一些专门用于管理 Bluemix 上的 IBM 容器的命令。
下面是其他一些使用 Cloud Foundry 命令行接口和用于 IBM Containers 的 Cloud Foundry 插件的有用命令:
列出 Bluemix 存储库中的镜像:
cf ic images
显示 Bluemix 中运行的容器:
cf ic ps
显示 Bluemix 中的所有容器:
cf ic ps –a
停止一个运行的容器:
cf ic stop CONTAINER
从 Bluemix 存储库中删除镜像:
cf ic rmi IMAGE
从 Bluemix 存储库中删除容器:
cf ic rm CONTAINER
在 IBM Containers for Bluemix 中,私有 Bluemix 存储库是一个组织中存储受信任的 Docker 镜像的中央存储库。您可以向该存储库推送镜像和从中拉取镜像,您可以将这些镜像部署到任何开发、暂存或生产环境。
您第一次在一个组织内创建容器时,系统会提示您为与该私有 Bluemix 存储库关联的命名空间输入一个名称。该命名空间用于生成唯一 URL,供您用于访问私有 Bluemix 存储库。您任何时候对存储库执行操作都需要这个 URL,比如一个镜像的拉取请求或推送请求。
以下规则适用于私有存储库名称:
要设置您的命名空间,可使用此命令:
cf ic namespace set <namespace>
要确定您的命名空间是什么,可使用此命令:
cf ic namespace get
在 第 1 部分 中,您将一个 git 存储库 (https://github.com/kgb1001001/minecraft-project.git) 克隆到了您的本地空间。在 minecraft-project 目录中,有一个名为 spigot-plugin-bluemix 的文件夹,它包含一个 Dockerfile、一个 server.properties 文件和一个 HelloWorld.jar 文件。正如之前介绍的,Dockerfile 用于构建以后将推送到 Bluemix 容器的镜像。HelloWorld.jar 文件是包含 Spigot 的服务器模拟器的插件,就像我们在 第 2 部分 中创建的一个一样。
要更改到 spigot-plugin-bluemix 目录并打印新的 Dockerfile 的内容,可以在 Linux 终端运行以下命令:
cd $DIR/minecraft-project cd spigot-plugin-bluemix ls
其中 DIR
是您从 GitHub 将 Minecraft-project 克隆到的目录。
cat dockerfile
查看 Dockerfile 并查找与 0.0.3 版的区别;我们接下来将讨论它们的区别。
# Version 0.0.4 # This version builds a spigot server # using the recommended build strategy for spigot # This is advantageous in that it’s better for plugin development # and fits well with the Docker approach # it also adds a first Minecraft plugin into the bare spigot server # FROM ubuntu:14.04 MAINTAINER Kyle Brown “brownkyl@us.ibm.com” RUN apt-get update RUN apt-get install -y git RUN apt-get install -y openjdk-7-jre-headless RUN apt-get install -y wget RUN mkdir minecraft RUN wget "https://hub.spigotmc.org//jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" -O minecraft/BuildTools.jar RUN git config --global core.autocrlf input RUN java -jar minecraft/BuildTools.jar RUN echo "eula=true" > eula.txt ADD server.properties ./server.properties RUN mkdir plugins ADD HelloWorld.jar /plugins/HelloWorld.jar CMD java -XX:MaxPermSize=128M -Xms512m -Xmx1024m -jar spigot-1.8.8.jar nogui EXPOSE 9085
找出这个 Dockerfile 中的两处区别了吗?第一处更改是引入了一个要添加到 Docker 镜像的新文件 (server.properties)。第二处更改是公开的端口。让我们首先讲讲端口设置,因为它是较简单的一处更改。
Bluemix 默认情况下仅开放低于某个端口编号的端口。我们目前为止使用的端口编号(默认的 Minecraft 端口:25565)超出了这个范围。通过公开一个更低的端口编号,您能够满足 Bluemix 限制。但是,这需要您对服务器配置执行一次更改,您接下来将会看到。
在执行这些服务器配置更改之前,需要讲讲我们添加的 server.properties 文件,它存储一个多玩家(Minecraft 或 Minecraft Classic)服务器的所有设置。目前为止我们使用的是默认配置,还不需要这个可选的文件。可以运行下面这个命令来查看新的 server.properties 文件的内容:
cat server.properties
server.properties 文件的内容为:
#Minecraft server properties #(File modification datestamp) spawn-protection=16 max-tick-time=60000 generator-settings= force-gamemode=false allow-nether=true gamemode=0 enable-query=false player-idle-timeout=0 difficulty=1 spawn-monsters=true op-permission-level=4 resource-pack-hash= announce-player-achievements=true pvp=true snooper-enabled=true level-type=DEFAULT hardcore=false enable-command-block=false max-players=20 network-compression-threshold=256 max-world-size=29999984 server-port=9085 server-ip= spawn-npcs=true allow-flight=false level-name=world view-distance=10 resource-pack= spawn-animals=true white-list=false generate-structures=true online-mode=false max-build-height=256 level-seed= use-native-transport=true motd=A Minecraft Server enable-rcon=false
编辑 server.properties 时,您必须使用与原始文件相同的结构,但这些行的顺序是任意的。等号之前的文本是键,不要更改它。等号之后的文本是属性的值,您可以编辑它。以 # 开头的行是注释 — 修改或删除这些行对游戏没有影响。
事实证明,Bluemix(或 SoftLayer)会拦截用于与 Mojang 身份验证服务器进行外部通信的身份验证端口。为了解决这个问题,需要将属性 online-mode
设置为 false
,这样会在用户登录时跳过身份验证步骤。警告:这在本质上会让您的 Minecraft 服务器变得不安全。此设置对测试和调试(这就是我们使用它的目的)很有用,但您不应将此设置用于生产级服务器。
最终,您需要运行 Minecraft 服务器,在端口 9085 上进行监听,这是我们在 Dockerfile 中公开的端口。可以通过更改 server.properties 文件中的 server-port
设置来实现此目的。
更改 server.properties 文件后,必须重新启动服务器,它们才会生效。在我们的例子中,我们总是会重新启动整个 Docker 镜像,这样将满足该需求。如果 server.properties 文件没有列出所有属性(例如,如果服务器的一个新版本添加了新属性或如果该文件不存在),那么在启动时,该服务器在 server.properties 文件中重写列出的新属性,并将它们设置为默认值。
cd $DIR/minecraft-project/spigot-plugin-bluemix docker build -t spigot-plugin-bluemix .
docker images
docker tag spigot-plugin-bluemix registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
cf login –u username –p password
username
和 password
是您在本教程开头指定的 Bluemix 用户名和密码。(您还可以发出 cf login
并被提示输入您的用户名和密码。) cf ic login
如果成功,您应看到类似下图的结果:
docker push registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
cf ic images
cf ic run --name=testspigot --publish=9085 registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
cf ic ps
请求一个新的公共 IP 地址(一定要记下返回的 IP 地址 <ip>
):
cf ic ip request
将该公共 IP 绑定到在 Bluemix 中运行的 spigot-plugin-bluemix 容器:
cf ic ip bind <ip> spigot-plugin-bluemix
如果遇到任何问题,这些命令可以帮助您调试在获取 IP 地址上的任何问题:
返回可供您的组织使用的 IP:
cf ic ip list
释放 <ip>
地址,以便可以重用它:
cf ic ip release <ip>
将该 IP 地址绑定到您在 Bluemix 上运行的新容器后,就可以进行测试了。
cf ic ip request
命令获得的新的公共 IP 地址(如果您忘记了它,可以使用 cf ic ip list
找到它)。一定要使用端口 9085 作为要连接到的该服务器地址上的端口。 如果您正确执行了所有步骤,那么您应该已经在游戏中,并能够使用您早先构建的 "Hello World" 插件。试验以各种方式更改该插件,重复上述步骤来查看容器的工作原理!
在本 教程系列 的 第 4 部分 中,您将学习如何使用一个使用 Watson 认知服务的插件扩展 Spigot 服务器。IBM 在 Bluemix 上提供了多个 Watson 服务,您可以使用它们来构建认知解决方案,包括教育性和交互式游戏体验。
在 Bluemix 中使用 Docker 容器的一个问题是,您需要运行大量命令来构建您的容器,将它推送到 Bluemix 上的存储库,请求和分配一个 IP 地址,以及在完成时撤销所有这些操作。执行此过程几次后,这种重复会变得沉闷乏味。
所以,我们鼓励您使用自动化,将所有这些命令集中到一些简单的脚本中来执行这些常见的操作。我们包含了两个示例脚本(名为 setup.sh 和 cleanup.sh),我们已将它们上传到 GitHub 中的 Minecraft 项目 中。
这是 setup.sh 脚本。试验使用此脚本,您可能很快会发现您不再想返回单独键入每个命令!
#!/bin/bash # setup script N="kgb1001001" if [ "$#" -ne 5 ]; then echo "ERROR: setupcf takes 5 parameters" echo "usage ./setupcf.sh local_directory image_name container_name container_ip container_port" exit 1 else # Check for availability of the IP address echo "Checking for available IP address. The program will override IP provided in the Argument with retrieved IP !!" ipaddr=$(sudo cf ic ip list | sed 1d | sed '/^/s*$/d' | sed 1d | awk 'NF < 2' | head -n 1) if [ [$ipaddr == $4] ]; then echo "Using the IP address provided : $4" fi if [ -z "$ipaddr" ]; then echo "Unable to find a IP address to use -- Terminating program !!!:" echo "Use the command: cf ic ip request " echo "Refer to this URL to release IP over Quota: https://www.ng.bluemix.net/docs/containers/container_cli_reference_cfic.html" exit 0 else echo "Using the IP address retrieved from Bluemix: $ipaddr" set -- "$1" "$2" "$3" "$ipaddr" "$5" fi echo "Clean up the Docker Image Locally" docker rmi registry.ng.bluemix.net/$N/$2 sleep 10s echo "Phase 1->building container locally" echo docker build -t $2 $1 docker build -t $2 $1 # sleep 15s echo "Phase 2->tagging container" echo docker tag -f $2 registry.ng.bluemix.net/$N/$2 docker tag -f $2 registry.ng.bluemix.net/$N/$2 echo "Phase 1->building container locally" echo docker build -t $2 $1 docker build -t $2 $1 # sleep 15s echo "Phase 2->tagging container" echo docker tag -f $2 registry.ng.bluemix.net/$N/$2 docker tag -f $2 registry.ng.bluemix.net/$N/$2 # sleep 15s echo "Login to the Container Registry" sudo cf ic login echo "Phase 3->pushing container to bluemix" echo docker push registry.ng.bluemix.net/$N/$2 docker push registry.ng.bluemix.net/$N/$2 sleep 45s echo "Phase 4->validating image list" echo cf ic images > images.txt cf ic images > images.txt cat images.txt | grep $2 echo "Phase 5->running container on bluemix" sleep 45s echo cf ic run --name $3 --publish $5 registry.ng.bluemix.net/$N/$2 cf ic run --name $3 --publish $5 registry.ng.bluemix.net/$N/$2 echo "Phase 6->binding IP address" echo cf ic ip bind $4 $3 cf ic ip bind $4 $3 exit 0 fi