L’auteur a choisi le Free and Open Source Fund pour recevoir un don dans le cadre du programme Write for Donations.
Même avec la popularité croissante des services en nuage, le besoin d’exécuter des applications natives existe toujours.
En utilisant noVNC et TigerVNC,vous pouvez exécuter des applications natives dans un conteneur Docker et y accéder à distance à l’aide d’un navigateur web. En outre, vous pouvez exécuter votre application sur un serveur disposant de plus de ressources système que celles dont vous disposez localement, ce qui peut offrir une plus grande flexibilité lors de l’exécution de grandes applications.
Dans ce tutoriel, vous allez conteneuriser Mozilla Thunderbird, un client de messagerie électronique, en utilisant Docker. Ensuite, vous le sécuriserez et lui donnerez un accès à distance en utilisant le serveur web de Caddy.
Lorsque vous aurez terminé, vous pourrez accéder à Thunderbird depuis n’importe quel appareil en utilisant simplement un navigateur web. En option, vous pourrez également accéder localement aux fichiers de ce site en utilisant WebDAV. Vous aurez également une image de Docker entièrement autonome que vous pourrez exécuter n’importe où.
Avant de commencer ce guide, vous aurez besoin de ce qui suit :
sudo
Maintenant que votre serveur fonctionne et que Docker est installé, vous êtes prêt à commencer à configurer le conteneur de votre application. Comme votre conteneur est constitué de plusieurs composants, vous devez utiliser un gestionnaire de processus pour les lancer et les surveiller. Ici, vous utiliserez supervisord
. supervisord
est un gestionnaire de processus écrit en Python qui est souvent utilisé pour orchestrer des conteneurs complexes.
Tout d’abord, créez et entrez un répertoire appelé thunderbird
pour votre conteneur :
- mkdir ~/thunderbird
- cd ~/thunderbird
Maintenant, créez et ouvrez un fichier appelé supervisord.conf
utilisant nano
ou votre éditeur préféré :
- nano ~/thunderbird/supervisord.conf
Ajoutez maintenant ce premier bloc de code dans supervisord.conf
, qui définira les options globales de supervisord :
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
Dans ce bloc, vous configurez supervisord
lui-même. Vous devez mettre nodaemon
à l'heure
parce qu’il sera placé à l’intérieur d’un conteneur Docker comme point d’entrée. Par conséquent, vous voulez qu’il reste au premier plan. Vous mettez également en place pidfile
vers un chemin accessible par un non-root user (nous y reviendrons plus tard), et logfile
vers stdout pour que vous puissiez voir les journaux.
Ensuite, ajoutez un autre petit bloc de code à supervisord.conf
. Ce bloc démarre TigerVNC, qui est un serveur combiné VNC/X11 :
...
[program:x11]
priority=0
command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
Dans ce bloc, vous configurez le serveur X11. X11 est un protocole de serveur d’affichage, qui permet aux applications graphiques de s’exécuter. Notez qu’à l’avenir il sera remplacé par Wayland, mais l’accès à distance est encore en développement.
Pour ce conteneur, vous utilisez TigerVNC et son serveur VNC intégré. Cela présente un certain nombre d’avantages par rapport à l’utilisation d’un serveur X11 et VNC séparé :
Si vous le souhaitez, vous pouvez changer l’argument pour l’option -desktop
de Thunderbird
à quelque chose d’autre de votre choix. Le serveur affichera votre choix comme titre de la page web utilisée pour accéder à votre demande.
Maintenant, ajoutons un troisième bloc de code à supervisord.conf
pour démarrer easy-novnc
:
...
[program:easy-novnc]
priority=0
command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
Dans ce bloc, vous mettez en place easy-novnc
un serveur autonome qui permet de faire le tour de noVNC. Ce serveur joue deux rôles. Tout d’abord, il fournit une page de connexion simple, qui vous permet de configurer des options pour la connexion et de définir des options par défaut. Deuxièmement, il utilise un proxy VNC sur WebSocket, qui permet d’y accéder au moyen d’un navigateur web ordinaire.
Habituellement, le redimensionnement se fait du côté client (c’est-à-dire la mise à l’échelle de l’image), mais vous utilisez l’option resize=remote
pour profiter pleinement des ajustements de la résolution à distance de TigerVNC. Cela permet également de réduire la latence sur les appareils plus lents, tels que les Chromebooks bas de gamme :
Note : Ce tutoriel utilise easy-novnc
. Si vous le souhaitez, vous pouvez utiliser websockify
et un serveur web séparé à la place. L’avantage d’easy-novnc
est que l’utilisation de la mémoire et le temps de démarrage sont nettement plus faibles et que c’est autonome. easy-novnc
fournit également une page de connexion plus propre que celle par défaut de noVNC et permet de définir des options par défaut qui sont utiles pour cette configuration (telles que resize=remote
).
Ajoutez maintenant le bloc suivant à votre configuration pour lancer OpenBox, le gestionnaire de fenêtres :
...
[program:openbox]
priority=1
command=/usr/bin/openbox
environment=DISPLAY=:0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
Dans ce bloc, vous mettez en place OpenBox, un gestionnaire léger de fenêtres X11. Vous pouvez sauter cette étape, mais sans elle, vous n’auriez pas de barres de titre ou ne pourriez pas redimensionner les fenêtres.
Enfin, ajoutons le dernier bloc à supervisord.conf
, qui lancera l’application principale :
...
[program:app]
priority=1
environment=DISPLAY=:0
command=/usr/bin/thunderbird
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
Dans ce dernier bloc, vous fixez la priority
à 1
pour s’assurer que Thunderbird se lance après TigerVNC, sinon il rencontrerait une condition de course et ne démarrerait pas au hasard. Nous avons également réglé autorestart=true
pour rouvrir automatiquement l’application si elle se ferme par erreur. La variable d’environnement DISPLAY
indique à l’application de s’afficher sur le serveur VNC que vous avez configuré précédemment.
Voici ce à quoi votre supervisord.conf
complété ressemblera :
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
[program:x11]
priority=0
command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:easy-novnc]
priority=0
command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:openbox]
priority=1
command=/usr/bin/openbox
environment=DISPLAY=:0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:app]
priority=1
environment=DISPLAY=:0
command=/usr/bin/thunderbird
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
Si vous voulez conteneuriser une autre demande, remplacez /usr/bin/thunderbird
avec le chemin d’accès à l’exécutable de votre application. Sinon, vous êtes maintenant prêt à configurer le menu principal de votre interface graphique.
Maintenant que votre gestionnaire de processus est configuré, mettons en place le menu de l’OpenBox. Ce menu nous permet de lancer des applications à l’intérieur du conteneur. Nous inclurons également un terminal et un moniteur de processus pour le débogage si nécessaire.
Dans le répertoire de votre candidature, utilisez nano
ou votre éditeur de texte préféré pour créer et ouvrir un nouveau fichier appelé menu.xml
:
- nano ~/thunderbird/menu.xml
Ajoutez maintenant le code suivant à menu.xml
:
<?xml version="1.0" encoding="utf-8"?>
<openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
<menu id="root-menu" label="Openbox 3">
<item label="Thunderbird">
<action name="Execute">
<execute>/usr/bin/thunderbird</execute>
</action>
</item>
<item label="Terminal">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator</execute>
</action>
</item>
<item label="Htop">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator -e htop</execute>
</action>
</item>
</menu>
</openbox_menu>
Ce fichier XML contient les éléments de menu qui apparaîtront lorsque vous ferez un clic droit sur le bureau. Chaque élément est constitué d’une étiquette et d’une action.
Si vous voulez conteneuriser une autre application, remplacez /usr/bin/thunderbird
par le chemin d’accès à l’exécutable de votre application et modifiez le label
de l’article.
Maintenant que l’OpenBox est configurée, vous allez créer le Dockerfile, qui relie tout.
Créez un Dockerfile dans le répertoire de votre conteneur :
- nano ~/thunderbird/Dockerfile
Pour commencer, ajoutons un peu de code pour élaborer easy-novnc
:
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/easy-novnc@v1.1.0 && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
Dans un premier temps, vous construisez easy-novnc
. Cela se fait dans une étape séparée pour des raisons de simplicité et de gain d’espace &mdash ; vous n’avez pas besoin de toute la chaîne d’outils Go dans votre image finale. Notez le @v1.1.0
dans la commande de construction. Cela garantit que le résultat est déterministe, ce qui est important car Docker met en cache le résultat de chaque étape. Si vous n’aviez pas spécifié de version explicite, Docker ferait référence à la dernière version d’easy-novnc
au moment où l’image a été construite pour la première fois. En outre, vous voulez vous assurer que vous téléchargez une version spécifique de easy-novnc
, au cas où des modifications de rupture seraient apportées à l’interface CLI.
Créons maintenant le deuxième niveau, qui deviendra l’image finale. Ici, vous utiliserez Debian 10 (buster) comme image de base. Notez que, comme il s’exécute dans un conteneur, il fonctionnera quelle que soit la distribution que vous utilisez sur votre serveur.
Ensuite, ajoutez le bloc suivant à votre Dockerfile
:
...
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \
rm -rf /var/lib/apt/lists && \
mkdir -p /usr/share/desktop-directories
Dans cette instruction, vous installez Debian 10 comme image de base, puis vous installez le strict minimum requis pour exécuter des applications graphiques dans votre conteneur. Notez que vous exécutez apt-get update
dans le cadre de la même instruction pour éviter les problèmes de mise en cache de Docker. Pour gagner de la place, vous supprimez également les listes de paquets téléchargées par la suite (les paquets mis en cache sont eux-mêmes supprimé par défaut). Vous créez également /usr/share/desktop-directories
car certaines applications dépendent du répertoire existant.
Ajoutons un autre petit bloc de code :
...
RUN apt-get update -y && \
apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \
rm -rf /var/lib/apt/lists
Dans cette instruction, vous installez des utilitaires et des paquets utiles à usage général. Les points suivants présentent un intérêt particulier xdg-utils
(qui fournit les commandes de base utilisées par les applications de bureau sous Linux) et ca-certificates
(qui installe les certificats racine pour nous permettre d’accéder aux sites HTTPS).
Maintenant, nous pouvons ajouter les instructions pour la demande principale :
...
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists
Comme auparavant, nous installons ici l’application. Si vous conteneurisez une autre application, vous pouvez remplacer ces commandes par celles nécessaires à l’installation de votre app spécifique. Certaines applications nécessiteront un peu plus de travail pour fonctionner dans Docker. Par exemple, si vous installez une application qui utilise Chrome, Chromium, ou QtWebEngine, vous devrez utiliser l’argument de la ligne de commande --no-sandbox
parce qu’il ne sera pas soutenu au sein de Docker.
Ensuite, commençons à ajouter les instructions pour ajouter les derniers fichiers dans le conteneur :
...
COPY /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080
Ici, vous ajoutez à l’image les fichiers de configuration que vous avez créés précédemment et vous copiez le binaire easy-novnc
de la première étape.
Le bloc de code suivant crée le répertoire de données et ajoute un utilisateur dédié à votre application. Ceci est important car certaines applications refusent de s’exécuter en tant que root. Il est également bon de ne pas exécuter les applications en tant que root, même dans un conteneur.
...
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
Pour assurer la cohérence des UID/GID
pour les fichiers, vous fixez explicitement les deux à 1000
. Vous montez également un volume sur le répertoire de données pour vous assurer qu’il persiste entre les redémarrages.
Enfin, ajoutons les instructions pour tout lancer :
...
CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
En réglant la commande par défaut sur supervisord
, le gestionnaire lancera les processus nécessaires à l’exécution de votre demande. Dans ce cas, vous utilisez CMD
plutôt qu’ENTRYPOINT
. Dans la plupart des cas, cela ne ferait pas de différence, mais l’utilisation de CMD
est mieux adapté à cette fin pour quelques raisons. Premièrement, supervisord
ne prend pas d’arguments qui seraient pertinents pour nous, et si vous fournissez des arguments au conteneur, ils remplacent CMD
et sont annexés à ENTRYPOINT
. Deuxièmement, l’utilisation de CMD
nous permet de fournir une commande entièrement différente (qui sera exécutée par /bin/sh -c
) lors du passage des arguments au conteneur, ce qui rend le débogage plus facile.
Et enfin, vous devez exécuterchown
comme root avant de démarrer supervisord
pour éviter les problèmes d’autorisation sur le volume de données et pour permettre aux processus enfant d’ouvrir stdout
. Cela signifie également que vous devez utiliser gosu
au lieu de l’instruction USER
pour changer d’utilisateur.
Voici ce à quoi votre Dockerfile
complété ressemblera :
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/easy-novnc@v1.1.0 && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \
rm -rf /var/lib/apt/lists && \
mkdir -p /usr/share/desktop-directories
RUN apt-get update -y && \
apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && \
rm -rf /var/lib/apt/lists
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists
COPY /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
Sauvegardez et fermez votre Dockerfile
. Nous sommes maintenant prêts à construire et à faire fonctionner notre conteneur, puis à accéder à Thunderbird &mdash, une application GUI.
L’étape suivante consiste à construire votre conteneur et à le mettre en marche au démarrage. Vous mettrez également en place un volume pour préserver les données de l’application entre les redémarrages et les mises à jour.
Construisez d’abord votre conteneur. Veillez à exécuter ces commandes dans le répertoire ~/thunderbird
:
- docker build -t thunderbird .
Créez maintenant un nouveau réseau qui sera partagé entre les conteneurs de l’application :
- docker network create thunderbird-net
Créez ensuite un volume pour stocker les données de l’application :
- docker volume create thunderbird-data
Enfin, lancez-le et réglez-le pour qu’il redémarre automatiquement :
- docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird
Notez que si vous le souhaitez, vous pouvez remplacer le thunderbird-app
après l’option --name
avec un nom différent. Quel que soit votre choix, votre demande est maintenant conteneurisée et en cours d’exécution. Utilisons maintenant le serveur web Caddy pour le sécuriser et nous y connecter à distance.
Au cours de cette étape, vous configurerez le serveur web Caddy pour fournir une authentification et, éventuellement, un accès à distance aux fichiers via WebDAV. Par souci de simplicité, et pour vous permettre de l’utiliser avec votre proxy inverse existant, vous le ferez fonctionner dans un autre conteneur.
Créez un nouveau répertoire et déplacez-vous à l’intérieur de celui-ci :
- mkdir ~/caddy
- cd ~/caddy
Créez maintenant un nouveau Dockerfile
en utilisant nano
ou votre éditeur préféré :
- nano ~/caddy/Dockerfile
Ajoutez ensuite les directives suivantes :
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo 'module caddy' > go.mod && \
echo 'require github.com/caddyserver/caddy/v2 v2.0.0' >> go.mod && \
echo 'require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3' >> go.mod
RUN echo 'package main' > caddy.go && \
echo 'import caddycmd "github.com/caddyserver/caddy/v2/cmd"' >> caddy.go && \
echo 'import _ "github.com/caddyserver/caddy/v2/modules/standard"' >> caddy.go && \
echo 'import _ "github.com/mholt/caddy-webdav"' >> caddy.go && \
echo 'func main() { caddycmd.Main() }' >> caddy.go
RUN go build -o /bin/caddy .
FROM debian:buster
RUN apt-get update -y && \
apt-get install -y --no-install-recommends gosu && \
rm -rf /var/lib/apt/lists
COPY /bin/caddy /usr/local/bin/
COPY Caddyfile /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
WORKDIR /data
CMD ["sh", "-c", "chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapter caddyfile -config /etc/Caddyfile"]
Ce Dockerfile construit Caddy avec le plugin WebDAV activé, puis le lance sur le port 8080
avec le Caddyfile
à /etc/Caddyfile
. Enregistrez et fermez le fichier.
Ensuite, vous allez configurer le serveur web de Caddy. Créer un fichier nommé Caddyfile
dans le répertoire que vous venez de créer :
- nano ~/caddy/Caddyfile
Ajoutez maintenant le bloc de code suivant à votre Caddyfile
:
{
order webdav last
}
:8080 {
log
root * /data
reverse_proxy thunderbird-app:8080
handle /files/* {
uri strip_prefix /files
file_server browse
}
redir /files /files/
handle /webdav/* {
uri strip_prefix /webdav
webdav
}
redir /webdav /webdav/
basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}
Ce Caddyfile
est un proxy du répertoire root vers le conteneur thunderbird-app
que vous avez créé à l’étape 4 (le Docker le résout dans l’IP correcte). Il servira également de navigateur de fichiers en lecture seule sur /files
et fera fonctionner un serveur WebDAV sur /webdav
que vous pourrez monter localement pour accéder à vos fichiers. Le nom d’utilisateur et le mot de passe sont lus à partir des variables d’environnement APP_USERNAME
et APP_PASSWORD_HASH
.
Maintenant, construisez le conteneur :
- docker build -t thunderbird-caddy .
Caddy v.2 vous demande de hacher le mot de passe que vous souhaitez. Exécutez la commande suivante et n’oubliez pas de remplacer mypass
avec un mot de passe fort de votre choix :
- docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'
Cette commande produira une chaîne de caractères. Copiez ceci dans votre presse-papiers en préparation de l’exécution de la prochaine commande.
Vous êtes maintenant prêt à faire fonctionner le conteneur. Veillez à remplacer myuser
par le nom d’utilisateur de votre choix, et remplacez <^>mypass-hash<^>
par la sortie de la commande que vous avez exécutée à l’étape précédente. Vous pouvez également changer le port (8080
ici) pour accéder à votre serveur sur un port différent :
- docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-web --env=APP_USERNAME="myuser" --env=APP_PASSWORD_HASH="mypass-hash" --publish=8080:8080 thunderbird-caddy
Nous sommes maintenant prêts à accéder et à tester notre application.
Accédez à votre application et assurez-vous qu’elle fonctionne.
ouvrez d’abordhttp://votre_serveur_ip:8080
dans un navigateur web, connectez-vous avec les identifiants que vous avez choisis auparavant, et cliquez sur Connect.
Vous devriez maintenant être en mesure d’interagir avec l’application, et celle-ci devrait automatiquement se redimensionner pour s’adapter à la fenêtre de votre navigateur.
Si vous faites un clic droit sur le bureau noir, vous devriez voir un menu qui vous permet d’accéder à un terminal. Si vous cliquez sur le milieu, vous devriez voir une liste de fenêtres.
Ouvrez maintenant http://votre_serveur_ip:8080/files/
dans un navigateur web. Vous devriez pouvoir accéder à vos dossiers.
En option, vous pouvez essayer de monter http://votre_serveur_ip:8080/webdav/ dans un client WebDAV
. Vous devriez pouvoir accéder et modifier vos fichiers directement. Si vous utilisez l’option de carte lecteur réseau dans l’explorateur Windows, vous devrez soit utiliser un proxy inverse pour ajouter le HTTPS, soit définir HKLM\SYSTEM\CurrentControlSet\Services\ClientWeb\Parameters\BasicAuthLevel
à DWORD:2
.
Dans les deux cas, votre application GUI native est maintenant prête à être utilisée à distance.
Vous avez maintenant configuré avec succès un conteneur Docker pour Thunderbird et ensuite, à l’aide de Caddy, vous avez configuré l’accès à ce conteneur via un navigateur web. Si jamais vous devez mettre à jour votre application, arrêtez les conteneurs, exécutez docker rm thunderbird-app thunderbird-web
, reconstruisez les images, puis relancez les commandes d’exécution du docker
à partir des étapes précédentes ci-dessus. Vos données seront toujours préservées puisqu’elles sont stockées dans un volume.
Si vous voulez en savoir plus sur les commandes de base du Docker, vous pouvez lire ce tutoriel ou cette fiche d’aide. Pour une utilisation à plus long terme, vous pouvez également envisager d’activer le HTTPS (qui nécessite un domaine) pour une sécurité supplémentaire.
En outre, si vous déployez plusieurs applications, vous pouvez utiliser Docker Compose ou Kubernetes au lieu de démarrer chaque conteneur manuellement. Et n’oubliez pas que ce tutoriel peut servir de base pour exécuter toute autre application Linux sur votre serveur, y compris :
Cette dernière option démontre le grand potentiel de la conteneurisation et de l’accès à distance aux applications GUI. Grâce à cette configuration, vous pouvez désormais utiliser un serveur doté d’une puissance de calcul considérablement plus importante que celle dont vous disposez localement pour faire fonctionner des outils gourmands en ressources comme Cutter.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!