> ## 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 多人遊戲伺服器上建立和部署 Linux 遊戲伺服器組建。

本文包含如何在 PlayFab 多人遊戲伺服器上使用容器和處理序建立 Linux 組建的詳細資料。

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

本節概述協助您建立和部署 Linux 容器映像的具體步驟。

如[建立虛擬機器 (VM)](/zh-TW/services/playfab/multiplayer/servers/deploying-playfab-multiplayer-server-builds) 中所述，使用我們的服務時，您可以設定 VM，使其根據您的預算和需求在全球自動啟動為遊戲伺服器。為此，您不需要明確建立 VM，而是定義參數來決定如何代表您建立 VM。此程序稱為部署或建立組建。

PlayFab 多人遊戲伺服器可以部署 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/)

<a id="set-up-your-windows-development-device" />

## 設定您的 Windows 開發裝置

只有在您想要使用 Windows 開發裝置建立 Linux 容器映像時，才需要此步驟。或者，您可以使用已安裝 Docker 的 Linux 作業系統裝置、VM 或雙作業系統。

[Windows 子系統 Linux 版 (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)。雖然我們的 VM 使用 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)

**驗證已為 WSL 正確設定 Docker**

* 開啟 WSL 終端機
* 執行 **docker version**，確認已安裝 Docker 且使用的作業系統為 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 Container Registry

這些步驟可協助您建立並推送自訂 Linux 容器映像。

#### 將遊戲伺服器應用程式與 GSDK 整合

與使用 Windows 伺服器類似，您必須將遊戲伺服器程式碼與 PlayFab 多人遊戲伺服器 SDK (GSDK) 整合。GSDK 整合可以是容器映像的一部分。

如需指示，請參閱[撰寫遊戲伺服器組建](/zh-TW/services/playfab/multiplayer/servers/author-a-game-server-build)和[將您的遊戲與 PlayFab 遊戲伺服器 SDK (GSDK) 整合](/zh-TW/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk)。

#### 建立 Dockerfile

Dockerfile 是沒有副檔名的文字檔，包含建置指定容器映像所需的所有命令。

1. 開啟\_\_記事本\_\_或任何合適的編輯器
2. 新增執行和建置容器所需的特定命令。如需此檔案的範例，請參閱 [Wrapper 範例](/zh-TW/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，最好放在空的資料夾/目錄中。您應將建置容器映像所需的其他檔案新增至此資料夾。

使用\_\_記事本\_\_時的儲存指示：

* 選取 **File**> **Save as...** 以開啟儲存選項
* 前往您要儲存檔案的資料夾
* 在 **File name:** 下，使用 **"Dockerfile"**，包括引號。
* 對於 **Save as type:**，選取 **All Files**
* 選取 **UTF-8** 編碼
* 選取 **Save**

#### 建置並上傳 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](/zh-TW/services/playfab/multiplayer/servers/deploy-using-game-manager) 和[使用 PowerShell/API](/zh-TW/services/playfab/multiplayer/servers/deploy-using-powershell-api)。

<a id="windows-and-linux-container-image-differences" />

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

對於許多開發人員來說，使用 Windows 受控容器是偏好的簡單預設選擇。不過，部署在虛擬機器上的 Linux 容器映像享有較便宜的每小時費率。

<Note>
  無論您使用 Windows 還是 Linux 容器映像，都可以完全自訂您的遊戲伺服器。使用 Windows 伺服器時，您可以透過上傳資產來自訂受控容器映像。
</Note>

下表列出建立和使用它們時的一些差異。

| 開發人員選項 | Windows | Linux |
| - | - | - |
| 開發裝置作業系統 | Windows 作業系統 | [Windows 子系統 Linux 版 (WSL)](#set-up-your-windows-development-device) 或 Linux 作業系統 (使用雙作業系統或 VM) |
| 容器映像 | 使用我們的受控容器映像進行直接部署。您仍然可以透過將額外檔案上傳為資產來自訂容器。 | 需要更多工作，因為您必須建立自己的自訂容器映像，這可讓您擁有完全的控制權。 |

<a id="manage-linux-container-images-using-apis" />

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

您可以使用 API 管理 Linux 容器映像。對於組建生命週期的其餘部分 (檢視使用量、更新區域和待命設定、刪除)，請使用 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 檔案權限。\*\*如果您將 Linux 遊戲伺服器可執行檔以 `.zip` 封存上傳，它會失去執行權限，並在啟動時失敗，出現 "Permission denied" 錯誤。若要因應此問題，請改用 `.tar.gz`，或將啟動命令設定為在啟動可執行檔之前對其執行 `chmod +x` 的殼層指令碼。
</Warning>

### Tar.gz 和 tar 封存結構需求

解壓縮 `.tar` 或 `.tar.gz` 封存時，PlayFab 多人遊戲伺服器會移除封存中的第一層目錄 (相當於 `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 處理序型組建。對於組建生命週期的其餘部分 (檢視使用量、更新區域和待命設定、刪除)，請使用 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** - 單一 VM 上要裝載的遊戲伺服器執行個體數目。
  * **RegionConfigurations** - 要部署至的區域，以及待命伺服器數和伺服器數上限。

## 另請參閱

* [Docker 容器簡介](https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/)
* [建立您的第一部伺服器](/zh-TW/services/playfab/multiplayer/servers/create-your-first-server)
* [資源和範例](/zh-TW/services/playfab/multiplayer/servers/server-samples-resources)
* [PlayFab 多人遊戲伺服器軟體開發套件 (SDK)](/zh-TW/services/playfab/multiplayer/servers/server-sdks/overview)
* [API 參考](xref:titleid.playfabapi.com.multiplayer.multiplayerserver)


## Related topics

- [撰寫遊戲伺服器組建](/zh-TW/services/playfab/multiplayer/servers/author-a-game-server-build.md)
- [使用 PowerShell/API 部署組建](/zh-TW/services/playfab/multiplayer/servers/deploy-using-powershell-api.md)
- [使用 Game Manager 部署組建](/zh-TW/services/playfab/multiplayer/servers/deploy-using-game-manager.md)
- [組建定義和設定](/zh-TW/services/playfab/multiplayer/servers/build-definition.md)
- [Windows 的作業系統修補程式層級更新](/zh-TW/services/playfab/multiplayer/servers/os-patch-updates.md)
