Введение
Несмотря на растущую популярность облачных сервисов, потребность в запуске собственных приложений всё ещё существует.
Используя noVNC и TigerVNC, вы можете запускать собственные приложения внутри контейнера Docker и получать к ним удалённый доступ с помощью веб-браузера. Кроме того, вы можете запускать своё приложение на сервере с большим количеством системных ресурсов, чем у вас может быть локально, что обеспечивает большую гибкость при запуске крупных приложений.
В этом руководстве вы создадите контейнер Mozilla Thunderbird, почтового клиента, с помощью Docker. Затем вы защитите его и обеспечите удалённый доступ с помощью веб-сервера Caddy.
Когда вы закончите, вы сможете получить доступ к Thunderbird с любого устройства, используя только веб-браузер. При желании вы также сможете получить локальный доступ к файлам с помощью WebDAV. У вас также будет полностью автономный образ Docker, который вы сможете запускать где угодно.
Предварительные условия
Прежде чем вы приступите к выполнению этого руководства, вам понадобится следующее:
- Один сервер Ubuntu 20.04 с оперативной памятью не менее 2 ГБ и дисковым пространством не менее 4 ГБ.
- Пользователь без права root с
sudo
привилегиями. - Docker настроен на вашем сервере. Вы можете следовать инструкциям по установке и использованию Docker в Ubuntu 20.04.
Создание supervisord
Конфигурация
Теперь, когда ваш сервер запущен и Docker установлен, вы готовы приступить к настройке контейнера вашего приложения. Поскольку ваш контейнер состоит из нескольких компонентов, вам нужно использовать менеджер процессов для их запуска и мониторинга. Здесь вы будете использовать supervisord
. supervisord
— это менеджер процессов, написанный на Python, который часто используется для управления сложными контейнерами.
Сначала создайте и введите каталог с именем thunderbird
для вашего контейнера:
mkdir ~/thunderbird
cd ~/thunderbird
Теперь создайте и откройте файл с именем supervisord.conf
используя nano
или предпочитаемый вами редактор:
nano ~/thunderbird/supervisord.conf
Теперь добавьте этот первый блок кода в supervisord.conf
, который определит глобальные параметры для supervisor:
~/thunderbird/supervisord.conf
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
В этом блоке вы настраиваете supervisord
сам. Вам нужно установить nodaemon
на true
, потому что он будет работать внутри контейнера Docker в качестве точки входа. Поэтому вы хотите, чтобы он оставался запущенным на переднем плане. Вы также устанавливаете pidfile
на путь, доступный пользователю без прав root (подробнее об этом позже), и logfile
на стандартный вывод, чтобы вы могли просматривать журналы.
Затем добавьте ещё один небольшой блок кода в supervisord.conf
. Этот блок запускает TigerVNC — комбинированный сервер VNC/X11:
~/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 — это протокол сервера отображения, который позволяет запускать приложения с графическим интерфейсом. Обратите внимание, что в будущем он будет заменён на Wayland, но удалённый доступ всё ещё находится в разработке.
Для этого контейнера вы используете TigerVNC и его встроенный сервер VNC. Это даёт ряд преимуществ по сравнению с использованием отдельного сервера X11 и VNC:
- Более быстрое время отклика, так как отрисовка графического интерфейса выполняется непосредственно на сервере VNC, а не в промежуточном фреймбуфере (памяти, в которой хранится содержимое экрана).
- Автоматическое изменение размера экрана, которое позволяет удалённому приложению автоматически изменять размер в соответствии с размерами клиента (в данном случае — окна вашего веб-браузера).
При желании вы можете изменить аргумент для опции -desktop
с Thunderbird
на что-то другое по вашему выбору. Сервер отобразит ваш выбор в качестве заголовка веб-страницы, используемой для доступа к вашему приложению.
Теперь давайте добавим третий блок кода в supervisord.conf
для запуска 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. Этот сервер выполняет две функции. Во-первых, он предоставляет простую страницу подключения, которая позволяет настраивать параметры подключения и задавать их по умолчанию. Во-вторых, он проксирует VNC через WebSocket, что позволяет получить к нему доступ через обычный веб-браузер.
Обычно изменение размера происходит на стороне клиента (т. е. масштабирование изображения), но вы используете опцию resize=remote
для того, чтобы в полной мере воспользоваться преимуществами удалённой настройки разрешения в TigerVNC. Это также обеспечивает меньшую задержку на более медленных устройствах, таких как бюджетные Chromebook:
Примечание: в этом руководстве используется easy-novnc
. При желании вы можете использовать websockify
и отдельный веб-сервер. Преимущество 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
В этом блоке вы настраиваете OpenBox, облегчённый оконный менеджер X11. Вы можете пропустить этот шаг, но без него у вас не будет строк заголовка и возможности изменять размер окон.
Наконец, давайте добавим последний блок в 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
на путь к исполняемому файлу вашего приложения. В противном случае вы готовы настроить главное меню вашего графического интерфейса.
Настройка меню 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
в элементе.
Создание файла 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/easy-novnc@v1.1.0 && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
На первом этапе вы создаёте easy-novnc
. Это делается на отдельном этапе для простоты и экономии места — вам не нужна вся цепочка инструментов Go в конечном образе. Обратите внимание на @v1.1.0
в команде сборки. Это гарантирует детерминированный результат, что важно, поскольку Docker кэширует результат каждого этапа. Если бы вы не указали явную версию, Docker ссылался бы на последнюю версию easy-novnc
на момент создания образа. Кроме того, вам нужно убедиться, что вы загружаете конкретную версию easy-novnc
, на случай, если в интерфейс командной строки будут внесены критические изменения.
Теперь давайте создадим второй этап, который станет финальным образом. Здесь вы будете использовать Debian 10 (buster) в качестве базового образа. Обратите внимание, что, поскольку он работает в контейнере, он будет работать независимо от дистрибутива, который вы используете на своём сервере.
Затем добавьте следующий блок в свой 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 в качестве базового образа, а затем устанавливаете минимальный набор программ, необходимых для запуска приложений с графическим интерфейсом в вашем контейнере. Обратите внимание, что вы запускаете apt-get update
как часть той же инструкции, чтобы избежать проблем с кэшированием в Docker. Чтобы сэкономить место, вы также удаляете списки пакетов, загруженные позже (сами кэшированные пакеты удаляются по умолчанию). Вы также создаёте /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, вам нужно будет использовать аргумент командной строки --no-sandbox
, поскольку он не поддерживается в Docker.
Далее давайте добавим инструкции по добавлению последних нескольких файлов в контейнер:
~/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
, менеджер запустит процессы, необходимые для работы вашего приложения. В этом случае вы используете CMD
вместо ENTRYPOINT
. В большинстве случаев это не имеет значения, но CMD
лучше подходит для этой цели по нескольким причинам. Во-первых, supervisord
не принимает никаких аргументов, которые были бы важны для нас, а если вы предоставляете аргументы контейнеру, они заменяют CMD
и добавляются к ENTRYPOINT
. Во-вторых, использование CMD
позволяет нам указать совершенно другую команду (которая будет выполняться /bin/sh -c
при передаче аргументов в контейнер), что упрощает отладку.
И наконец, перед запуском chown
вам нужно запустить supervisord
от имени пользователя root, чтобы предотвратить проблемы с правами доступа к диску с данными и позволить дочерним процессам открывать stdout
. Это также означает, что вам нужно использовать gosu
вместо инструкции USER
для переключения пользователя.
Вот как будет выглядеть ваш завершенный Dockerfile
проект:
~/thunderbird/Файл Dockerfile
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 --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
. Теперь мы готовы создать и запустить наш контейнер, а затем получить доступ к Thunderbird — приложению с графическим интерфейсом.
Создание и запуск контейнера
Следующий шаг — создать контейнер и настроить его запуск при старте системы. Вы также настроите том для сохранения данных приложения между перезапусками и обновлениями.
Сначала создайте свой контейнер. Убедитесь, что вы выполняете эти команды в каталоге ~/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
Обратите внимание, что при желании вы можете заменить thunderbird-app
после опции --name
на другое имя. Что бы вы ни выбрали, ваше приложение теперь запущено в контейнере. Теперь давайте воспользуемся веб-сервером Caddy, чтобы защитить его и подключиться к нему удалённо.
Настройка Caddy
На этом этапе вы настроите веб-сервер Caddy для обеспечения аутентификации и, при необходимости, удалённого доступа к файлам через WebDAV. Для простоты и чтобы можно было использовать его с существующим обратным прокси-сервером, вы запустите его в другом контейнере.
Создайте новый каталог, а затем переместитесь внутрь него:
mkdir ~/caddy
cd ~/caddy
Теперь создайте новый, Dockerfile
используя nano
или предпочитаемый вами редактор:
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 создаёт Caddy с включённым плагином WebDAV, а затем запускает его на порту 8080
с Caddyfile
по адресу /etc/Caddyfile
. Сохраните и закройте файл.
Далее вы настроите веб-сервер Caddy. Создайте файл с именем 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
прокси-сервер перенаправляет корневой каталог в thunderbird-app
контейнер, который вы создали на шаге 4 (Docker преобразует его в правильный IP-адрес). Он также будет обслуживать веб-браузер для просмотра файлов только для чтения на /files
и запускать сервер 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
Теперь мы готовы получить доступ к нашему приложению и протестировать его.
Тестирование и управление приложением
Давайте получим доступ к вашему приложению и убедимся, что оно работает.
Сначала откройте http://your_server_ip:8080
в веб-браузере, войдите в систему, используя выбранные ранее учётные данные, и нажмите «Подключиться».

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

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

