> 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/fr/docs/tools-and-integrations/docker.md).

# Docker et conteneurs

Pourquoi Edgegap exécute les serveurs de jeu dans des conteneurs, et comment configurer Docker avant de construire votre première image de serveur.

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

<figure><img src="https://3008966946-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 est une plateforme ouverte pour développer, expédier et exécuter des applications. Docker vous permet de séparer vos applications de votre infrastructure afin de livrer des logiciels rapidement.
{% endcolumn %}
{% endcolumns %}

## Pourquoi utiliser Docker ?

Travailler en équipe de développeurs signifie partager votre code. Quand les choses tournent mal, la dernière chose que vous voulez entendre est « ça marche sur ma machine ». Les serveurs de jeu doivent fonctionner de manière fiable sur n'importe quelle machine, car les serveurs d'un jeu à succès tourneront sur des milliers de machines serveur à travers le monde.

Pour aider à rendre votre serveur fiable, nous utilisons Docker - un logiciel de virtualisation garantissant que toutes les dépendances de votre code serveur jusqu'au niveau du système d'exploitation seront toujours exactement les mêmes, peu importe comment ou où le serveur est lancé.

{% hint style="info" %}
Nous recommandons de regarder ["Ne jamais installer localement" (vidéo)](https://www.youtube.com/watch?v=J0NuOlA2xDc\&ab_channel=Coderized). **Vous N'AVEZ PAS besoin d'utiliser Dockerhub avec Docker**.  Docker ≠ Dockerhub. Pensez à Docker comme à un moteur de programmation et à Dockerhub comme à son App Store.
{% endhint %}

## Conteneurs

Un **conteneur est une unité standard de logiciel qui regroupe du code** et toutes ses dépendances afin que l'application s'exécute rapidement et de manière fiable d'un environnement informatique à un autre. Les conteneurs isolent le logiciel de son environnement et garantissent qu'il fonctionne de manière uniforme malgré des différences, par exemple entre le développement et la préproduction.

\
Une fois que vous exécutez des images docker packagées, elles deviennent :

* **Conteneurs** si elles s'exécutent dans Docker Desktop ou Docker Engine (généralement en local),
* &#x20;[Déploiements](/fr/learn/orchestration/deployments.md) si elles s'exécutent sur Edgegap (à la fois Edge Cloud et Private Fleet).

Un conteneur s'exécute nativement sur Linux (ou dans Docker Desktop) et partage le noyau de la machine hôte avec d'autres conteneurs. Il exécute un processus distinct, ne consommant pas plus de mémoire qu'un autre exécutable, ce qui le rend léger.

<figure><img src="https://3008966946-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>

## **Essayez-le**

Pour utiliser Docker et construire ou exécuter des images docker localement, vous devrez installer Docker :

<details>

<summary><a href="https://www.docker.com/products/docker-desktop/">Installez Docker Desktop (ou Docker CLI)</a></summary>

* [Installez Docker Desktop à partir de la source officielle](https://www.docker.com/products/docker-desktop/) (aucun compte requis).
* Redémarrez votre ordinateur après avoir terminé l'installation.

</details>

Une fois installé, vous pouvez ouvrir le terminal de votre choix et essayer d'exécuter une image de test.

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

Cela exécutera automatiquement les étapes suivantes :

1. Télécharger l'image speedtest depuis le dépôt Edgegap (seulement la première fois).
2. Créer et démarrer un nouveau conteneur en utilisant cette image sur votre machine.
3. Attribuer le nom "speedtest" (en utilisant `--name` paramètre).
4. Exposer un [Applications et versions](/fr/learn/orchestration/application-and-versions.md#port-mapping) pour connecter le port de votre machine `80`  au port du conteneur `80` , ce qui permet d'accéder au conteneur depuis votre machine.

✅ Ouvrez [http://localhost:80](http://localhost/) dans votre navigateur préféré pour confirmer que le conteneur a démarré correctement.

Avec un conteneur en cours d'exécution, nous pouvons effectuer des interactions de base - redémarrer, arrêter, surveiller.&#x20;

Commençons par voir ce qui s'exécute sur votre moteur Docker à l'aide du terminal de votre choix.

```sh
docker ps
```

Cela affichera des informations sur les conteneurs en cours d'exécution, par exemple :

```
ID DU CONTENEUR        IMAGE                    COMMANDE                  CRÉÉ             ÉTAT                PORTS                NOMS
dbf4d3734111        edgegap/speedtest-edge   "docker-php-entrypoi…"   il y a 29 minutes      Actif depuis 29 minutes       0.0.0.0:80->80/tcp   speedtest
```

Vous pouvez avoir autant de conteneurs en cours d'exécution que vous voulez.

Essayons d'obtenir plus d'informations sur votre conteneur :

```sh
docker container inspect speedtest
```

Vous pouvez également inspecter le réseau partagé entre votre machine et les conteneurs.

```sh
docker network ls
```

Cela affichera des informations sur le réseau exécuté par le moteur Docker sur votre machine.

```
ID DU RÉSEAU          NOM                PILOTE              PORTÉE
67b24038b9ca        bridge              bridge              local
6f7fe43a489d        host                host              local
3d80cdb86a7e        none                null              local
```

Vous pouvez également inspecter de plus près des réseaux individuels :

```sh
docker network inspect 67b24038b9ca
# où 678b24038b9ca est votre réseau connecté à votre conteneur
```

Une fois que vous avez terminé de tester le conteneur, assurez-vous de l'arrêter afin de récupérer les ressources (CPU et RAM) que le conteneur utilisait pour fonctionner :

```sh
docker container stop speedtest
```

## Tunnel SSH

Pour résoudre en profondeur les problèmes de serveur, vous pouvez exposer le service SSH dans vos images et vous connecter au conteneur ou au déploiement de la même manière qu'à n'importe quel hôte distant ou à une VM.

{% hint style="danger" %}
**N'exposez jamais le service SSH dans les déploiements de production** - c'est un grave problème de sécurité.
{% endhint %}

### Tester localement

Nous devrons apporter quelques modifications à votre Dockerfile. Installons le service OpenSSH, créons un utilisateur avec un mot de passe et activons le service.

{% hint style="success" %}
**L'ordre des commandes du Dockerfile est important !** [Docker met en cache les couches pour accélérer vos builds.](https://docs.docker.com/build/cache/) Conservez les couches non mises en cache comme `RUN` et `COPY` à la fin de votre Dockerfile (avant `CMD`).
{% endhint %}

Fusionnez ces commandes Dockerfile dans votre Dockerfile :

{% tabs %}
{% tab title="Image de base 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
# n'oubliez pas de changer votre mot de passe ^

EXPOSE 22
```

{% endtab %}

{% tab title="Image de base 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
# n'oubliez pas de changer votre mot de passe ^

EXPOSE 22
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`EXPOSE` n'ouvre pas automatiquement les ports, c'est un indice pour le moteur Docker et les développeurs.
{% endhint %}

Nous devrons également démarrer le service ssh dans le conteneur :

{% tabs %}
{% tab title="En partant du Dockerfile (plugin Unity)" %}
{% code title="Dockerfile" %}

```docker
CMD [ \
  "/bin/bash", "-c", \
  "env;service ssh start;/path/to/server-executable" \
]
# affiche les variables d'environnement, démarre SSH, puis démarre le serveur de jeu
```

{% endcode %}
{% endtab %}

{% tab title="En partant d'un script shell .sh (Unreal)" %}
{% code title="StartServer.sh" %}

```sh
service ssh start
```

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

{% hint style="warning" %}
Vous ne pouvez pas démarrer le service SSH à l'aide d'une `RUN` commande, car elle n'est exécutée qu'au moment de la construction.
{% endhint %}

✅ Maintenant `docker build`, puis testez `docker run`  localement, puis testez avec `ssh localhost:22`.

{% hint style="danger" %}
:x: **NE PAS - écraser les balises existantes ou utiliser `latest` balise** - cela déploiera un cache obsolète.\
:white\_check\_mark: **FAITES - augmentez toujours votre balise de version** et déployez la nouvelle build.
{% endhint %}

{% hint style="success" %}
**Résolvez d'abord les problèmes localement (et en toute sécurité), sans envoyer l'image au registre.**
{% endhint %}

### Déployer dans le Cloud

Si vous n'avez pas réussi avec [#test-locally](#test-locally "mention"), vous pouvez tester dans un environnement de déploiement.

✅ [Connectez-vous à votre registre Docker](https://app.edgegap.com/registry-management/repositories/list) et  `docker push`  la nouvelle balise :

{% 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 %}

✅ [Créez une nouvelle version de l'application de test pour cette image via le tableau de bord.](https://app.edgegap.com/application-management/applications/list)

* Ajoutez un mappage de port pour 22/TCP afin de refléter l' `-p` option de `docker run`.

✅ [Déployer](https://app.edgegap.com/deployment-management/deployments/create) et utilisez l'URL ou l'adresse IP avec le port SSH externe attribué à `ssh`.

✅ Une fois que vous avez terminé les tests, arrêtez le déploiement et supprimez votre image de test.
