Перенос пользовательского программного обеспечения в Службу приложений Azure с помощью пользовательского контейнера

Служба приложений Azure предоставляет предопределенные стеки приложений на платформе Windows, например ASP.NET или Node.js, выполняющиеся в IIS. Предварительно настроенная среда Windows блокирует в операционной системе возможность административного доступа, установки программного обеспечения, изменений в глобальном кэше сборок и т. д. (см. раздел Функциональные возможности операционной системы для службы приложений Azure). Тем не менее с помощью пользовательского контейнера Windows в службе приложений можно вносить в ОС изменения, необходимые для вашего приложения. Поэтому легко перенести локальное приложение, которому требуется пользовательская ОС и конфигурация программного обеспечения. В этом руководстве показано, как перенести в службу приложений приложение ASP.NET, которое использует пользовательские шрифты, установленные в библиотеке шрифтов Windows. Вы развернете пользовательский образ Windows из Visual Studio в Реестр контейнеров Azure, а затем запустите его в службе приложений.

Показано веб-приложение, выполняемое в контейнере Windows.

Предварительные требования

Для работы с этим руководством сделайте следующее:

Настройка приложения в локальной среде

Скачивание примера приложения

На этом шаге вы настроите локальный проект .NET.

Пример проекта содержит простое приложение ASP.NET, которое использует пользовательский шрифт, устанавливаемый в библиотеку шрифтов Windows. Устанавливать шрифты не обязательно, но это пример приложения, интегрированного с базовой ОС. Чтобы перенести такое приложение в службу приложений, переработайте код, чтобы удалить интеграцию, либо перенесите его "как есть" в пользовательском контейнере Windows.

Установка шрифта

В проводнике Windows перейдите в папку custom-font-win контейнер master/CustomFontSample, щелкните правой кнопкой мыши файл FrederickatheGreat Regular.ttf и выберите Установить.

Этот шрифт находится в свободном доступе на веб-сайте Google Fonts.

Запустите приложение

Откройте файл custom-font-win-container/CustomFontSample.sln в Visual Studio.

Введите Ctrl+F5, чтобы запустить приложение без отладки. Это приложение откроется в браузере по умолчанию.

Снимок экрана: приложение, отображаемое в браузере по умолчанию.

Так как приложение использует установленный шрифт, оно не может работать в песочнице службы приложений. Тем не менее его можно развернуть с помощью контейнера Windows, так как шрифт можно установить в контейнер Windows.

Настройка контейнера Windows

В Обозреватель решений щелкните правой кнопкой мыши проект кустомфонтсампле и выберите пункт Добавитьподдержку оркестрации контейнеров.

Снимок экрана: окно "Поддержка оркестратора контейнеров"." data-linktype="relative-path">

Выберите DOCKER ComposeОК.

Теперь проект настроен для запуска в контейнере Windows. Объект Dockerfile добавлен в проект CustomFontSample, а проект docker-compose добавлен в решение.

В обозревателе решений откройте Dockerfile.

Необходимо использовать поддерживаемый родительский образ. Измените родительский образ, заменив строку FROM приведенным ниже кодом.

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019

В конце файла добавьте приведенную ниже строку, после чего сохраните файл.

RUN ${source:-obj/Docker/publish/InstallFont.ps1}

Файл InstallFont.ps1 можно найти в проекте CustomFontSample. Это простой сценарий, который устанавливает шрифт. Более сложную версию этого сценария можно найти в Центре сценариев.

Примечание

Чтобы локально проверить контейнер Windows, убедитесь, что на локальном компьютере запущен Docker.

Публикация в Реестре контейнеров Azure

В Реестре контейнеров Azure можно хранить образы для развертывания контейнеров. Можно настроить службу приложений для использования образов, размещенных в Реестре контейнеров Azure.

Открытие мастера публикации

Щелкните правой кнопкой мыши проект CustomFontSample в обозревателе решений и выберите Опубликовать.

Снимок экрана: окно

Создание реестра и публикация

В мастере публикации выберите Реестр контейнеровсоздать новый опубликовать реестр контейнеров Azure.

Снимок экрана: мастер публикации, в котором выделены такие элементы:

Вход с учетной записью Azure

В диалоговом окне Создать реестр контейнеров Azure выберите Добавить учетную запись и выполните вход в подписку Azure. Если вы уже вошли в систему, выберите учетную запись, содержащую необходимую подписку, в раскрывающемся меню.