Теперь откройте http://your_server_ip:8080/files/
в веб-браузере. Вы должны получить доступ к своим файлам.

При желании вы можете попробовать подключить http://your_server_ip:8080/webdav/
в клиенте WebDAV. Вы сможете напрямую получать доступ к своим файлам и изменять их. Если вы используете опцию «Подключить сетевой диск» в проводнике Windows, вам потребуется либо использовать обратный прокси-сервер для добавления HTTPS, либо установить HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel
на DWORD:2
.
В любом случае, ваше родное приложение с графическим интерфейсом теперь готово к удаленному использованию.
Заключение
Теперь вы успешно настроили контейнер Docker для Thunderbird, а затем с помощью Caddy настроили доступ к нему через веб-браузер. Если вам когда-нибудь понадобится обновить приложение, остановите контейнеры, запустите docker rm thunderbird-app thunderbird-web
, пересоберите образы, а затем повторно выполните docker run
команды из предыдущих шагов. Ваши данные будут сохранены, так как они хранятся в томе.
Если вы хотите узнать больше об основных командах Docker, вы можете прочитать это руководство или эту шпаргалку. Для долгосрочного использования вы также можете рассмотреть возможность включения HTTPS (для этого требуется домен) для дополнительной безопасности.
Кроме того, если вы развёртываете несколько приложений, вы можете использовать Docker Compose или Kubernetes вместо того, чтобы запускать каждый контейнер вручную. И помните, что это руководство может служить основой для запуска любого другого приложения Linux на вашем сервере, в том числе:
- Wine, уровень совместимости для запуска приложений Windows в Linux.
- GIMP, графический редактор с открытым исходным кодом.
- Cutter — платформа обратного инжиниринга с открытым исходным кодом.
Этот последний вариант демонстрирует большой потенциал контейнеризации и удалённого доступа к приложениям с графическим интерфейсом. С помощью такой настройки вы можете использовать сервер с гораздо большей вычислительной мощностью, чем у вас есть локально, для запуска ресурсоёмких инструментов, таких как Cutter.