Размещение ShinyProxy в Azure
Я изучаю возможности Docker для ShinyProxy в Azure и хочу настроить его простым, расширяемым и доступным способом. Насколько я понимаю, есть пять способов настроить службы на основе Docker в Azure.
Вопросы
Мой вопрос двоякий,
- на общем опыте развертывания контейнеров на основе ShinyProxy, которые порождают и уничтожают другие контейнеры на основе подключенных пользовательских сеансов;
- как исправить мой подход?
подходы
(Перечислено от наиболее желательного к наименее желательному; проверено все, кроме подхода виртуальной машины.)
A) Настройка службы приложений Docker или Docker Compose
Большая часть опыта, сложность абстрагируется.
При таком подходе я обнаружил, что текущая реализация Docker и Docker Compose для Azure App Services не поддерживает (игнорирует )
networks
которые необходимы (насколько я понимаю), чтобы ShinyProxy мог взаимодействовать с другими контейнерами во внутренней сети. В файле Docker Compose я указал следующее (и проверил, что он работает локально):
networks:
app_default:
driver: bridge
external: false
name: app_default
Если я правильно понимаю документацию, вы просто не можете создавать какие-либо пользовательские сети для своих контейнеров. Неясно, можете ли вы создать пользовательскую виртуальную сеть Azure, которую можно было бы использовать для этого или нет (у меня нет опыта их создания).
Второй важной частью настройки ShinyProxy является совместное сопоставление файла на хосте и в контейнере. Опять же, это можно сделать с помощью файла Docker Compose или параметров для одного файла Docker. Вот как я указал это в своем файле Docker Compose (и проверил, что он работает):
volumes:
# The `//` path prefix only works on Windows host machines, it's because
# Windows uses the Windows Pipeline system as a workaround for these kinds
# of Unix filesystem paths. On a Linux host machine, the path prefix
# needs to only contain a single forward slash, `/`.
# Windows Host volume
# docker_sock: //var/run/docker.sock
# Linux Host volume
docker_sock: /var/run/docker.sock
А затем используйте
docker_sock
именованный том для сопоставления с контейнерами
/var/run/docker.sock
файл,
docker_sock:/var/run/docker.sock
.
Из-за этих двух проблем, пытаясь посетить любой
specs
определенный в файле ShinyProxy, просто приведет к
Connection refused
или же
File could not be found
Ошибки Java. Оба соответствуют общению по сети и
docker.sock
отображение.
Б) Экземпляры контейнеров
Новый вид сервиса, кажется приятным и простым
Почти те же проблемы, что и в подходе службы приложений.
C) Контейнерные приложения
Новый вид сервиса, кажется приятным и простым
Почти те же проблемы, что и в подходе службы приложений.
Г) Служба Кубернетес
Требует много дополнительных настроек.
Пробовал, но отказался от этого подхода, потому что я не хочу иметь дело с дополнительным уровнем конфигурации, и я сомневаюсь, что мне нужен такой большой контроль для моей желаемой цели.
Д) Виртуальная машина
Требуется много настроек и самостоятельного управления для производственной среды.
Еще не пробовал. Кажется, есть пара статей, в которых рассказывается, как к этому подойти.
Локальное воспроизведение
Вот несколько измененных примеров моих конфигурационных файлов. Я оставил пару комментариев, а также прокомментировал свойства там.
блестящий прокси
application.yml
:
# ShinyProxy Configuration
proxy:
title: ShinyProxy Apps
landing-page: /
heartbeat-enabled: true
heartbeat-rate: 10000 # 10 seconds
heartbeat-timeout: 60000 # 60 seconds
# Timeout for the container to be available to ShinyProxy
container-wait-time: 20000 # 20 seconds
port: 8080
authentication: none
docker:
# url: http://localhost:2375
privileged: true
internal-networking: true
container-network: "app_default"
specs:
- id: hello_demo
container-image: openanalytics/shinyproxy-demo
display-name: Hello Application
description: Application which demonstrates the basics of a Shiny app.
container-network: "${proxy.docker.container-network}"
# container-cmd: ["R", "-e", "shinyproxy::run_01_hello()"]
logging:
file:
name: shinyproxy.log
server:
servlet:
context=path: /
sprint:
application:
name: "ShinyProxy Apps"
блестящий прокси
Dockerfile
:
FROM openjdk:8-jre
USER root
RUN mkdir -p "/opt/shinyproxy"
# Download shinyproxy version from the official source
RUN wget https://www.shinyproxy.io/downloads/shinyproxy-2.6.0.jar -O "/opt/shinyproxy/shinyproxy.jar"
# Or, Copy local shinyproxy jar file
# COPY shinyproxy.jar "/opt/shinyproxy/shinyproxy.jar"
COPY application.yml "/opt/shinyproxy/application.yml"
WORKDIR /opt/shinyproxy/
CMD ["java", "-jar", "/opt/shinyproxy/shinyproxy.jar"]
docker-compose.yml
:
networks:
app_default:
driver: bridge
external: false
name: app_default
# volumes:
# The `//` path prefix only works on Windows host machines, it's because
# Windows uses the Windows Pipeline system as a workaround for these kinds
# of Unix filesystem paths. On a Linux host machine, the path prefix
# needs to only contain a single forward slash, `/`.
# Windows only volume
# docker_sock: //var/run/docker.sock
# Linux only volume
# docker_sock: /var/run/docker.sock
services:
# Can be used to test out other images than the shinyproxy one
# hello_demo:
# image: openanalytics/shinyproxy-demo
# container_name: hello_demo
# ports:
# - 3838:3838
# networks:
# - app_default
# volumes:
# - //var/run/docker.sock:/var/run/docker.sock
shinyproxy:
build: ./shinyproxy
container_name: app_shinyproxy
# Change the image to what you've called your own image to
image: shinyproxy:latest
# privileged: true
restart: OnFailure
networks:
- app_default
ports:
- 8080:8080
volumes:
- //var/run/docker.sock:/var/run/docker.sock
Со всеми файлами на месте просто запустите
docker compose build && docker compose up
.