Вход в Azure

Настройка реестра

Настройте новый реестр контейнеров в соответствии с предлагаемыми значениями в следующей таблице. По завершении нажмите кнопку Создать.

Параметр Рекомендуемое значение Дополнительные сведения
DNS-префикс Оставьте имя созданного реестра или измените его, указав другое уникальное имя.
Группа ресурсов Щелкните Создать, введите имя myResourceGroup и нажмите кнопку ОК.
SKU Basic Ценовые категории
Расположение реестра Западная Европа

Настройка Реестра контейнеров Azure

Откроется окно терминала, в котором отображается ход развертывания образа. Дождитесь завершения развертывания.

Вход в Azure

Войдите на портал Azure по адресу https://portal.azure.com.

Создание веб-приложения

В меню слева выберите создать ресурсвеб-веб-приложение для контейнеров.

Настройка основных сведений приложения

На вкладке Основные сведения настройте параметры в соответствии со следующей таблицей, а затем щелкните Next: Docker (Далее: Docker).

Параметр Рекомендуемое значение Дополнительные сведения
Подписка Убедитесь, что отображается правильная подписка.
Группа ресурсов Выберите Создать, введите myResourceGroup и щелкните ОК.
имя; Введите уникальное имя. URL-адрес веб-приложения: https://<app-name>.azurewebsites.net, где <app-name> — имя приложения.
Опубликовать Контейнер Docker
Операционная система Windows
Регион Западная Европа
План Windows Выберите Создать, введите myAppServicePlan и щелкните ОК.

Вкладка Основные сведения должна выглядеть следующим образом:

Показана вкладка

Настройка контейнера Windows

На вкладке Docker настройте свой пользовательский контейнер Windows, как показано в следующей таблице, и выберите Просмотр и создание.

Параметр Рекомендуемое значение
Источник образа Реестр контейнеров Azure
Реестр Выберите созданный ранее реестр.
Изображение customfontsample
Тег последняя

Завершение создания приложения

Нажмите кнопку Создать и подождите, пока Azure создаст необходимые ресурсы.

Переход к веб-приложению

По завершении операции Azure отображается окно уведомления.

Показано сообщение о том, что операция Azure завершена.

  1. Щелкните Перейти к ресурсу.

  2. На странице приложения щелкните ссылку в разделе URL-адрес.

В браузере откроется следующая страница:

Показана новая страница браузера для веб-приложения.

Подождите несколько минут и попробуйте еще раз, пока не откроется домашняя страница с тем самым красивым шрифтом.

Показана домашняя страница со шрифтом, который вы настроили.

Поздравляем! Вы перенесли приложение ASP.NET в Службу приложений Azure в контейнере Windows.

Просмотр журналов запуска контейнера

Загрузка контейнера Windows может занять некоторое время. Чтобы просмотреть ход выполнения, перейдите по следующему URL-адресу, заменив имя > приложения именем приложения.

https://<app-name>.scm.azurewebsites.net/api/logstream

Потоковые журналы выглядят следующим образом:

14/09/2018 23:16:19.889 INFO - Site: fonts-win-container - Creating container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest.
14/09/2018 23:16:19.928 INFO - Site: fonts-win-container - Create container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest succeeded. Container Id 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:23.405 INFO - Site: fonts-win-container - Start container succeeded. Container: 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Configuring container
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container start-up and configuration completed successfully

Служба приложений Azure использует технологию контейнеров Docker для размещения встроенных и пользовательских образов. Чтобы просмотреть список встроенных образов, выполните команду Azure CLI az webapp list-runtimes --linux. Если эти образы не соответствуют вашим требованиям, вы можете создать и развернуть пользовательский образ.

В этом руководстве описано следующее:

  • Отправка пользовательского образа Docker в Реестр контейнеров Azure.
  • Развертывание пользовательского образа в Службе приложений.
  • Настройка переменных среды
  • Извлечение образа в Службу приложений с помощью управляемого удостоверения.
  • Доступ к журналам диагностики
  • Включение CI/CD из Службы приложений в Реестра контейнеров Azure.
  • Подключение контейнера с помощью SSH.

Выполнение инструкций из этого руководства связано с небольшими расходами для учетной записи Azure за создание реестра контейнеров, и, возможно, за размещение контейнера на срок более месяца.

