Песочница и удаленный запуск расчетов
Код из python-блока можно запустить на выполнение удаленно. При этом код будет выполняться внутри изолированного контейнера, что обеспечит дополнительный уровень безопасности.
Это накладывает определенные ограничения на сам код - нельзя использовать методы библиотеки ядра, т.к. ядро системы
отсутствует при выполнении в удаленном контейнере (методы VmResource)
Загрузка образа в локальный docker репозиторий сервера
На сервер, на котором будет выполняться код в изолированном контейнере, необходимо загрузить образ, полученный в виде tar архива.
Настройка сервера для доступа к docker
После этого необходимо разрешить соединение и управление docker по сети. Приложение будет соединяться с сервером, запускать образ с кодом, который создал пользователь и, после получения результата, удалять за собой отработавший контейнер.
Необходимо создать файл /etc/systemd/system/docker.service.d/startup_options.conf
Без сертификатов безопасности (TCP-порт 2375)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
С использованием сертификатов безопасности (TCP-порт 2376):
Добавить файл расширения сервиса systemd (основной файл с описанием юнита
/etc/systemd/system/multi-user.target.wants/docker.service) для изменения параметров старта демона:
/etc/systemd/system/docker.service.d/startup_options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem
-H fd://- означает, что параметрами прослушивания сокета управляет systemd в файле/etc/systemd/system/sockets.target.wants/docker.socket(по умолчанию подключение к dockerd осуществляется через unix-сокет/var/run/docker.sock, поменять можно в юните сокета или параметром-H unix:///var/run/docker-bootstrap.sock)-H tcp://0.0.0.0:2376- указываем, что демон dockerd (бэкенд часть платформы контейнеризации, не путать с клиентской частью docker) запустит серверный TCP-порт 2376, слушающий входящие соединения на всех доступных IP-адресах сетевых интерфейсов (для запуска сокета только на конкретном IP-адресе укажите его вместо 0.0.0.0)--tls*- параметры, включающие защиту TLS-сертификатами сетевого подключения к сервису.
С TLS-сертификатами безопасности TCP-порт 2376. Разрешить доступ к порту в файрволле:
Обновите конфигурацию демонов systemd и перезагрузить сервис docker. Посмотреть статус запущенного сервиса можно командой: Основной процесс/usr/bin/dockerd должен быть запущен с новыми параметрами.
Можно проверить, что подключение без сертификата будет отклонено:
Вывод ошибки:Get http://127.0.0.1:2376/v1.21/containers/json: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?
Настройка образа в конфигурационном файле приложения
Все настройки доступны для переопределения через переменными окружения с префиксом VISMIND_. Подробнее см. Переменные окружения
docker_for_python_iso_name = "vmbackend:sandbox" # docker образ песочницы
docker_for_python_base_url = "tcp://dev.int.bittechno.ru:2376" # адрес сервера с песочницей
docker_for_python_client_cert = "./conf/docker/cert.pem" # сертификат
docker_for_python_client_key = "./conf/docker/key.pem" # ключ клиента
docker_for_python_ca_cert = "./conf/docker/ca.pem" # сертификат центра сертификации
- Установить флаг, указывающий надо ли удалять контейнер после выполнения.
docker_for_python_is_remove= 1 - Ограничение по используемым ресурсам:
- по процессору
docker_for_python_cpus. По умолчанию 1 процессор - по памяти
docker_for_python_mem_limit. По умолчанию 4g
Особенности работы параметра docker_for_python_is_remove
- Этот параметр нельзя отставлять выключенным, он нужен для отладки контейнера, в случае если код по какой-то причине не выполняется и приложению не отправляется корректная ошибка.
- Если его выключить, каждый запуск будет создавать контейнер, но не будет его удалять по завершению работы, что приведет к большому количеству контейнеров, которые останутся завершенными в docker сервера.
Если образ не установлен или настройки приложения заданы некорректно - при попытке запуска будет возвращена системная ошибка, которую вернет сам сервер. Это необходимо для корректной отладки соединения, в случае если настройки некорректные.
