Перейти к содержанию

Песочница и удаленный запуск расчетов

Код из python-блока можно запустить на выполнение удаленно. При этом код будет выполняться внутри изолированного контейнера, что обеспечит дополнительный уровень безопасности.

Это накладывает определенные ограничения на сам код - нельзя использовать методы библиотеки ядра, т.к. ядро системы отсутствует при выполнении в удаленном контейнере (методы VmResource)

Загрузка образа в локальный docker репозиторий сервера

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

docker load --input D:\\vmbackend.sandbox.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
Перезапустить сервис:

sudo systemctl daemon-reload
sudo systemctl restart docker
Добавить разрешение в firewall:

sudo ufw allow 2375/tcp
После этого сервис доступен по сети на 2375 TCP-порту.

С использованием сертификатов безопасности (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
Первой пустой строкой сбрасывается значение параметров старта для сервиса docker. Во второй указываем:

  • -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. Разрешить доступ к порту в файрволле:

sudo ufw allow 2376/tcp
Обновите конфигурацию демонов systemd и перезагрузить сервис docker.
sudo systemctl daemon-reload
sudo systemctl restart docker
Посмотреть статус запущенного сервиса можно командой:
systemctl status docker
Основной процесс /usr/bin/dockerd должен быть запущен с новыми параметрами.

Можно проверить, что подключение без сертификата будет отклонено:

docker -H tcp://127.0.0.1:2376 info
Вывод ошибки:
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"              # сертификат центра сертификации
Дополнительно

  1. Установить флаг, указывающий надо ли удалять контейнер после выполнения. docker_for_python_is_remove = 1
  2. Ограничение по используемым ресурсам:
  3. по процессору docker_for_python_cpus. По умолчанию 1 процессор
  4. по памяти docker_for_python_mem_limit. По умолчанию 4g

Особенности работы параметра docker_for_python_is_remove

  • Этот параметр нельзя отставлять выключенным, он нужен для отладки контейнера, в случае если код по какой-то причине не выполняется и приложению не отправляется корректная ошибка.
  • Если его выключить, каждый запуск будет создавать контейнер, но не будет его удалять по завершению работы, что приведет к большому количеству контейнеров, которые останутся завершенными в docker сервера.

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