Создание Docker-контейнеров в CapRover не ограничивается каким-то одним конкретным методом. Самым предпочтительным из них по праву считается набор готовых шаблонов веб-приложений для установки в один клик. Но что если нужного приложения нет в списке? На выручку приходит так называемый пустой контейнер CapRover.
Как им пользоваться? Давайте узнаем.
Что будем устанавливать?
В нашем примере мы будем использовать GUI для Wireguard. В случае ручной установки через Docker CLI, наша команда выглядела бы следующим образом:
docker run -d \
--name=vpn \
-e SESSION_SECRET=8top7Fgkb1V3n \
-e WGUI_USERNAME=table8567 \
-e WGUI_PASSWORD=YhF58j8dv3M29J \
-v ~/.db:/app/db \
-v /etc/wireguard:/etc/wireguard \
--cap-add NET_ADMIN \
ngoduykhanh/wireguard-ui:latest
Где:
- –name – имя контейнера;
- -e – все переменные окружения, которые мы хотим указать для нашего контейнера, вроде логина и пароля администратора, информация о базе данных и пр.;
- -v – это постоянное хранилище данных;
- –cap-add – дополнительная опция (о которой поговорим в конце).
В этой пошаговой инструкции мы перенесём данные из CLI команды в GUI-интерфейс CapRover. При необходимости вы всегда можете возвращаться сюда, чтобы понять, откуда берутся те или иные данные.
Установка на примере wireguard-ui
- Создание Docker-контейнеров в CapRover практически всегда начинается с заготовки – так называемого пустого контейнера. Даём ему имя, например
vpn
, и отмечаем галочкой вариантPersistent data
.

- Заходим в созданный контейнер и переходим во вкладку
App Configs
. В первую очередь нас интересует разделEnvironmental Variables
. Нажимаем на кнопкуAdd Key/Value Pair
и вносим ранее установленные-e
переменные в следующем формате:

- Раздел
Port Mapping
нужен нам в том случае, если внутри приложения есть процессы, к которым нужно иметь доступ извне. В случае, если бы в состав нашего контейнера входил сам Wireguard, а не только GUI, процесс слушал бы запросы на порту 51820. В таком случае нам нужно было бы заполнить поля следующим образом:

В нашем примере никаких дополнительных настроек производить не нужно, поэтому переходим дальше.
- В следующем разделе
Persistent Volumes
мы настроим хранилище данных, которое должно сохранять рабочие данные приложения даже в случае удаления контейнера. Заполняем его следующим образом:

Как вы видите, строки немного различаются. Потому что в случае с томом /etc/wireguard
мы обращаемся к существующему на сервере каталогу. В таких ситуациях предварительно надо убедиться, что у каталога установлено достаточно прав доступа.
- Сохраняем предыдущие настройки и возвращаемся на вкладку
HTTP Settings
.

- На странице находим поле
Container HTTP Port
. По умолчанию здесь установлен стандартный 80 порт. Через него мы сможем получить доступ к GUI. Если приложение использует нестандартный порт, выставляем другое значение. Как правило это указывается где-то в описании к исходникам проекта или в инструкциях по установке. В нашем случае страница GitHub указывает на порт 5000. - Снова сохраняем настройки и далее нажимаем на кнопку
Enable HTTPS
на этой же вкладке. CapRover сгенерирует сертификат Let’s Encrypt, чтобы в дальнейшем соединение между клиентом и сервером было защищено по протоколу HTTPS.
Далее находим опциюForce HTTPS by redirecting all HTTP traffic to HTTPS
и ставим галочку. После снова сохраняем изменения.

- Устанавливаем образ в контейнер, переходя во вкладку
Deployment
и пролистнув до 6-го методаDeploy via ImageName
. Вставляем в поле название образа (в нашем случаеngoduykhanh/wireguard-ui:latest
) и нажимаем на кнопкуDeploy Now
.

Дайте контейнеру примерно 30 секунд на запуск, при этом в логах вы сможете наблюдать за ходом сборки контейнера и запуском приложения.

Таким нехитрым образом пустой контейнер CapRover стал полноценным веб-приложением и теперь доступен по адресу vpn.мойдомен.ru
.
Минусы данного подхода
CapRover не позволяет использовать дополнительные опции для запуска контейнера, так как использует довольно устаревшую реализацию Docker Swarm. В нашем примере это касается таких опций, как cap-add
и sysctl
.
Так, чтобы применить cap-add
к нашему контейнеру, необходимо войти на сервер через SSH и запустить команду:
docker service update --cap-add *Здесь вставляем аргумент* srv-captain--*имя нашего контейнера в сети CapRover*

Хочу сказать, что установленные таким образом опции в моём случае не сохранялись после перезагрузки сервера, поэтому временно рекомендую обходить приложения, которым подобные опции просто необходимы. Возможно в будущих версиях CapRover что-то поменяется.
Базы данных и другие зависимости
В моём примере не предусматривается установка базы данных и прочих зависимостей, но скорее всего они пригодятся для любого другого крупного веб-приложения.
В первую очередь советую просмотреть репозиторий CapRover на предмет готового шаблона для установки в один клик. Если вы нашли нужный компонент (например, базу данных), смело устанавливайте её по шаблону. После установки контейнер получит своё имя в сети CapRover в формате srv-captain--*имя нашего контейнера в сети CapRover*
. При помощи этих имён приложения внутри сети могут “общаться” друг с другом. Поэтому, когда вы устанавливаете приложение, зависимое от базы данных, в адресе BD указывайте присвоенное ей имя (например srv-captain--db
).
Итог
Как мы видим, создание Docker-контейнеров в CapRover является не самой сложной затеей. При этом, сегодня мы познакомились лишь с одним из известных способов. Пишите в комментариях, какой альтернативный способ интересует Вас больше всего, и мы рассмотрим его уже в ближайшем будущем!
Автор: Владислав Лищенко / HomeHosted.ru