Debian10でDockerとCaddyを使用してGUIアプリケーションにリモートアクセスする方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
クラウドサービスの人気が高まっているにもかかわらず、ネイティブアプリケーションを実行する必要性は依然として存在します。
noVNCおよびTigerVNCを使用すると、 Docker コンテナー内でネイティブアプリケーションを実行し、Webブラウザーを使用してそれらにリモートでアクセスできます。 さらに、ローカルで利用できるよりも多くのシステムリソースを備えたサーバーでアプリケーションを実行できるため、大規模なアプリケーションを実行する際の柔軟性が向上します。
このチュートリアルでは、Dockerを使用して、メールクライアントである MozillaThunderbirdをコンテナ化します。 その後、セキュリティで保護し、 CaddyWebサーバーを使用してリモートアクセスを提供します。
終了すると、Webブラウザだけを使用して任意のデバイスからThunderbirdにアクセスできるようになります。 オプションで、WebDAVを使用してローカルからファイルにアクセスすることもできます。 また、どこでも実行できる完全に自己完結型のDockerイメージがあります。
前提条件
このガイドを開始する前に、次のものが必要です。
- 少なくとも2GBのRAMと4GBのディスクスペースを備えた1台のDebian10サーバー。
sudo権限を持つroot以外のユーザー。- サーバーにDockerがセットアップされました。 Debian10にDockerをインストールして使用する方法に従うことができます。
ステップ1—supervisord構成を作成する
サーバーが実行され、Dockerがインストールされたので、アプリケーションのコンテナーの構成を開始する準備が整いました。 コンテナは複数のコンポーネントで構成されているため、プロセスマネージャを使用してそれらを起動および監視する必要があります。 ここでは、supervisordを使用します。 supervisordは、Pythonで記述されたプロセスマネージャーであり、複雑なコンテナーを調整するためによく使用されます。
まず、コンテナ用にthunderbirdというディレクトリを作成して入力します。
mkdir ~/thunderbird cd ~/thunderbird
次に、nanoまたはお好みのエディターを使用して、supervisord.confというファイルを作成して開きます。
nano ~/thunderbird/supervisord.conf
次に、この最初のコードブロックをsupervisord.confに追加します。これにより、supervisordのグローバルオプションが定義されます。
〜/ thunderbird / supervisord.conf
[supervisord] nodaemon=true pidfile=/tmp/supervisord.pid logfile=/dev/fd/1 logfile_maxbytes=0
このブロックでは、supervisord自体を構成しています。 nodaemonをtrueに設定する必要があります。これは、Dockerコンテナー内でエントリポイントとして実行されるためです。 したがって、フォアグラウンドで実行し続ける必要があります。 また、pidfileをroot以外のユーザーがアクセスできるパスに設定し(これについては後で詳しく説明します)、logfileをstdoutに設定して、ログを表示できるようにします。
次に、supervisord.confに別の小さなコードブロックを追加します。 このブロックは、VNC/X11サーバーを組み合わせたTigerVNCを起動します。
〜/ thunderbird / supervisord.conf
... [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
このブロックでは、X11サーバーをセットアップしています。 X11 は、GUIアプリケーションの実行を可能にするディスプレイサーバープロトコルです。 将来的にはWaylandに置き換えられますが、リモートアクセスはまだ開発中であることに注意してください。
このコンテナには、TigerVNCとその組み込みVNCサーバーを使用しています。 これには、個別のX11サーバーとVNCサーバーを使用するよりも多くの利点があります。
- GUI描画は、中間フレームバッファ(画面のコンテンツを格納するメモリ)に対して行われるのではなく、VNCサーバーに対して直接行われるため、応答時間が短縮されます。
- 画面の自動サイズ変更。これにより、リモートアプリケーションは、クライアント(この場合はWebブラウザーウィンドウ)に合わせて自動的にサイズ変更できます。
必要に応じて、-desktopオプションの引数をThunderbirdから任意の引数に変更できます。 サーバーは、アプリケーションへのアクセスに使用されるWebページのタイトルとして選択内容を表示します。
次に、supervisord.confに3番目のコードブロックを追加して、easy-novncを開始します。
〜/ thunderbird / supervisord.conf
... [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
このブロックでは、 easy-novnc をセットアップします。これは、noVNCのラッパーを提供するスタンドアロンサーバーです。 このサーバーは2つの役割を果たします。 まず、接続のオプションを構成したり、デフォルトのオプションを設定したりできる簡単な接続ページを提供します。 次に、 WebSocket を介してVNCをプロキシします。これにより、通常のWebブラウザーからアクセスできるようになります。
通常、サイズ変更はクライアント側で行われます(つまり 画像スケーリング)、ただし、resize=remoteオプションを使用して、TigerVNCのリモート解像度調整を最大限に活用しています。 これにより、ローエンドのChromebookなどの低速デバイスでのレイテンシも低くなります。
注:このチュートリアルではeasy-novncを使用します。 必要に応じて、代わりにwebsockifyと別のWebサーバーを使用できます。 easy-novncの利点は、メモリ使用量と起動時間が大幅に短縮され、自己完結型であるということです。 easy-novncは、デフォルトのnoVNCページよりもクリーンな接続ページを提供し、このセットアップに役立つデフォルトオプション(resize=remoteなど)を設定できます。
次に、次のブロックを構成に追加して、ウィンドウマネージャーであるOpenBoxを起動します。
〜/ thunderbird / supervisord.conf
... [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
このブロックでは、軽量のX11ウィンドウマネージャーであるOpenBoxをセットアップしています。 この手順をスキップすることもできますが、この手順がないと、タイトルバーがないか、ウィンドウのサイズを変更できません。
最後に、最後のブロックをsupervisord.confに追加して、メインアプリケーションを起動します。
〜/ thunderbird / supervisord.conf
... [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
この最後のブロックでは、priorityを1に設定して、Thunderbirdが TigerVNCの後にを起動するようにします。そうしないと、競合状態が発生し、ランダムに起動できなくなります。 また、autorestart=trueを設定して、誤って閉じた場合にアプリケーションを自動的に再度開きます。 DISPLAY環境変数は、前にセットアップしたVNCサーバーに表示するようにアプリケーションに指示します。
完成したsupervisord.confは次のようになります。
〜/ thunderbird / supervisord.conf
[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
別のアプリケーションをコンテナ化する場合は、/usr/bin/thunderbirdをアプリケーションの実行可能ファイルへのパスに置き換えます。 それ以外の場合は、GUIのメインメニューを構成する準備ができています。
ステップ2—OpenBoxメニューの設定
プロセスマネージャが設定されたので、OpenBoxメニューを設定しましょう。 このメニューを使用すると、コンテナ内でアプリケーションを起動できます。 必要に応じて、デバッグ用の端末とプロセスモニターも含まれます。
アプリケーションのディレクトリ内で、nanoまたはお気に入りのテキストエディタを使用して、menu.xmlという名前の新しいファイルを作成して開きます。
nano ~/thunderbird/menu.xml
次に、次のコードをmenu.xmlに追加します。
〜/ thunderbird / 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>
このXMLファイルには、デスクトップを右クリックしたときに表示されるメニュー項目が含まれています。 各アイテムは、ラベルとアクションで構成されています。
別のアプリケーションをコンテナ化する場合は、/usr/bin/thunderbirdをアプリケーションの実行可能ファイルへのパスに置き換え、アイテムのlabelを変更します。
ステップ3—Dockerfileを作成する
OpenBoxが構成されたので、すべてを結び付けるDockerfileを作成します。
コンテナのディレクトリにDockerfileを作成します。
nano ~/thunderbird/Dockerfile
まず、easy-novncをビルドするためのコードを追加しましょう。
〜/ thunderbird / Dockerfile
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/[email protected] && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
最初の段階では、easy-novncを構築しています。 これは、単純化とスペースの節約のために別の段階で行われます。最終的な画像にGoツールチェーン全体を含める必要はありません。 ビルドコマンドの@v1.1.0に注意してください。 これにより、結果が決定論的であることが保証されます。これは、Dockerが各ステップの結果をキャッシュするため重要です。 明示的なバージョンを指定しなかった場合、Dockerはイメージが最初にビルドされたときのeasy-novncの最新バージョンを参照します。 さらに、CLIインターフェイスに重大な変更が加えられた場合に備えて、特定のバージョンのeasy-novncをダウンロードする必要があります。
次に、最終的なイメージになる2番目のステージを作成しましょう。 ここでは、ベースイメージとしてDebian 10(バスター)を使用します。 これはコンテナで実行されているため、サーバーで実行しているディストリビューションに関係なく機能することに注意してください。
次に、Dockerfileに次のブロックを追加します。
〜/ thunderbird / 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
この手順では、Debian 10をベースイメージとしてインストールしてから、コンテナでGUIアプリケーションを実行するために最低限必要なものをインストールします。 Dockerからのキャッシュの問題を防ぐために、同じ命令の一部としてapt-get updateを実行することに注意してください。 スペースを節約するために、後でダウンロードしたパッケージリストも削除します(キャッシュされたパッケージ自体はデフォルトで削除されます)。 一部のアプリケーションは既存のディレクトリに依存しているため、/usr/share/desktop-directoriesも作成しています。
別の小さなコードブロックを追加しましょう:
〜/ thunderbird / Dockerfile
...
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
この手順では、いくつかの便利な汎用ユーティリティとパッケージをインストールします。 ここで特に興味深いのは、xdg-utils(Linux上のデスクトップアプリケーションで使用される基本コマンドを提供する)とca-certificates(HTTPSサイトにアクセスできるようにするルート証明書をインストールする)です。
これで、メインアプリケーションの手順を追加できます。
〜/ thunderbird / Dockerfile
...
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists
以前と同様に、ここではアプリケーションをインストールしています。 別のアプリケーションをコンテナ化する場合は、これらのコマンドを特定のアプリのインストールに必要なコマンドに置き換えることができます。 一部のアプリケーションは、Docker内で実行するためにもう少し作業が必要になります。 たとえば、Chrome、Chromium、またはQtWebEngineを使用するアプリをインストールする場合、Docker内ではサポートされないため、コマンドライン引数--no-sandboxを使用する必要があります。
次に、最後のいくつかのファイルをコンテナに追加するための手順の追加を開始しましょう。
〜/ thunderbird / Dockerfile
... COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/ COPY menu.xml /etc/xdg/openbox/ COPY supervisord.conf /etc/ EXPOSE 8080
ここでは、前に作成した構成ファイルをイメージに追加し、最初のステージからeasy-novncバイナリをコピーしています。
この次のコードブロックは、データディレクトリを作成し、アプリの専用ユーザーを追加します。 一部のアプリケーションはrootとしての実行を拒否するため、これは重要です。 コンテナ内であっても、rootとしてアプリケーションを実行しないこともお勧めします。
〜/ thunderbird / Dockerfile
...
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
ファイルの一貫したUID/GIDを確保するには、両方を1000に明示的に設定します。 また、データディレクトリにボリュームをマウントして、再起動してもボリュームが持続するようにします。
最後に、すべてを起動するための手順を追加しましょう。
〜/ thunderbird / Dockerfile
... CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
デフォルトのコマンドをsupervisordに設定すると、マネージャーはアプリケーションの実行に必要なプロセスを起動します。 この場合、ENTRYPOINTではなくCMDを使用しています。 ほとんどの場合、違いはありませんが、いくつかの理由から、CMDを使用する方がこの目的に適しています。 まず、supervisordは、私たちに関連する引数を取りません。コンテナーに引数を指定すると、CMDが置き換えられ、ENTRYPOINTに追加されます。 次に、CMDを使用すると、コンテナーに引数を渡すときにまったく異なるコマンド(/bin/sh -cによって実行される)を提供できるため、デバッグが容易になります。
最後に、supervisordを開始する前に、rootとしてchownを実行して、データボリュームでのアクセス許可の問題を防ぎ、子プロセスがstdoutを開くことができるようにする必要があります。 これは、ユーザーを切り替えるためにUSER命令の代わりにgosuを使用する必要があることも意味します。
完成したDockerfileは次のようになります。
〜/ thunderbird / Dockerfile
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/[email protected] && \
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 --from=easy-novnc-build /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"]
Dockerfileを保存して閉じます。 これで、コンテナをビルドして実行し、GUIアプリケーションであるThunderbirdにアクセスする準備が整いました。
ステップ4—コンテナの構築と実行
次のステップは、コンテナをビルドし、起動時に実行するように設定することです。 また、再起動と更新の間でアプリケーションデータを保持するボリュームを設定します。
まず、コンテナを作成します。 必ず~/thunderbirdディレクトリで次のコマンドを実行してください。
docker build -t thunderbird .
次に、アプリのコンテナ間で共有される新しいネットワークを作成します。
docker network create thunderbird-net
次に、アプリケーションデータを保存するボリュームを作成します。
docker volume create thunderbird-data
最後に、それを実行し、自動的に再起動するように設定します。
docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird
必要に応じて、--nameオプションの後のthunderbird-appを別の名前に置き換えることができます。 選択したものが何であれ、アプリケーションはコンテナ化されて実行されます。 それでは、Caddy Webサーバーを使用してサーバーを保護し、リモートで接続してみましょう。
ステップ5—キャディを設定する
このステップでは、認証と、オプションでWebDAVを介したリモートファイルアクセスを提供するようにCaddyWebサーバーを設定します。 簡単にするため、また既存のリバースプロキシで使用できるようにするために、別のコンテナで実行します。
新しいディレクトリを作成し、その中に移動します。
mkdir ~/caddy cd ~/caddy
次に、nanoまたはお好みのエディターを使用して、新しいDockerfileを作成します。
nano ~/caddy/Dockerfile
次に、次のディレクティブを追加します。
〜/ caddy / Dockerfile
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo 'module caddy' > go.mod && \
echo 'require github.com/caddyserver/caddy/v2 v2.1.1' >> 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 --from=caddy-build /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"]
このDockerfileは、WebDAVプラグインを有効にしてCaddyをビルドし、ポート8080でCaddyfileを/etc/Caddyfileで起動します。 ファイルを保存して閉じます。
次に、CaddyWebサーバーを構成します。 作成したディレクトリにCaddyfileという名前のファイルを作成します。
nano ~/caddy/Caddyfile
次に、次のコードブロックをCaddyfileに追加します。
〜/ caddy / Caddyfile
{
order webdav last
}
:8080 {
log
root * /data
reverse_proxy thunderbird-app:8080
handle_path /files/* {
file_server browse
}
redir /files /files/
handle /webdav/* {
webdav {
prefix /webdav
}
}
redir /webdav /webdav/
basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}
このCaddyfileは、ルートディレクトリを手順4で作成したthunderbird-appコンテナにプロキシします(Dockerはそれを正しいIPに解決します)。 また、/filesで読み取り専用のWebベースのファイルブラウザを提供し、/webdavでWebDAVサーバーを実行して、ファイルにアクセスするためにローカルにマウントできます。 ユーザー名とパスワードは、環境変数APP_USERNAMEおよびAPP_PASSWORD_HASHから読み取られます。
次に、コンテナを作成します。
docker build -t thunderbird-caddy .
Caddy v2では、希望するパスワードをハッシュする必要があります。 次のコマンドを実行し、mypassを選択した強力なパスワードに置き換えることを忘れないでください。
docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'
このコマンドは、文字列を出力します。 次のコマンドを実行する準備として、これをクリップボードにコピーします。
これで、コンテナを実行する準備が整いました。 必ずmyuserを選択したユーザー名に置き換え、mypass-hashを前の手順で実行したコマンドの出力に置き換えてください。 ポート(ここでは8080)を変更して、別のポートでサーバーにアクセスすることもできます。
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
これで、アプリケーションにアクセスしてテストする準備が整いました。
ステップ6—アプリケーションのテストと管理
アプリケーションにアクセスして、機能していることを確認しましょう。
まず、Webブラウザでhttp://your_server_ip:8080を開き、先ほど選択したクレデンシャルでログインし、接続をクリックします。
これで、アプリケーションを操作できるようになり、ブラウザウィンドウに合わせて自動的にサイズが変更されます。
黒いデスクトップを右クリックすると、端末にアクセスできるメニューが表示されます。 中クリックすると、ウィンドウのリストが表示されます。
次に、Webブラウザでhttp://your_server_ip:8080/files/を開きます。 ファイルにアクセスできるはずです。
オプションで、WebDAVクライアントにhttp://your_server_ip:8080/webdav/をマウントしてみることができます。 ファイルに直接アクセスして変更できるはずです。 Windowsエクスプローラーでマップネットワークドライブオプションを使用する場合は、リバースプロキシを使用してHTTPSを追加するか、HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevelをDWORD:2に設定する必要があります。
いずれの場合も、ネイティブGUIアプリケーションをリモートで使用できるようになります。
結論
これで、Thunderbird用のDockerコンテナーが正常にセットアップされ、Caddyを使用して、Webブラウザーを介したコンテナーへのアクセスが構成されました。 アプリをアップグレードする必要がある場合は、コンテナーを停止し、docker rm thunderbird-app thunderbird-webを実行し、イメージを再構築してから、上記の前の手順のdocker runコマンドを再実行します。 データはボリュームに保存されるため、引き続き保持されます。
基本的なDockerコマンドについて詳しく知りたい場合は、このチュートリアルまたはこのチートシートをお読みください。 長期間使用する場合は、セキュリティを強化するためにHTTPS(これにはドメインが必要です)を有効にすることも検討してください。
さらに、複数のアプリケーションをデプロイする場合は、各コンテナーを手動で起動する代わりに、DockerComposeまたはKubernetesを使用することをお勧めします。 また、このチュートリアルは、サーバー上で次のような他のLinuxアプリケーションを実行するためのベースとして機能することを忘れないでください。
- Wine 、LinuxでWindowsアプリケーションを実行するための互換性レイヤー。
- GIMP 、オープンソースの画像エディタ。
- Cutter 、オープンソースのリバースエンジニアリングプラットフォーム。
この最後のオプションは、GUIアプリケーションをコンテナ化してリモートアクセスする大きな可能性を示しています。 この設定により、Cutterのようなリソースを大量に消費するツールを実行するために、ローカルで使用するよりもかなり多くの計算能力を備えたサーバーを使用できるようになります。