> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 创建和部署 Linux 构建

> 使用 Linux 容器映像或基于 GSDK 的进程服务器，在 PlayFab Multiplayer Servers 上创建和部署 Linux 游戏服务器构建。

本文包含有关如何在 PlayFab Multiplayer Servers 上使用容器和进程创建 Linux 构建的详细信息。

## 创建和部署 Linux 容器映像

本节概述了帮助您创建和部署 Linux 容器映像的具体步骤。

如[创建虚拟机 (VM)](/services/playfab/multiplayer/servers/deploying-playfab-multiplayer-server-builds)中所述，使用我们的服务时，您可以将虚拟机配置为根据您的预算和需求在全球范围内自动作为游戏服务器启动。为此，您不必显式创建虚拟机，而是定义参数以确定它们如何代表您创建。此过程称为部署或创建构建。

PlayFab Multiplayer Servers 可以部署基于 Linux 和基于 Windows 的游戏服务器。为 Linux 容器部署构建的方式与 Windows 容器类似，但有一些重要区别。要了解更多信息，请参阅 [Windows 和 Linux 容器映像的差异](#windows-and-linux-container-image-differences)。如果要使用 PowerShell/API 管理 Linux 容器，请参阅[使用 API 管理 Linux 容器映像](#manage-linux-container-images-using-apis)。

使用基于 Linux 的游戏服务器时，您必须创建并将容器映像上传到容器注册表，而不是使用托管的容器映像。为了便于上传容器，您的账户附带了一个 Azure 容器注册表。

## 所需知识

* [Docker 容器](https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/)

## 设置 Windows 开发设备

仅当您要使用 Windows 开发设备创建 Linux 容器映像时才需要此步骤。或者，您可以使用安装了 Docker 的 Linux OS 设备、虚拟机或双操作系统。

[适用于 Linux 的 Windows 子系统 (WSL)](https://learn.microsoft.com/en-us/windows/wsl/) 使您可以在熟悉的 Windows 环境中使用开发设备编写和管理 Linux 容器映像。使用 WSL 意味着您无需承担传统 Linux 虚拟机或双引导设置的开销。

1. [安装 WSL 2](https://learn.microsoft.com/en-us/windows/wsl/)。请确保重启计算机并使用 WSL 2。您还需要安装 Linux 内核更新包。
2. [安装使用 WSL 的 Linux 发行版](https://learn.microsoft.com/en-us/windows/wsl/install#step-6---install-your-linux-distribution-of-choice)。虽然我们的虚拟机使用 Ubuntu，但您可以为容器映像选择任何发行版。考虑使用 [Ubuntu 20.04 长期支持 (LTS)](https://www.microsoft.com/store/apps/9n6svws3rx71) 或更高版本。
3. [使用 WSL 2 安装 Windows 版 Docker Desktop](https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers)。如需直接下载链接，请转到 [Windows 版 Docker Desktop（外部链接）](https://hub.docker.com/editions/community/docker-ce-desktop-windows/)。

**验证 WSL 2 设置**

* 打开 PowerShell
* 运行 **wsl -l -v** 以检查 docker-desktop 和 ubuntu 应用程序是否都在运行 WSL 2（版本 2）

**验证 Docker 是否正确设置为 WSL**

* 打开 WSL 终端
* 运行 **docker version** 确认已安装 Docker 且使用的 OS 为 Linux

<Tip>
  对于开发和调试 Linux C++ 应用程序，请使用 [Visual Studio 2019 中的 WSL](https://learn.microsoft.com/en-us/cpp/linux/)。
</Tip>

## 获取 PlayFab 容器注册表登录凭据

Azure 容器注册表账户与您的 PlayFab 账户相关联。只有您可以访问上传到那里的容器。此 Azure 容器注册表免费。

* 在 Game Manager 中，选择您的游戏标题，然后选择 **Multiplayer** > **Servers**。选择 **New build** 打开构建创建页面。
* 选择 **Linux** 作为虚拟机操作系统。
* 请注意登录凭据 — 名称、密码和 customer5555555.azurecr.io，因为稍后需要此信息

<img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/create-your-first-server/server-new-build-container-linux.PNG?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=0e2c264ec94672fe84912799f1acab32" alt="选择了 Linux 平台的新建构建" width="800" height="551" data-path="images/playfab/multiplayer/servers/create-your-first-server/server-new-build-container-linux.PNG" />

如果您希望使用 PowerShell/API，请调用 [GetContainerRegistryCredentials](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayerserver/getcontainerregistrycredentials) API 以检索容器注册表地址、用户名和密码。

## 创建 Linux 容器映像并推送到 Azure 容器注册表

以下步骤可帮助您创建并推送自定义 Linux 容器映像。

#### 将游戏服务器应用程序与 GSDK 集成

与使用 Windows 服务器类似，您必须将游戏服务器代码与 PlayFab Multiplayer Server SDK (GSDK) 集成。GSDK 集成可以是容器映像的一部分。

有关说明，请参阅[创作游戏服务器构建](/services/playfab/multiplayer/servers/author-a-game-server-build)和[将标题与 PlayFab Game Server SDK (GSDK) 集成](/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk)。

#### 创建 Dockerfile

Dockerfile 是没有扩展名的文本文件，包含构建给定容器映像所需的所有命令。

1. 打开 **记事本** 或任何合适的编辑器
2. 添加运行和构建容器所需的特定命令。有关此文件的示例，请参阅 [Wrapper 示例](/services/playfab/multiplayer/servers/wrapper-sample)中提供的 [DockerFile](https://github.com/PlayFab/MpsSamples/blob/master/wrappingGsdk/Dockerfile)。有关如何创建此文件的详细信息，请参阅 [Dockerfile 格式（外部链接）](https://docs.docker.com/engine/reference/builder/#format)和[创建 Dockerfile 时的最佳实践（外部链接）](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
3. 将文件另存为 Dockerfile，最好保存在空文件夹/目录中。您应将构建容器映像所需的其他文件添加到此文件夹中。

使用 **记事本** 时的保存说明：

* 选择 **文件**> **另存为...** 打开保存选项
* 转到要保存文件的文件夹
* 在 **文件名：** 下，使用 **"Dockerfile"**，包括引号。
* 对于 **保存类型：**，选择 **所有文件**
* 选择 **UTF-8** 编码
* 选择 **保存**

#### 构建并上传 Linux 容器映像

1. 打开安装了 Docker 的 Linux 终端。
2. 使用之前步骤中获取的登录凭据运行以下 Docker 命令。然后按照屏幕上的说明输入用户名和密码。

```docker theme={null}
docker login customer5555555.azurecr.io
```

[docker 登录](https://docs.docker.com/engine/reference/commandline/login/)将您登录到 Game Manager 中显示的 Azure 容器注册表。

```docker theme={null}
username: customer5555555
password: HRDFOdIebJkvBAS+usa55555555
```

3. 构建容器映像

运行以下命令以使用当前目录中的 Dockerfile 构建容器映像。**docker build** 命令末尾有一个"."。

**-t** 标志为您的新容器映像指定 name:tag 信息。如果构建成功，则使用名称和标签。如果存在生成错误，则必须先修复它们，然后再继续下一步。

在以下示例中，存储库名称为 **customer5555555.azurecr.io/pvp\_gameserver**，标签为 **v1**。有关更多信息，请参阅 [docker build 命令参考（外部链接）](https://docs.docker.com/engine/reference/commandline/build/)和[构建 Dockerfile（外部链接）](https://docs.docker.com/engine/reference/builder/)。

使用 WSL 时，Windows C: 驱动器挂载在 /mnt/c 上。

* 然后运行 **cd /mnt/c/path/to/your/Dockerfile** 切换到 Dockerfile 所在的路径。
  有关更多信息，请参阅[访问 C 驱动器](https://learn.microsoft.com/en-us/windows/wsl/faq#how-do-i-access-my-c--drive-)。

```docker theme={null}
docker build -t customer5555555.azurecr.io/pvp_gameserver:v1 .
```

<Tip>
  使用 Linux 时，运行 **pwd** 可查找您当前所在的目录。
</Tip>

4. 上传容器映像

运行以下命令将映像推送到您的 PlayFab 容器注册表。为上传的容器映像选择一个有意义且有用的 name:tag 组合。要将容器上传到 PlayFab 运营的注册表，请使用 [docker push](https://docs.docker.com/engine/reference/commandline/push/) 或其他容器注册表客户端。

```docker theme={null}
docker tag hello-world customer5555555.azurecr.io/pvp_gameserver:v1
docker push customer5555555.azurecr.io/pvp_gameserver:v1
```

## 检查您的容器是否已上传

上传容器后，返回 Game Manager 中的 **New Build** 页面并选择 **Refresh Images**。您可以在列表中看到该映像并进行选择。或者，您可以使用 [ListContainerImages](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayerserver/listcontainerimages) API 调用列出您上传的容器映像。

现在您可以部署服务器了。有关说明，请参阅 [PlayFab 门户 — Game Manager](/services/playfab/multiplayer/servers/deploy-using-game-manager) 和[使用 PowerShell/API](/services/playfab/multiplayer/servers/deploy-using-powershell-api)。

## Windows 和 Linux 容器映像的差异

对于许多开发人员而言，使用 Windows 托管容器是首选的简单和默认选择。然而，部署在虚拟机上的 Linux 容器映像享有更便宜的小时费率。

<Note>
  无论您使用 Windows 还是 Linux 容器映像，都可以完全自定义游戏服务器。使用 Windows 服务器时，您可以通过上传资产来自定义托管容器映像。
</Note>

下表列出了创建和使用它们时的一些差异。

| 开发人员选项   | Windows                                    | Linux                                                                                            |
| -------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| 开发设备操作系统 | Windows OS                                 | [适用于 Linux 的 Windows 子系统 (WSL)](#set-up-your-windows-development-device) 或 Linux OS（使用双操作系统或虚拟机） |
| 容器映像     | 使用我们的托管容器映像可直接部署。您仍然可以通过上传额外的文件作为资产来自定义容器。 | 需要更多工作，因为您必须创建自己的自定义容器映像，从而获得完全控制权。                                                              |

## 使用 API 管理 Linux 容器映像

您可以使用 API 来管理 Linux 容器映像。对于其余构建生命周期（查看使用情况、更新区域和 standingBy 配置、删除），请使用 Game Manager 管理。

* [GetContainerRegistryCredentials](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/get-container-registry-credentials)：检索容器注册表地址、用户名和密码
* [ListContainerImages](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/list-container-images) 和 [ListContainerImageTags](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/list-container-image-tags)：确保您的新映像和标签已列出（有时映像可能需要几分钟才能在系统中完全注册）
* [CreateBuildWithCustomContainer](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/create-build-with-custom-container)：使用自定义容器创建构建。指定您先前上传的带标签的映像。确保在请求上设置以下属性：
  * **ContainerImageReference** - 之前上传的映像名称和标签。这些值在 ListContainerImages 和 ListContainerImageTags 中可见。
  * **ContainerFlavor** - "CustomLinux"
  * **ContainerRunCommand**（可选）- 如果您的容器没有默认命令，请使用此属性提供要运行的命令以及任何参数。

## 为基于 Linux 进程的服务器打包资产

在**进程模式**（而不是容器模式）下使用 Linux 时，您将游戏服务器作为资产存档而不是容器映像上传。本节介绍重要的打包要求。

### 支持的存档格式

资产应作为 `.tar.gz` 或 `.tar` 文件上传，以便在提取期间保留 Unix 文件权限（例如执行位）。

<Warning>
  **`.zip` 文件在 Linux 上不保留 Unix 文件权限。** 如果您在 `.zip` 存档中上传 Linux 游戏服务器可执行文件，它会丢失执行权限并因"Permission denied"错误而无法启动。要解决此问题，请改用 `.tar.gz`，或将启动命令设置为在启动前对可执行文件运行 `chmod +x` 的 shell 脚本。
</Warning>

### Tar.gz 和 tar 存档结构要求

提取 `.tar` 或 `.tar.gz` 存档时，PlayFab Multiplayer Servers 会剥离存档的第一个目录级别（相当于 `tar --strip-components=1`）。您的存档**必须**包含一个顶级包装目录，其中包含所有游戏文件。

**正确的结构** — 文件在顶级目录内：

```
MyGameServer/
├── MyGame.x86_64
├── MyGame_Data/
│   └── ...
├── UnityPlayer.so
└── start_server.sh
```

使用以下命令创建存档：

```bash theme={null}
tar czf MyGameServer.tar.gz MyGameServer/
```

<Warning>
  如果您的文件位于存档的根目录中，没有包装目录，则会在提取过程中被**静默跳过**。您的游戏服务器会因"No such file or directory"错误而失败，因为可执行文件从未写入磁盘。
</Warning>

### 设置启动命令

对于基于进程的服务器，启动命令应**相对于提取后的根资产文件夹**（即，相对于剥离顶级目录后文件所在的位置）。

例如，如果您的存档包含 `MyGameServer/MyGame.x86_64`，则提取后文件位于资产文件夹的根目录。将启动命令设置为：

```
MyGame.x86_64
```

如果您的可执行文件位于子文件夹中（例如 `MyGameServer/bin/MyGame.x86_64`），请将启动命令设置为：

```
bin/MyGame.x86_64
```

## 使用 API 管理基于 Linux 进程的构建

您可以使用 API 管理基于 Linux 进程的构建。对于其余构建生命周期（查看使用情况、更新区域和 standingBy 配置、删除），请使用 Game Manager 管理。

* [CreateBuildWithProcessBasedServer](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/create-build-with-process-based-server)：创建将游戏服务器作为进程运行的构建。确保在请求上设置以下属性：
  * **OsPlatform** - "Linux"
  * **GameAssetReferences** - 游戏资产列表（上传为 `.tar.gz` 或 `.tar` 文件）。每个资产都需要一个与上传的资产名称匹配的 **FileName**。
  * **StartMultiplayerServerCommand** - 游戏服务器启动时要运行的命令。路径应相对于提取后的根资产文件夹（例如 `MyGame.x86_64 -server`）。
  * **Ports** - 要为构建映射的端口。
  * **MultiplayerServerCountPerVm** - 要在单个虚拟机上托管的游戏服务器实例数。
  * **RegionConfigurations** - 要部署到的区域，具有备用和最大服务器数。

## 另请参阅

* [Docker 容器简介](https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/)
* [创建您的第一个服务器](/services/playfab/multiplayer/servers/create-your-first-server)
* [资源和示例](/services/playfab/multiplayer/servers/server-samples-resources)
* [PlayFab Multiplayer Server 软件开发工具包 (SDK)](/services/playfab/multiplayer/servers/server-sdks/overview)
* [API 参考](xref:titleid.playfabapi.com.multiplayer.multiplayerserver)


## Related topics

- [使用 PowerShell/API 部署构建](/zh-CN/services/playfab/multiplayer/servers/deploy-using-powershell-api.md)
- [Windows 的操作系统补丁级别更新](/zh-CN/services/playfab/multiplayer/servers/os-patch-updates.md)
- [将 Linux Unreal 服务器部署到 MPS 云](/zh-CN/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/setting-up-a-linux-dedicated-server-on-playfab.md)
- [部署 PlayFab 多人游戏服务器构建](/zh-CN/services/playfab/multiplayer/servers/deploying-playfab-multiplayer-server-builds.md)
- [使用 GDKX 构建并运行你的第一款主机游戏](/zh-CN/home/build-first-title/first-console-title-walkthrough.md)