Настройка начальной среды

Для работы с этим учебником требуется Azure CLI версии 2.0.80 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

  • Используйте среду Bash в Azure Cloud Shell.

    Запуск Cloud Shell в новом окне

  • При необходимости установите Azure CLI, чтобы выполнять справочные команды CLI.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о дополнительных возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Если появится запрос, установите расширения Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Установите Docker для создания образов Docker. Для установки Docker может потребоваться перезагрузка компьютера.

После установки DOCKER откройте окно терминала и убедитесь, что DOCKER установлен:

docker --version

Клонирование или скачивание примера приложения

Чтобы получить пример для работы с этим руководством, его можно клонировать с помощью Git или скачать.

Клонирование с помощью Git

Клонируйте репозиторий примера.

git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config core.autocrlf=input

Не забудьте включить аргумент --config core.autocrlf=input, чтобы обеспечить правильное завершение строк в файлах, которые используются в контейнере Linux.

Затем перейдите в эту папку:

cd docker-django-webapp-linux

Загрузка с GitHub

Вместо клонирования с помощью Git вы можете открыть страницу https://github.com/Azure-Samples/docker-django-webapp-linux, а затем выбрать действие https://github.com/Azure-Samples/docker-django-webapp-linux (Клонировать) и Download ZIP (Скачать ZIP-файл).

Распакуйте ZIP-файл в папку с именем docker-django-webapp-linux.

Затем откройте окно терминала в этой папке docker-django-webapp-linux.

(Необязательно) Анализ файл Docker

В нашем примере файл с именем Dockerfile описывает образ Docker и содержит инструкции по настройке.

FROM tiangolo/uwsgi-nginx-flask:python3.6

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir
ADD . /code/

# ssh
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
	&& apt-get install -y --no-install-recommends openssh-server \
	&& echo "$SSH_PASSWD" | chpasswd 

COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/

RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000 2222

#CMD ["python", "/code/manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["init.sh"]
  • Первая группа команд устанавливает в среде обязательные для приложения компоненты.
  • Вторая группа команд создает сервер SSH для безопасного взаимодействия между контейнером и узлом.
  • В последней строке файла (ENTRYPOINT ["init.sh"]) вызывается init.sh для запуска службы SSH и сервера Python.

Сборка и тестирование образа в локальной среде

Примечание

Docker Hub имеет квоты на число анонимных вытягиваний с одного IP-адреса и на число аутентифицированных вытягиваний от одного бесплатного пользователя (см. сведения о передаче данных). Если вы заметили, что число вытягиваний из Docker Hub ограничено, попробуйте выполнить команду docker login, если вы еще не вошли в систему.

  1. Запустите сборку образа с помощью следующей команды.

    docker build --tag appsvc-tutorial-custom-image .
    
  2. Убедитесь, что сборка работает, запустив контейнер Docker на локальном компьютере.

    docker run -it -p 8000:8000 appsvc-tutorial-custom-image
    

    Эта команда docker run задает порт с помощью аргумента -p, за которым следует имя образа. -it позволяет прерывать ее с помощью Ctrl+C.

    Совет

    Если вы работаете в среде Windows и видите ошибку вида standard_init_linux.go:211: exec user process caused "no such file or directory" , значит в файле init.sh для завершения строк используется CR-LF, а не ожидаемый вариант LF. Эта ошибка возникает, если вы клонировали пример репозитория с помощью Git, но не включили параметр --config core.autocrlf=input. В этом случае повторите клонирование репозитория с правильным аргументом --config. Вы также можете получить аналогичную ошибку, если редактировали файлinit.sh и сохранили его с использованием CR-LF для завершения. В этом случае сохраните его снова, используя LF.

  3. Перейдите по адресу http://localhost:8000 и убедитесь, что веб-приложение и контейнер функционируют правильно.

    Локальное тестирование веб-приложения

Создание группы ресурсов

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

Выполните команду az group create, чтобы создать группу ресурсов.

az group create --name myResourceGroup --location westeurope

Вы можете изменить значение --location, чтобы указать близкий к вам регион.

Принудительная отправка образов в Реестр контейнеров Azure

