本文包含有关如何使用容器和进程在 PlayFab 多人游戏服务器上创建 Linux 内部版本的详细信息。
创建和部署 Linux 容器映像
本部分概述了帮助创建和部署 Linux 容器映像的具体步骤。
如 创建虚拟机 (VM) 中所述,将 VM 配置为根据使用我们的服务时的预算和需求全局自动启动为游戏服务器。 为此,请勿显式创建 VM,而是定义参数来确定如何代表你创建 VM。 此过程称为部署或创建内部版本。
PlayFab 多玩家服务器可以部署基于 Linux 和 Windows 的游戏服务器。 为 Linux 容器部署构建的方式与 Windows 容器类似,但有一些重要的区别。 若要了解详细信息,请参阅 Windows 和 Linux 容器映像差异。 若要使用 PowerShell/API 管理 Linux 容器,请参阅 使用 API 管理 Linux 容器映像。
使用基于 Linux 的游戏服务器时,必须创建容器映像并将其上传到容器注册表,而不是使用托管容器映像。 为了便于上传容器,你的帐户附带了 Azure 容器注册表。
必需的知识
设置 Windows 开发设备
仅当要使用 Windows 开发设备创建 Linux 容器映像时,才需要执行此步骤。 或者,可以使用安装了 Docker 的 Linux OS 设备、VM 或双 OS 系统。
适用于 Linux 的 Windows 子系统 (WSL) 使你能够在熟悉的 Windows 环境中使用开发设备来编写和管理 Linux 容器映像。 使用 WSL 意味着不需要传统 Linux 虚拟机或双启动设置的开销。
- 安装 WSL 2。 请确保重启计算机并使用 WSL 2。 还需要安装 Linux 内核更新包。
- 安装使用 WSL 的 Linux 发行版。 虽然我们的虚拟机使用 Ubuntu,但可以为容器映像选择任何想要的发行版。 请考虑使用 Ubuntu 20.04 Long-Term 支持 (LTS) 或更高版本。
- 使用 WSL 2 安装适用于 Windows 的 Docker 桌面。 有关直接下载链接,请转到 适用于 Windows 的 Docker 桌面 (外部)。
验证 WSL 2 设置
- 打开 PowerShell
- 请运行 wsl -l -v 以检查 docker-desktop 和 ubuntu 应用程序是否正在运行 WSL 2 (版本 2)
请验证 Docker 是否为 WSL 正确设置
- 打开 WSL 终端
- 请运行 docker 版本 以确认已安装 Docker,并且使用的操作系统为 Linux
提示
若要开发和调试 Linux C++ 应用程序,请在 Visual Studio 2019 中使用 WSL。
获取 PlayFab 容器注册表登录凭据
Azure 容器注册表帐户与 PlayFab 帐户相关联。 仅你有权访问上传的容器。 此Azure容器注册表是免费的。
- 在 Game Manager 中,选择游戏,然后多人游戏>服务器。 选择“ 新建生成 ”以打开生成创建页。
- 选择 Linux 作为虚拟机操作系统。
- 记下登录凭据 - 名称、密码及 customer5555555.azurecr.io,因为稍后需要此信息
如果想使用 PowerShell/API,请调用 GetContainerRegistryCredentials API 来检索容器注册表地址、用户名和密码。
创建并推送 Linux 容器映像到 Azure 容器注册中心
这些步骤可帮助创建和推送自定义 Linux 容器映像。
将游戏服务器应用程序与 GSDK 集成
与使用 Windows 服务器类似,必须将游戏服务器代码与 PlayFab 多人服务器 SDK (GSDK) 集成。 GSDK 集成可以是容器映像的一部分。
有关说明,请参阅 授权游戏服务器内部版本 并 使用 PlayFab 游戏服务器 SDK (GSDK) 集成游戏。
创建 Dockerfile
Dockerfile 是一个没有扩展名的文本文件,包含生成给定容器映像所需的所有命令。
- 打开 记事本 或任何合适的编辑器
- 添加运行和构建容器所需的特定命令。 有关此文件的示例,请参阅 包装器示例 中提供的 DockerFile。 有关如何创建此文件的详细信息,请参阅 创建 Dockerfile (外部) 时的 Dockerfile 格式 (外部) 和最佳做法
- 将文件另存为 Dockerfile,理想情况下保存在空文件夹/目录中。 应该把构建容器映像所需的其他文件添加到该文件夹中。
使用 记事本 时的保存说明:
- 选择 文件>另存为... 以打开保存选项
- 转到要将文件保存到的文件夹
- 在 文件名下:,使用 “Dockerfile”,包括引号。
- 对于 “另存为类型:”,选择“所有文件”
- 选择 UTF-8 编码
- 选择 “保存”
构建并上传 Linux 容器映像
- 打开已安装 Docker 的 Linux 终端。
- 使用从先前步骤中获取的登录凭据,运行以下 Docker 命令。 然后按照屏幕上的说明输入用户名和密码。
docker login customer5555555.azurecr.io
docker 登录 将使你登录到 Azure 容器注册表中,如 Game Manager 中所示。
username: customer5555555
password: HRDFOdIebJkvBAS+usa55555555
- 构建容器映像
运行以下命令,使用当前目录中的 Dockerfile 生成容器映像。 docker build 命令的末尾有一个“.”。
-t 标志指定新容器映像的名称: 标记信息。 如果生成成功,将使用名称和标记。 如果存在构建错误,则必须在进入下一步之前将其修复。
在以下示例中,存储库名称 为 customer5555555.azurecr.io/pvp_gameserver ,标记为 v1。 有关详细信息,请参阅 docker 内部版本命令参考 (外部链接) 和 Build Dockerfile (外部链接)。
使用 WSL 时,Windows C: 驱动器装载在 /mnt/c。
- 然后运行 cd /mnt/c/path/to/your/Dockerfile 切换到 Dockerfile 所在的路径。 有关详细信息,请参阅 访问 C 驱动器。
docker build -t customer5555555.azurecr.io/pvp_gameserver:v1 .
提示
使用 Linux 时,请运行 pwd 以了解当前所在目录。
- 上传容器映像
运行命令,将映像推送到 PlayFab 容器注册表。 为上传的容器映像选择有意义且有用的名称: 标记组合。 若要将容器上传到 PlayFab 操作的注册表,请使用 docker push 或其他容器注册表客户端。
docker tag hello-world customer5555555.azurecr.io/pvp_gameserver:v1
docker push customer5555555.azurecr.io/pvp_gameserver:v1
检查容器是否已上传
上传容器后,返回到 Game Manager 中的 “新建构建” 页,然后选择 “刷新图像”。 将能够在列表中看到图像并将其选中。 或者,可以使用 ListContainerImages API 调用以列出上传的容器映像。
现在已准备好部署服务器。 有关说明,请参阅 PlayFab 门户 - Game Manager 和使用 PowerShell/API。
Windows 和 Linux 容器映像差异
对于许多开发人员来说,使用 Windows 托管容器是首选的简单和默认选择。 但是,部署在虚拟机上的 Linux 容器映像每小时享受更便宜的费率。
注意
无论使用的是 Windows 还是 Linux 容器映像,都可以完全自定义游戏服务器。 使用 Windows 服务器时,可以通过上传资产来自定义托管容器映像。
下表列出了创建和使用它们时的一些差异。
| 开发人员选项 | Windows | Linux |
|---|---|---|
| 开发设备操作系统 | Windows 操作系统 | 适用于 Linux 的 Windows 子系统 (WSL) 或 Linux 操作系统 (使用双操作系统或虚拟机) |
| 容器映像 | 使用托管容器映像进行直接部署。 你仍然可以通过将额外的文件作为资产上传来自定义容器。 | 需要执行更多工作,因为必须创建自己的自定义容器映像,以便完全控制。 |
使用 API 管理 Linux 容器映像
可以使用 API 管理 Linux 容器映像。 对于构建生命周期的其余部分 (查看使用情况、更新区域和 standingBy 配置、删除) 请使用 Game Manager 管理它们。
- GetContainerRegistryCredentials: 检索容器注册表地址、用户名和密码
- ListContainerImages 和 ListContainerImageTags: 确保列出新映像和标签 (有时可能需要几分钟时间才能将映像完全注册到系统中)
-
CreateBuildWithCustomContainer: 使用自定义容器构建生成。 指定之前上传的已标记的映像。 确保在请求中设置了以下属性:
- ContainerImageReference - 之前上传的图像名称和标记。 这些值在 ListContainerImages 和 ListContainerImageTags 中可见。
- ContainerFlavor - "CustomLinux"
- ContainerRunCommand (可选) - 如果容器没有默认命令,请使用此属性提供要运行的命令以及任何参数。
打包基于 Linux 进程的服务器的资产
在 进程模式下 使用 Linux (而不是容器模式) 时,需要将游戏服务器作为资产存档而不是容器映像上传。 本部分介绍重要的打包要求。
支持的存档格式
资产应以 或 .tar 文件的形式.tar.gz上传,以便在提取过程中保留 unix 文件权限 ((例如执行位) )。
警告
.zip 文件不会保留 Linux 上的 Unix 文件权限。 如果在存档中 .zip 上传 Linux 游戏服务器可执行文件,它将失去其执行权限,并且无法启动并出现“权限被拒绝”错误。 若要解决此问题,请改用 .tar.gz ,或者将 start 命令设置为在可执行文件上运行 chmod +x 的 shell 脚本,然后再启动它。
Tar.gz和 tar 存档结构要求
提取 .tar 或 .tar.gz 存档时,PlayFab 多人游戏服务器会从存档 (删除第一个目录级别,等效于 tar --strip-components=1) 。 存档 必须 包含单个顶级包装器目录,其中包含所有游戏文件。
正确的结构 — 顶级目录中的文件:
MyGameServer/
├── MyGame.x86_64
├── MyGame_Data/
│ └── ...
├── UnityPlayer.so
└── start_server.sh
使用以下命令创建存档:
tar czf MyGameServer.tar.gz MyGameServer/
警告
如果文件位于存档的根目录中,而没有包装器目录,则会在提取过程中 以无提示方式跳过 这些文件。 游戏服务器失败并出现“没有此类文件或目录”错误,因为可执行文件永远不会写入磁盘。
设置启动命令
对于基于进程的服务器,start 命令应 相对于提取 (之后的根资产文件夹 ,即相对于顶级目录被剥离) 后文件的最终位置。
例如,如果存档包含 MyGameServer/MyGame.x86_64,则提取后,文件位于资产文件夹的根目录中。 将 start 命令设置为:
MyGame.x86_64
例如,如果可执行文件位于子文件夹 (, MyGameServer/bin/MyGame.x86_64) ,请将 start 命令设置为:
bin/MyGame.x86_64
使用 API 管理基于 Linux 进程的生成
可以使用 API 来管理基于 Linux 进程的生成。 对于构建生命周期的其余部分 (查看使用情况、更新区域和 standingBy 配置、删除) 请使用 Game Manager 管理它们。
-
CreateBuildWithProcessBasedServer:创建游戏服务器作为进程运行的生成。 确保在请求中设置了以下属性:
- OsPlatform - “Linux”
-
GameAssetReferences - (上传为
.tar.gz或.tar文件) 的游戏资产列表。 每个资产都需要与上传的资产名称匹配的 FileName 。 -
StartMultiplayerServerCommand - 游戏服务器启动时要运行的命令。 提取后,路径应相对于根资产文件夹 (例如
MyGame.x86_64 -server,) 。 - 端口 - 要为生成映射的端口。
- MultiplayerServerCountPerVm - 在单个 VM 上托管的游戏服务器实例数。
- RegionConfigurations - 要部署到的区域,具有备用服务器计数和最大服务器计数。