创建和部署 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 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) 集成。 这可以是容器映像的一部分。
有关说明,请参阅 授权游戏服务器内部版本 并 使用 PlayFab 游戏服务器 SDK (GSDK) 集成游戏。
创建 Dockerfile
Dockerfile 是一个没有扩展名的文本文件,包含生成给定容器映像所需的所有命令。
- 打开 记事本 或任何合适的编辑器
- 添加运行和构建容器所需的特定命令。 有关此文件的示例,请参阅 包装器示例 中提供的 DockerFile。 有关如何创建此文件的详细信息,请参阅 创建 Dockerfile (外部) 时的 Dockerfile 格式 (外部) 和最佳做法
- 将文件另存为 Dockerfile,理想情况下保存在空文件夹/目录中。 应该把构建容器映像所需的其他文件添加到该文件夹中。
使用 记事本 时的保存说明:
- 选择 文件>另存为... 以打开保存选项
- 转到要将文件保存到的文件夹
- 在 文件名下:,使用 “Dockerfile”,包括引号。
- 对于 “另存为类型:”,选择“所有文件”
- 选择 UTF-8 编码
- 选择 “保存”
构建并上传 Linux 容器映像
- 打开 Linux 终端,确保已安装 Docker。
- 使用从先前步骤中获取的登录凭据,运行以下 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 以了解当前所在目录。
- 上传容器映像
运行以下命令,将映像推送到 Azure PlayFab 容器注册表。 为上传的容器映像选择有意义且有用的名称: 标记组合。 然后使用 docker push 或其他容器注册表客户端将容器上传到 PlayFab 运营的注册表。
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 (可选) - 如果容器没有默认运行命令,可以使用此属性提供要运行的命令以及任何参数。