В этом разделе вы отправите образ в Реестр контейнеров Azure, откуда Служба приложений сможет его развернуть.

  1. Выполните команду az acr create, чтобы создать Реестр контейнеров Azure.

    az acr create --name <registry-name> --resource-group myResourceGroup --sku Basic --admin-enabled true
    

    Замените <registry-name> понятным именем реестра. Это имя может содержать только буквы и цифры и должно быть уникальным в пределах Azure.

  2. Выполните команду az acr show, чтобы получить учетные данные для этого реестра.

    az acr credential show --resource-group myResourceGroup --name <registry-name>
    

    Выходные данные этой команды содержат два пароля и имя пользователя для реестра в формате JSON.

  3. Выполните команду docker login для входа в реестр контейнеров:

    docker login <registry-name>.azurecr.io --username <registry-username>
    

    Замените <registry-name> и <registry-username> значениями из предыдущих шагов. При появлении запроса введите один из паролей из предыдущего шага.

    Используйте одно и то же имя реестра во всех остальных шагах этого раздела.

  4. Войдя, присвойте локальному образу Docker тег для реестра.

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  5. С помощью команды docker push отправьте образ в реестр.

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

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

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

  6. Чтобы проверить успешность принудительной отправки, выполните команду az acr repository list.

    az acr repository list -n <registry-name>
    

    В выходных данных должно отобразиться имя отправленного образа.

Настройка развертывания образа из реестра в Службе приложений

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

  1. Создайте план Службы приложений с помощью команды az appservice plan create.

    az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --is-linux
    

    План Службы приложений соответствует виртуальной машине, в которой размещено веб-приложение. По умолчанию предыдущая команда использует бюджетную ценовую категорию B1, которая предоставляется в течение первого месяца бесплатно. Уровень можно изменить с помощью параметра --sku.

  2. Создайте веб-приложение с помощью команды az webpp create.

    az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --deployment-container-image-name <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    Замените здесь <app-name> именем веб-приложения, которое должно быть уникальным в пределах Azure. Также замените <registry-name> именем реестра из предыдущего раздела.

  3. Используйте az webapp config appsettings set, чтобы задать переменную среды WEBSITES_PORT, которую ожидает код приложения.

    az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_PORT=8000
    

    Замените <app-name> значением, которое вы использовали на предыдущем шаге.

    Дополнительные сведения об этой переменной среды см. в файле сведений в репозитории этого примера на сайте GitHub.

  4. Включите управляемое системой удостоверение для веб-приложения с помощью команды:

    az webapp identity assign --resource-group myResourceGroup --name <app-name> --query principalId --output tsv
    

    Замените <app-name> значением, которое вы использовали на предыдущем шаге. Отфильтровав выходные данные этой команды с помощью аргументов --query и --output, вы найдете субъект-службу назначенного удостоверения, который вам вскоре потребуется.

    Управляемое удостоверение позволяет предоставить веб-приложению разрешения на доступ к другим ресурсам Azure, не создавая специальные учетные данные.

  5. Получите с помощью команды az account show идентификатор подписки, который вам понадобится на следующем шаге.

    az account show --query id --output tsv
    
  6. Предоставьте управляемому удостоверению разрешение на доступ к реестру контейнеров.

    az role assignment create --assignee <principal-id> --scope /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/<registry-name> --role "AcrPull"
    

    Измените следующие значения:

    • <principal-id> на идентификатор субъекта-службы, полученный командой az webapp identity assign;
    • <registry-name> на имя реестра контейнеров;
    • <subscription-id> на идентификатор подписки, полученный командой az account show.

    Дополнительные сведения об этих разрешениях см. в статье Общие сведения об управлении доступом на основе ролей (RBAC) для ресурсов Azure.

  7. Настройте приложение для извлечения данных из Реестра контейнеров Azure с помощью управляемого удостоверения.

    az resource update --ids /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Web/sites/<app-name>/config/web --set properties.acrUseManagedIdentityCreds=True
    

    Измените следующие значения:

    • замените <subscription-id> идентификатором подписки, полученным командой az account show;
    • замените <app-name> именем веб-приложения.

    Совет

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

    clientId=$(az identity show --resource-group <group-name> --name <identity-name> --query clientId --output tsv)
    az resource update --ids /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Web/sites/<app-name>/config/web --set properties.AcrUserManagedIdentityID=$clientId
    

Развертывание образа и тестирование приложения

