> ## 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)에 설명된 대로, 서비스를 사용할 때 예산과 수요에 따라 전 세계에서 게임 서버로 VM이 자동으로 스핀업되도록 구성합니다. 이를 위해 VM을 명시적으로 생성하는 것이 아니라 사용자를 대신하여 생성되는 방법을 결정하는 매개 변수를 정의합니다. 이 프로세스를 빌드 배포 또는 생성이라고 합니다.

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 장치, VM 또는 듀얼 OS 시스템을 사용할 수 있습니다.

[Windows Subsystem for 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 Long-Term Support(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가 설치되어 있고 사용되는 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 플랫폼이 선택된 New build" 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를 호출하여 컨테이너 레지스트리 주소, 사용자 이름 및 암호를 검색하세요.

## Azure Container Registry에 Linux 컨테이너 이미지 생성 및 푸시

다음 단계는 사용자 지정 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                                                                                                   |
| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| 개발 장치 OS | Windows OS                                                              | [Windows Subsystem for Linux(WSL)](#set-up-your-windows-development-device) 또는 Linux OS(듀얼 OS 또는 VM 사용) |
| 컨테이너 이미지 | 관리형 컨테이너 이미지를 사용하여 간단하게 배포합니다. 추가 파일을 자산으로 업로드하여 컨테이너를 사용자 지정할 수도 있습니다. | 완전한 제어권을 제공하는 자체 사용자 지정 컨테이너 이미지를 만들어야 하므로 더 많은 작업이 필요합니다.                                              |

## 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를 **프로세스 모드**(컨테이너 모드 대신)로 사용할 때는 게임 서버를 컨테이너 이미지가 아닌 자산 아카이브로 업로드합니다. 이 섹션에서는 중요한 패키징 요구 사항을 설명합니다.

### 지원되는 아카이브 형식

Unix 파일 권한(예: 실행 비트)을 추출 중에 보존할 수 있도록 자산을 `.tar.gz` 또는 `.tar` 파일로 업로드해야 합니다.

<Warning>
  **`.zip` 파일은 Linux에서 Unix 파일 권한을 보존하지 않습니다.** Linux 게임 서버 실행 파일을 `.zip` 아카이브로 업로드하면 실행 권한이 손실되고 "Permission denied" 오류로 시작하지 못합니다. 이 문제를 해결하려면 `.tar.gz`를 대신 사용하거나 실행 파일을 시작하기 전에 `chmod +x`를 실행하는 셸 스크립트로 시작 명령을 설정하세요.
</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** - 단일 VM에서 호스팅할 게임 서버 인스턴스 수.
  * **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를 사용하여 빌드 배포](/ko/services/playfab/multiplayer/servers/deploy-using-powershell-api.md)
- [게임 서버 빌드 작성](/ko/services/playfab/multiplayer/servers/author-a-game-server-build.md)
- [GDKX로 첫 콘솔 타이틀 빌드 및 실행](/ko/home/build-first-title/first-console-title-walkthrough.md)
- [LocalMultiplayerAgent로 컨테이너 게임 서버 디버깅](/ko/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-container-gameserver.md)
- [PlayFab 멀티플레이어 서버 빌드 배포](/ko/services/playfab/multiplayer/servers/deploying-playfab-multiplayer-server-builds.md)
