转载

使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

在 第 1 部分 和 第 2 部分 中,您了解了如何构建一个 Minecraft 服务器,并将它部署到在本地运行的 Docker 容器中,以及如何构建和部署服务器端插件来扩展您的本地 Minecraft 服务器。在这一部分中,我们将获取我们在第 2 部分中构建的 Docker 镜像,然后运行它们,使用它们作为可通过云访问的 Docker 容器。

Bluemix 和 Cloud Foundry 的特性和命令

但在开始之前,让我们回顾一下 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 存储库定义一个命名空间

在 IBM Containers for Bluemix 中,私有 Bluemix 存储库是一个组织中存储受信任的 Docker 镜像的中央存储库。您可以向该存储库推送镜像和从中拉取镜像,您可以将这些镜像部署到任何开发、暂存或生产环境。

您第一次在一个组织内创建容器时,系统会提示您为与该私有 Bluemix 存储库关联的命名空间输入一个名称。该命名空间用于生成唯一 URL,供您用于访问私有 Bluemix 存储库。您任何时候对存储库执行操作都需要这个 URL,比如一个镜像的拉取请求或推送请求。

以下规则适用于私有存储库名称:

  • 在为组织设置该名称后就无法更改它。
  • 该名称必须仅包含小写字母、数字和下划线。
  • 该名称必须以字母或数字开头。
  • 该名称必须在 4 到 30 个字符之间。

要设置您的命名空间,可使用此命令:

cf ic namespace set <namespace>

要确定您的命名空间是什么,可使用此命令:

cf ic namespace get

用于在 Bluemix 上构建和运行容器的 Dockerfile

在 第 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 克隆到的目录。

使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上
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 文件中重写列出的新属性,并将它们设置为默认值。

将 Docker 镜像部署到 Bluemix 并在 IBM 容器中运行它们

  1. 与在 第 1 部分 和 第 2 部分 中一样,如果没有这么做,请更改到 minecraft-project/spigot-plugin-bluemix 目录,并使用以下命令构建镜像 spigot-plugin-bluemix:
    cd $DIR/minecraft-project/spigot-plugin-bluemix docker build -t spigot-plugin-bluemix .
  2. 在成功构建镜像后,可以使用此命令检查它:
    docker images
    使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

    点击查看大图

  3. 接下来,创建一个标记,它是镜像的一个助记性名称。您可使用此命令,才存储库中为镜像 spigot-plugin-bluemix 创建该标记:
    docker tag spigot-plugin-bluemix  registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
    使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

    点击查看大图

  4. 构建并标记您的 Docker 镜像后,可以将它部署到您的 Bluemix 存储库。为此,您需要登录到您的 Bluemix 帐户,并向您的 Bluemix 注册表执行验证。(如果您属于多个 Bluemix 组织,那么您会获得提示,让您选择将要访问的组织。)
    cf login –u username –p password

    其中 username 和 password 是您在本教程开头指定的 Bluemix 用户名和密码。(您还可以发出 cf login 并被提示输入您的用户名和密码。)
  5. 要向您的 Bluemix 注册表执行验证,可以键入:
    cf ic login

    如果成功,您应看到类似下图的结果:

    使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上
  6. 要将 Docker 镜像部署(上传)到您的 Bluemix 存储库,可以键入下面这个命令。根据您的网络速度,这可能会花几分钟:
    docker push registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
  7. 要确认镜像已成功推送到您的 Bluemix 存储库,可以键入下面这个命令:
    cf ic images
  8. 现在 Docker 镜像已成功部署到 Bluemix,可以使用此命令在 Bluemix 中启动该容器:
    cf ic run --name=testspigot --publish=9085 registry.ng.bluemix.net/<namespace>/spigot-plugin-bluemix
  9. 接下来使用此命令,确认新容器已成功地在 Bluemix 上运行。
    cf ic ps
  10. 将在 Bluemix 容器内运行的 Spigot 服务器与一个公共 IP 地址关联,以便客户端可以访问该服务器。为此,您可发出以下命令:

    请求一个新的公共 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>

测试 Docker 镜像

将该 IP 地址绑定到您在 Bluemix 上运行的新容器后,就可以进行测试了。

  1. 转到您的本地 Minecraft 客户端并设置一个新服务器(像 第 1 部分 和 第 2 部分 中所做的一样),但这一次使用您通过 cf ic ip request 命令获得的新的公共 IP 地址(如果您忘记了它,可以使用 cf ic ip list 找到它)。一定要使用端口 9085 作为要连接到的该服务器地址上的端口。 使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

    点击查看大图

  2. 在设置此服务器后,应该能够加入该服务器,如下面两个屏幕截图所示: 使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

    点击查看大图

    使用 Bluemix、Docker 和 Watson 为 Minecraft 创建认知插件,第 3                 部分: 将 Spigot Minecraft 服务器部署在 Bluemix 上

    点击查看大图

结束语

如果您正确执行了所有步骤,那么您应该已经在游戏中,并能够使用您早先构建的 "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

正文到此结束
Loading...