Вы сможете выполнить эти шаги, когда образ будет передан в реестр контейнеров, а Служба приложений полностью подготовлена.

  1. С помощью команды az webapp config container set укажите реестр контейнеров и образ, который нужно развернуть для веб-приложения.

    az webapp config container set --name <app-name> --resource-group myResourceGroup --docker-custom-image-name <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest --docker-registry-server-url https://<registry-name>.azurecr.io
    

    Замените <app-name> именем веб-приложения, а два вхождения <registry-name> — именем реестра.

    • При использовании реестра, отличающегося от Docker Hub (как в представленном примере), значение --docker-registry-server-url должно быть отформатировано, чтобы содержать https:// и полное доменное имя реестра.
    • Сообщение No credential was provided to access Azure Container Registry. Trying to look up... (Учетные данные для доступа к Реестру контейнеров Azure не предоставлены. Выполняется поиск...) означает, что Azure использует для проверки подлинности в реестре контейнеров управляемое удостоверение, а не запрашивает имя и пароль.
    • Если вы встретите ошибку AttributeError: 'NoneType' object has no attribute 'reserved' (AttributeError: объект NoneType не имеет атрибута reserved), проверьте правильность <app-name>.

    Совет

    Вы можете в любой момент получить параметры контейнера для веб-приложения с помощью команды az webapp config container show --name <app-name> --resource-group myResourceGroup. Этот образ задается в свойстве DOCKER_CUSTOM_IMAGE_NAME. Когда веб-приложение развертывается через шаблоны Azure DevOps или Azure Resource Manager, этот же образ может отображаться и в свойстве с именем LinuxFxVersion. Оба этих свойства имеют одинаковое назначение. Если они оба присутствуют в конфигурации веб-приложения, приоритет отдается LinuxFxVersion.

  2. Когда команда az webapp config container set будет выполнена, веб-приложение должно работать в контейнере в Службе приложений.

    Чтобы проверить приложение, перейдите по адресу https://<app-name>.azurewebsites.net, заменив <app-name> именем веб-приложения. При первом входе ответ от приложения может поступить с некоторой задержкой, так как Служба приложений должна получить из реестра полный образ. Если время ожидания браузера истечет, просто обновите страницу. После получения начального образа все последующие тесты выполняются намного быстрее.

    Успешный тест веб-приложения в Azure

Доступ к журналам диагностики

Пока вы ожидаете извлечения образа Службой приложений, удобно видеть, что именно делает Служба приложений, выполняя потоковую передачу журналов контейнера в терминал.

  1. Включите ведение журнала для контейнера.

    az webapp log config --name <app-name> --resource-group myResourceGroup --docker-container-logging filesystem
    
  2. Включите потоковую передачу журналов.

    az webapp log tail --name <app-name> --resource-group myResourceGroup
    

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

    Вы также можете проверить файлы журнала в браузере на странице https://<app-name>.scm.azurewebsites.net/api/logs/docker.

  3. Чтобы остановить потоковую передачу журналов, нажмите клавиши Ctrl+C.

настройка непрерывного развертывания;

Приложение Службы приложений теперь может безопасно извлечь образ контейнера из частного реестра контейнеров. Однако оно не знает, когда этот образ обновится в реестре. Каждый раз при отправке обновленного образа в реестр необходимо вручную запускать извлечение образа, перезапустив приложение Службы приложений. На этом шаге вы включаете CI/CD, чтобы автоматически уведомлять Службу приложений о новом образе и активировать извлечение.

  1. Включите CI/CD в Службе приложений.

    az webapp deployment container config --enable-cd true --name <app-name> --resource-group myResourceGroup --query CI_CD_URL --output tsv
    

    CI_CD_URL — это URL-адрес, который Служба приложений создает автоматически. Ваш реестр должен использовать этот URL-адрес, чтобы уведомлять Службу приложений о том, что произошла отправка образа. При этом веб-перехватчик не создается.

  2. Создайте веб-перехватчик в реестре контейнеров, используя значение CI_CD_URL, полученное на предыдущем шаге.

    az acr webhook create --name appserviceCD --registry <registry-name> --uri '<ci-cd-url>' --actions push --scope appsvc-tutorial-custom-image:latest
    
  3. Чтобы проверить, правильно ли настроен веб-перехватчик, проверьте связь с веб-перехватчиком и узнайте, получаете ли вы ответ "200 ОК".

    eventId=$(az acr webhook ping --name appserviceCD --registry <registry-name> --query id --output tsv)
    az acr webhook list-events --name appserviceCD --registry <registry-name> --query "[?id=='$eventId'].eventResponseMessage"
    

    Совет

    Чтобы просмотреть все сведения обо всех событиях веб-перехватчика, удалите параметр --query.

    Если вы выполняете потоковую передачу журнала контейнера, то вы увидите сообщение Starting container for site после проверки связи с веб-перехватчиком, так как он активирует перезапуск приложения. Так как вы не внесли каких-либо обновлений в образ, Службе приложений нечего извлекать.

