> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/docs/tools-and-integrations/docker.md).

# Docker и контейнеры

Почему Edgegap запускает игровые серверы в контейнерах и как настроить Docker перед сборкой своего первого образа сервера.

{% columns %}
{% column width="25%" %}

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-e6111f686dccc8bebc29f2f10fe2ce093f9c2b9c%2Fdocker.png?alt=media" alt="" width="100"><figcaption></figcaption></figure>
{% endcolumn %}

{% column width="75%" %}
Docker — это открытая платформа для разработки, доставки и запуска приложений. Docker позволяет отделить ваши приложения от инфраструктуры, чтобы вы могли быстро поставлять программное обеспечение.
{% endcolumn %}
{% endcolumns %}

## Зачем использовать Docker?

Работа в команде разработчиков предполагает совместное использование кода. Когда что-то идет не так, последнее, что вы хотите услышать — «у меня работает». Серверы игр должны надежно запускаться на любой машине, поскольку успешные игровые серверы работают на тысячах серверов по всему миру.

Чтобы сделать ваш сервер надежным, мы используем Docker — виртуализационное ПО, гарантирующее, что все зависимости вашего серверного кода вплоть до уровня операционной системы всегда будут точно такими же, независимо от того, как и где запускается сервер.

{% hint style="info" %}
Мы рекомендуем посмотреть [«Никогда не устанавливайте локально» (видео)](https://www.youtube.com/watch?v=J0NuOlA2xDc\&ab_channel=Coderized). **Вам НЕ нужно использовать Dockerhub с Docker**.  Docker ≠ Dockerhub. Думайте о Docker как о движке для программирования, а о Dockerhub — как о его магазине приложений.
{% endhint %}

## Контейнеры

Один **контейнер — это стандартная единица программного обеспечения, которая упаковывает код** и все его зависимости, чтобы приложение работало быстро и надежно в одной вычислительной среде и в другой. Контейнеры изолируют программное обеспечение от среды и обеспечивают его единообразную работу, несмотря на различия, например между средой разработки и стендом.

\
После запуска упакованных образов Docker они становятся:

* **Контейнеры** если выполняются в Docker Desktop или Docker Engine (обычно локально),
* &#x20;[Развертывания](/ru/learn/orkestraciya/deployments.md) если выполняются на Edgegap (и в Edge Cloud, и в Private Fleet).

Контейнер нативно работает в Linux (или в Docker Desktop) и разделяет ядро хост-машины с другими контейнерами. Он выполняет отдельный процесс, занимая не больше памяти, чем любой другой исполняемый файл, что делает его легким.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-f150d345ddba740a7babd5338aca3f557cc1886c%2Fcontainer-architecture.png?alt=media" alt=""><figcaption></figcaption></figure>

## **Попробуйте**

Чтобы использовать Docker и локально собирать или запускать образы Docker, вам нужно установить Docker:

<details>

<summary><a href="https://www.docker.com/products/docker-desktop/">Установите Docker Desktop (или Docker CLI)</a></summary>

* [Установите Docker Desktop из официального источника](https://www.docker.com/products/docker-desktop/) (аккаунт не требуется).
* Перезагрузите компьютер после завершения установки.

</details>

После установки вы можете открыть предпочитаемый терминал и попробовать запустить тестовый образ.

```sh
docker run -d -p 80:80 --name speedtest edgegap/speedtest-edge
```

Это автоматически выполнит следующие шаги:

1. Скачать образ speedtest из репозитория Edgegap (только в первый раз).
2. Создать и запустить новый контейнер с использованием этого образа на вашей машине.
3. Назначить имя "speedtest" (используя `--name` параметр).
4. Открыть [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) чтобы подключить порт вашей машины `80`  к порту контейнера `80` , что позволит получить доступ к контейнеру с вашей машины.

✅ Откройте [http://localhost:80](http://localhost/) в предпочитаемом браузере, чтобы убедиться, что контейнер успешно запущен.

С запущенным контейнером мы можем выполнять базовые действия — перезапуск, остановку, мониторинг.&#x20;

Сначала посмотрим, что запущено на вашем движке Docker, используя предпочитаемый терминал.

```sh
docker ps
```

Это выведет информацию о запущенных контейнерах, например:

```
ИД КОНТЕЙНЕРА        ОБРАЗ                    КОМАНДА                  СОЗДАН             СТАТУС              ПОРТЫ                ИМЕНА
dbf4d3734111        edgegap/speedtest-edge   "docker-php-entrypoi…"   29 минут назад      Работает 29 минут    0.0.0.0:80->80/tcp   speedtest
```

У вас может быть запущено любое количество контейнеров.

Попробуем получить больше информации о вашем контейнере:

```sh
docker container inspect speedtest
```

Вы также можете подробнее изучить сеть, общую для вашей машины и контейнеров.

```sh
docker network ls
```

Это выведет информацию о сети, которой управляет движок Docker на вашей машине.

```
ИД СЕТИ          ИМЯ                 ДРАЙВЕР              ОБЛАСТЬ
67b24038b9ca        bridge              bridge              local
6f7fe43a489d        host                host                local
3d80cdb86a7e        none                null                local
```

Также можно подробнее изучить отдельные сети:

```sh
docker network inspect 67b24038b9ca
# где 678b24038b9ca — это ваша сеть, подключенная к вашему контейнеру
```

Когда закончите тестирование контейнера, обязательно остановите его, чтобы вернуть ресурсы (CPU и ОЗУ), которые контейнер использовал для работы:

```sh
docker container stop speedtest
```

## SSH-туннель

Чтобы глубоко разобраться с проблемами сервера, вы можете открыть SSH-службу в ваших образах и подключаться к контейнеру или развертыванию так же, как к любому удаленному хосту или виртуальной машине.

{% hint style="danger" %}
**Никогда не открывайте SSH-службу в production-развертываниях** — это серьезная проблема безопасности.
{% endhint %}

### Тестирование локально

Нам нужно будет внести некоторые изменения в ваш Dockerfile. Давайте установим службу OpenSSH, создадим пользователя с паролем и включим службу.

{% hint style="success" %}
**Порядок команд Dockerfile имеет значение!** [Docker кеширует слои, чтобы ускорить ваши сборки.](https://docs.docker.com/build/cache/) Держите некешируемые слои, такие как `RUN` и `COPY` в конце вашего Dockerfile (перед `CMD`).
{% endhint %}

Объедините эти команды Dockerfile в вашем Dockerfile:

{% tabs %}
{% tab title="Базовый образ Ubuntu" %}

```dockerfile
RUN apt-get update
RUN apt-get install openssh-server sudo -y

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000
RUN echo 'tester:$ecureP@ss' | chpasswd
# не забудьте изменить свой пароль ^

EXPOSE 22
```

{% endtab %}

{% tab title="Базовый образ Alpine" %}

```dockerfile
RUN apk --update add --no-cache openssh bash
RUN sed -i s/#PermitRootLogin.*/PermitRootLogin\ yes/ /etc/ssh/sshd_config

RUN echo "tester:$ecureP@ss" | chpasswd
# не забудьте изменить свой пароль ^

EXPOSE 22
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`EXPOSE` не публикует порты автоматически, это подсказка для движка Docker и разработчиков.
{% endhint %}

Нам также нужно будет запустить ssh-службу в контейнере:

{% tabs %}
{% tab title="Начиная с Dockerfile (плагин Unity)" %}
{% code title="Dockerfile" %}

```docker
CMD [ \
  "/bin/bash", "-c", \
  "env;service ssh start;/path/to/server-executable" \
]
# выводит переменные окружения, запускает SSH, затем запускает игровой сервер
```

{% endcode %}
{% endtab %}

{% tab title="Начиная с shell-скрипта .sh (Unreal)" %}
{% code title="StartServer.sh" %}

```sh
service ssh start
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Нельзя запустить SSH-службу с помощью `RUN` команды, поскольку она выполняется только во время сборки.
{% endhint %}

✅ Теперь `docker build`, и протестируйте `docker run`  локально, а затем проверьте с помощью `ssh localhost:22`.

{% hint style="danger" %}
:x: **НЕ - перезаписывайте существующие теги или используйте `последний` тег** - это приведёт к развёртыванию устаревшего кэша.\
:white\_check\_mark: **ДА - всегда увеличивайте тег версии** и разверните новую сборку.
{% endhint %}

{% hint style="success" %}
**Сначала устраняйте проблемы локально (и безопасно), не отправляя образ в реестр.**
{% endhint %}

### Развернуть в облаке

Если у вас не получилось с [#test-locally](#test-locally "mention"), вы можете протестировать в среде развертывания.

✅ [Войдите в свой реестр Docker](https://app.edgegap.com/registry-management/repositories/list) и  `docker push`  новый тег:

{% code title="" %}

```sh
username='robot$<REGISTRY_ORGANIZATION_ID>+client-push';
token='<REGISTRY_TOKEN>';

project='<REGISTRY_PROJECT>';
image='<MY_IMAGE_NAME>';
tag='<MY_TAG>';

echo "$token" | docker login registry.edgegap.com -u "$username" --password-stdin 2>&1;
docker push "${registry}/${project}/${image}:${tag}";
```

{% endcode %}

✅ [Создайте новую тестовую версию приложения для этого образа через панель управления.](https://app.edgegap.com/application-management/applications/list)

* Добавьте сопоставление порта для 22/TCP, чтобы повторить `-p` параметр из `docker run`.

✅ [Deploy](https://app.edgegap.com/deployment-management/deployments/create) и используйте URL или IP с внешним SSH-портом, назначенным `ssh`.

✅ После завершения тестирования остановите развертывание и удалите ваш тестовый образ.
