转载

使用 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

    其中 usernamepassword 是您在本教程开头指定的 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...