Изменение кода и повторное развертывание приложения

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

  1. В локальной папке docker-django-webapp-linux откройте файл app/templates/app/index.html.

  2. Измените первый элемент HTML в соответствии со следующим кодом.

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="#">Azure App Service - Updated Here!</a>
        </div>
      </div>
    </nav>
    
  3. Сохраните изменения.

  4. Перейдите в папку docker-django-webapp-linux и перестройте образ.

    docker build --tag appsvc-tutorial-custom-image .
    
  5. В теге этого образа укажите новый тег номера версии (v1.0.1).

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:v1.0.1
    

    Замените <registry-name> именем реестра.

  6. Отправьте образ в реестр:

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:v1.0.1
    
  7. После завершения отправки образа веб-перехватчик уведомляет Службу приложений об отправке, а Служба приложений пытается извлечь обновленный образ. Подождите несколько минут и проверьте, развернуто ли обновление, перейдя по адресу https://<app-name>.azurewebsites.net.

Подключение контейнера с помощью SSH.

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

Настройка SSH для контейнера

Пример приложения в этом руководстве уже имеет Dockerfile с необходимой конфигурацией, которая устанавливает SSH-сервер и задает учетные данные для входа. Этот раздел не содержит практических действий. Чтобы подключиться к контейнеру, перейдите к следующему разделу.

ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
  && apt-get install -y --no-install-recommends openssh-server \
  && echo "$SSH_PASSWD" | chpasswd 

Примечание

Эта конфигурация не допускает внешние подключения к контейнеру. SSH доступен только на сайте Kudu и на сайте SCM. Сайты Kudu и SCM выполняют аутентификацию с вашей учетной записью Azure. root:Docker! не должен заменяться SSH. SCM и Kudu будут использовать ваши учетные данные портала Azure. Изменение этого значения приведет к ошибке при использовании SSH.

Также этот Dockerfile копирует файл sshd_config в папку /etc/ssh/ и предоставляет порт 2222 в контейнере.

COPY sshd_config /etc/ssh/

# ...

EXPOSE 8000 2222

Внутренний порт 2222 доступен контейнерам внутри мостовой сети виртуальной частной сети.

Наконец, начальный сценарий init.sh запускает SSH-сервер.

#!/bin/bash
service ssh start

Открытие SSH-подключения к контейнеру

  1. Чтобы установить подключение, перейдите по адресу https://<app-name>.scm.azurewebsites.net/webssh/host и войдите с учетной записью Azure. Замените <app-name> именем веб-приложения.

  2. Войдя, вы попадете на информационную страницу веб-приложения. Выберите SSH в верхней части страницы, чтобы открыть оболочку и выполнить команды.

    Например, здесь можно изучить выполняемые процессы с помощью команды top.

Очистка ресурсов

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

az group delete --name myResourceGroup

Дальнейшие действия

Вы научились выполнять следующие задачи:

  • Развертывание настраиваемого образа в частном реестре контейнеров.
  • Развертывание и запуск пользовательского образа в Службе приложений
  • Обновление и повторное развертывание образа.
  • Доступ к журналам диагностики
  • Подключение контейнера с помощью SSH.
  • Отправка пользовательского образа Docker в Реестр контейнеров Azure.
  • Развертывание пользовательского образа в Службе приложений.
  • Настройка переменных среды
  • Извлечение образа в Службу приложений с помощью управляемого удостоверения.
  • Доступ к журналам диагностики
  • Включение CI/CD из Службы приложений в Реестра контейнеров Azure.
  • Подключение контейнера с помощью SSH.

Перейдите к следующему руководству, в котором описано, как сопоставлять пользовательские DNS-имена с приложением.

Также ознакомьтесь с другими ресурсами: