Eseguire la migrazione di un software personalizzato al Servizio app di Azure usando un contenitore personalizzato

Servizio app di Azure fornisce stack di applicazioni predefiniti, ad esempio ASP.NET o Node.js, in Windows. Questi stack di applicazioni vengono eseguiti in IIS. L'ambiente Windows preconfigurato blocca il sistema operativo da:

  • Accesso amministrativo.
  • Installazioni software.
  • Modifiche alla Global Assembly Cache.

Per altre informazioni, vedere Funzionalità del sistema operativo in Servizio app di Azure.

È possibile distribuire un'immagine di Windows con configurazione personalizzata da Visual Studio per apportare al sistema operativo le modifiche necessarie per l'app. In questo modo, è facile eseguire la migrazione di un'app locale che richiede una configurazione personalizzata del sistema operativo e del software. Questa esercitazione illustra come eseguire la migrazione al servizio app di un'app ASP.NET che usa tipi di carattere personalizzati installati nella libreria dei tipi di carattere Windows. Si distribuisce un'immagine Windows configurata in modo personalizzato da Visual Studio a Registro Azure Container e quindi la si esegue nel servizio app.

Mostra l'app Web in esecuzione in un contenitore di Windows.

Prerequisiti

Per completare questa esercitazione:

Configurare l'app in locale

Scaricare l'esempio

In questo passaggio si configura il progetto .NET locale.

Il progetto di esempio contiene un'applicazione ASP.NET semplice che usa un tipo di carattere personalizzato installato nella libreria dei tipi di carattere Windows. Non è necessario installare font. Tuttavia, il campione è un esempio di un'app integrata con il sistema operativo sottostante. Per eseguire la migrazione di un'app di questo tipo al servizio app, è necessario riprogettare il codice per rimuovere l'integrazione oppure è possibile eseguire la migrazione dell'app senza modifiche in un contenitore Windows personalizzato.

Installare il tipo di carattere

In Esplora risorse passare a custom-font-win-container-master/CustomFontSample, fare clic con il pulsante destro del mouse su FrederickatheGreat-Regular.ttf e scegliere Installa.

Questo tipo di carattere è disponibile pubblicamente in Google Fonts.

Eseguire l'app

Aprire il file custom-font-win-container-master/CustomFontSample.sln in Visual Studio.

Selezionare CTRL+F5 per eseguire l'app senza eseguire il debug. L'app viene visualizzata nel browser predefinito.

Screenshot che mostra l'app visualizzata nel browser predefinito.

Poiché usa un font installato, l'app non può essere eseguita nell'ambiente sandbox del servizio app. È tuttavia possibile distribuirla usando un contenitore Windows, perché è possibile installare il tipo di carattere nel contenitore Windows.

Configurare il contenitore Windows

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto CustomFontSample e scegliere Aggiungi>Container Orchestration Support (Supporto orchestrazione contenitori).

Screenshot della finestra Esplora soluzioni che mostra il progetto CustomFontSample. Le voci di menu Aggiungi e Supporto orchestratore contenitore sono selezionate.

Selezionare Docker Compose>OK.

Il progetto è ora impostato per l'esecuzione in un contenitore di Windows. Un Dockerfile viene aggiunto al progetto CustomFontSample e un progetto docker-compose viene aggiunto alla soluzione.

Da Esplora soluzioni aprire Dockerfile.

È necessario usare un'immagine padre supportata. Modificare l'immagine padre sostituendo la riga FROM con il codice seguente:

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

Alla fine del file aggiungere la riga seguente e quindi salvare il file:

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

InstallFont.ps1 è disponibile nel progetto CustomFontSample. Si tratta di un semplice script che installa il tipo di carattere. Una versione più complessa dello script è disponibile in PowerShell Gallery.

Nota

Per testare il contenitore Windows in locale, assicurarsi di aver avviato Docker nel computer locale.

Pubblicare nel Registro Azure Container

Registro Azure Container consente di archiviare le immagini per le distribuzioni di contenitori. È possibile configurare il servizio app per usare le immagini ospitate in Registro Azure Container.

Aprire la pubblicazione guidata

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto CustomFontSample e scegliere Pubblica.

Screenshot di Esplora soluzioni che mostra il progetto CustomFontSample. La voce di menu Pubblica è selezionata.

Creare e pubblicare il Registro di sistema

Nella pubblicazione guidata selezionare Registro contenitori>Crea nuovo Registro Azure Container>Pubblica.

Screenshot della pubblicazione guidata. Registro Contenitori, Crea nuovo Registro Azure Container e il pulsante Pubblica sono selezionati.

Accedere con un account Azure

Nella finestra di dialogo Crea un nuovo registro Azure Container, selezionare Aggiungi un account e quindi accedere alla sottoscrizione di Azure. Se è già stato eseguito l'accesso, selezionare l'account contenente la sottoscrizione desiderata dall'elenco a discesa.

Screenshot che mostra come accedere ad Azure.

Configurare il registro

Configurare il nuovo registro contenitori usando i valori suggeriti nella tabella seguente come guida. Al termine selezionare Crea.

Impostazione Valore suggerito
Prefisso DNS Mantenere il nome del registro generato oppure modificarlo scegliendo un altro nome univoco.
Gruppo di risorse Selezionare Nuovo, digitare myResourceGroup e selezionare OK.
SKU Di base. Per altre informazioni, vedere i piani tariffari.
Percorso del registro Europa occidentale

Screenshot della pagina Crea un nuovo Registro Azure Container.

Verrà aperta una finestra del terminale che mostra l'avanzamento della distribuzione dell'immagine. Attendere il completamento della distribuzione.

Accedere ad Azure

Accedere al portale di Azure.

Creare un'app Web

Dal menu a sinistra scegliere Crea una risorsa>Web>App Web per contenitori.

Configurare le informazioni di base dell'app

Nella scheda Informazioni di base, configurare le impostazioni in base alla tabella seguente. Quindi, selezionare quindi Avanti: Docker.

Impostazione Valore suggerito
Abbonamento Assicurarsi che sia selezionata la sottoscrizione corretta.
Gruppo di risorse selezionare Crea nuovo, digitare myResourceGroup e selezionare OK.
Nome Digitare un nome univoco. L'URL dell'app Web è https://<app-name>.azurewebsites.net, dove <app-name> è il nome dell'app.
Pubblicazione Contenitore Docker
Sistema operativo Windows
Area Europa occidentale
Piano Windows Selezionare Crea nuovo, digitare myAppServicePlan e selezionare OK.

La scheda Informazioni di base avrà un aspetto simile al seguente:

Screenshot della scheda Informazioni di base usata per configurare l'app Web.

Configurare il contenitore di Windows

Nella scheda Docker, configurare il contenitore Windows personalizzato come illustrato nella tabella seguente e quindi selezionare Rivedi e crea.

Impostazione Valore suggerito
Origine immagine Registro Azure Container
Registro Selezionare il registro creato in precedenza.
Image customfontsample
Tag più recente

Completare la creazione dell'app

Selezionare Crea e attendere che Azure crei le risorse necessarie.

Passare all'app Web

Al termine della distribuzione, viene visualizzata una finestra di notifica.

Indica che l'operazione di Azure è stata completata.

  1. Selezionare Vai alla risorsa.

  2. Nella pagina dell'app, selezionare il collegamento in URL.

Verrà aperta la nuova pagina del browser illustrata di seguito:

Mostra la nuova pagina del browser per l'app Web.

Attendere alcuni minuti e riprovare finché non si ottiene la home page con il font desiderato:

Screenshot della home page con il tipo di carattere configurato.

Complimenti. È stata eseguita la migrazione di un'applicazione ASP.NET in Servizio app di Azure in un contenitore Windows.

Visualizzare i log di avvio del contenitore

Il caricamento del contenitore di Windows potrebbe richiedere del tempo. Per visualizzare lo stato di avanzamento, passare all'URL seguente. (Sostituire <app-name> con il nome dell'app.)

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

I log trasmessi sono simili al seguente:

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

Il servizio app di Azure usa la tecnologia dei contenitori Docker per ospitare immagini predefinite e personalizzate. Per visualizzare un elenco di immagini predefinite, eseguire il comando dell'interfaccia della riga di comando di Azure 'az webapp list-runtimes --os linux'. Se queste immagini non soddisfano le proprie esigenze, è possibile creare e distribuire un'immagine personalizzata.

Nota

Il contenitore deve avere come destinazione l'architettura x86-64. ARM64 non è supportato.

In questa esercitazione apprenderai a:

  • Eseguire il push di un'immagine Docker personalizzata in Registro Azure Container.
  • Distribuire l'immagine personalizzata nel Servizio app.
  • Configurare le variabili di ambiente.
  • Eseguire il pull dell'immagine nel Servizio app usando un'identità gestita.
  • Accedere ai log di diagnostica.
  • Abilitare CI/CD da Registro Azure Container al Servizio app.
  • Connettersi al contenitore tramite SSH.

Il completamento di questa esercitazione comporta un piccolo addebito nell'account Azure per il registro contenitori e può comportare costi maggiori se si ospita il contenitore per più di un mese.

Configurare l'ambiente iniziale

Questa esercitazione richiede la versione 2.0.80 o successiva dell'interfaccia della riga di comando di Azure. Se si usa Azure Cloud Shell, la versione più recente è già installata.

  • Installare Docker, che è possibile usare per creare immagini Docker. L'installazione di Docker potrebbe richiedere un riavvio del computer.

Dopo aver installato Docker, aprire una finestra del terminale e verificare che Docker sia installato:

docker --version

Clonare o scaricare l'app di esempio

È possibile ottenere l'esempio per questa esercitazione tramite git clone o download.

Clonare con Git

Clonare il repository di esempio:

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

Assicurarsi di includere l'argomento --config core.autocrlf=input per garantire terminazioni di riga appropriate nei file usati all'interno del contenitore Linux.

Passare quindi alla cartella:

cd docker-django-webapp-linux

Scaricare da GitHub

Invece di usare git clone, è possibile visitare https://github.com/Azure-Samples/docker-django-webapp-linux e selezionare Code>Local>Download ZIP.

Decomprimere il file ZIP in una cartella denominata docker-django-webapp-linux.

Quindi, aprire una finestra del terminale nella cartella docker-django-webapp-linux.

(Facoltativo) Esaminare il file Docker

Si tratta del file nel campione denominato Dockerfile. Descrive l'immagine Docker e contiene istruzioni di configurazione.

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"]
  • Il primo gruppo di comandi installa i requisiti dell'app nell'ambiente.
  • Il secondo gruppo di comandi crea un server SSH per fornire comunicazioni di sicurezza migliorate tra il contenitore e l'host.
  • L'ultima riga, ENTRYPOINT ["init.sh"], richiama init.sh per avviare il servizio SSH e il server Python.

Creare e testare l'immagine in locale

Nota

Docker Hub prevede quote sul numero di pull anonimi per IP e sul numero di pull autenticati per utente gratuito. Se si nota che i pull da Docker Hub sono limitati, provare docker login, se non si è già connessi.

  1. Eseguire il comando seguente per creare l'immagine:

    docker build --tag appsvc-tutorial-custom-image .
    
  2. Testare il funzionamento della build eseguendo il contenitore Docker in locale:

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

    Questo comando docker run specifica la porta con l'argomento -p e include il nome dell'immagine. -it consente di arrestarlo con CTRL+C.

    Suggerimento

    Se si sta usando Windows e viene visualizzato l'errore standard_init_linux.go:211: exec user process caused "no such file or directory", il file init.sh contiene terminazioni di riga CRLF invece di quelle LF previste. Questo errore si verifica se è stato usato git per clonare il repository di esempio ma è stato omesso il parametro --config core.autocrlf=input. In questo caso, clonare di nuovo il repository con l'argomento --config. Questo errore potrebbe essere visualizzato anche se il file init.sh è stato modificato e salvato con le terminazioni CRLF. In questo caso, salvare di nuovo il file solo con le terminazioni LF.

  3. Passare a http://localhost:8000 per verificare che l'app Web e il contenitore funzionino correttamente.

    Screenshot dei risultati del test.

I. Creare un'identità gestita assegnata dall'utente

Il Servizio app può usare un'identità gestita predefinita o un'identità gestita assegnata dall'utente per l'autenticazione con un registro contenitori. In questa esercitazione si userà un'identità gestita assegnata dall'utente.

  1. Eseguire il comando az group create per creare un gruppo di risorse:

    az group create --name msdocs-custom-container-tutorial --location westeurope
    

    È possibile cambiare il valore di --location per specificare un'area nelle vicinanze.

  2. Creare un'identità gestita nel gruppo di risorse:

    az identity create --name myID --resource-group msdocs-custom-container-tutorial
    

II. Creare un registro contenitori

  1. Creare un registro contenitori usando il comando az acr create seguente. Sostituire <registry-name> con un nome univoco da assegnare al registro. Il nome deve contenere solo lettere e numeri e deve essere univoco in tutto Azure.

    az acr create --name <registry-name> --resource-group msdocs-custom-container-tutorial --sku Basic --admin-enabled true
    

    Il parametro --admin-enabled consente di eseguire il push di immagini nel Registro di sistema usando le credenziali amministrative.

  2. Recuperare le credenziali amministrative eseguendo il comando az credential acr show:

    az acr credential show --resource-group msdocs-custom-container-tutorial --name <registry-name>
    

    L'output JSON di questo comando fornisce due password insieme al nome utente del registro.

III. Eseguire il push dell'immagine campione nel Registro Azure Container

In questa sezione si eseguirà il push dell'immagine in Registro Azure Container, che verrà usato dal Servizio app in un secondo momento.

  1. Dal terminale locale in cui è stata compilata l'immagine di esempio, usare il comando docker login per accedere al registro contenitori:

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

    Sostituire <registry-name> e <registry-username> con i valori dei passaggi precedenti. Quando richiesto, digitare una delle password ottenute nella sezione precedente.

    Usare lo stesso nome del registro in tutti i passaggi rimanenti di questa sezione.

  2. Quando l'accesso ha esito positivo, contrassegnare l'immagine Docker locale nel Registro di sistema:

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  3. Usare il comando docker push per eseguire il push dell'immagine nel registro:

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

    La prima volta possono essere necessari alcuni minuti per caricare l'immagine, perché è inclusa l'immagine di base. I caricamenti successivi sono in genere più veloci.

    Mentre si è in attesa, è possibile completare i passaggi della sezione successiva per configurare il servizio app per la distribuzione dal registro.

IV. Autorizzare l'identità gestita per il registro

L'identità gestita creata non dispone ancora dell'autorizzazione per eseguire il pull dal registro contenitori. In questo passaggio, si abiliterà l'autorizzazione.

  1. Recuperare l'ID entità per l'identità gestita:

    principalId=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query principalId --output tsv)
    
  2. Recuperare l'ID risorsa per il registro contenitori:

    registryId=$(az acr show --resource-group msdocs-custom-container-tutorial --name <registry-name> --query id --output tsv)
    
  3. Concedere all'identità gestita l'autorizzazione per accedere al registro contenitori:

    az role assignment create --assignee $principalId --scope $registryId --role "AcrPull"
    

    Per altre informazioni su queste autorizzazioni, vedere Che cos'è il controllo degli accessi in base al ruolo di Azure?.

V. Creare l'app Web

  1. Creare un piano di servizio app usando il comando az appservice plan create:

    az appservice plan create --name myAppServicePlan --resource-group msdocs-custom-container-tutorial --is-linux
    

    Un piano di servizio app corrisponde alla macchina virtuale che ospita l'app Web. Per impostazione predefinita, il comando precedente usa un piano tariffario B1 poco costoso, gratuito per il primo mese. È possibile specificare il livello usando il parametro --sku.

  2. Creare l'app Web con il comando az webapp create:

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

    Sostituire <app-name> con un nome per l'app Web. Il nome deve essere univoco in Azure. Sostituire inoltre <registry-name> con il nome del registro creato nel passaggio precedente.

    Suggerimento

    È possibile recuperare le impostazioni del contenitore dell'app Web in qualsiasi momento con il comando az webapp config container show --name <app-name> --resource-group msdocs-custom-container-tutorial. L'immagine è specificata nella proprietà DOCKER_CUSTOM_IMAGE_NAME. Se l'app Web viene distribuita tramite Azure DevOps o modelli di Azure Resource Manager, l'immagine può essere visualizzata anche in una proprietà denominata LinuxFxVersion. Le due proprietà hanno lo stesso scopo. Se sono presenti entrambe nella configurazione dell'app Web, LinuxFxVersion avrà la precedenza.

VI. Configurare l'app Web

In questo passaggio si configurerà l'app Web come indicato di seguito:

  • Configurare l'app per inviare richieste alla porta 8000. Il contenitore di esempio è in ascolto sulla porta 8000 per le richieste Web.
  • Indicare all'app di usare l'identità gestita per eseguire il pull delle immagini dal registro contenitori.
  • Configurare la distribuzione continua dal registro contenitori (ogni immagine push nel registro attiverà l'app per eseguire il pull della nuova immagine). Questo passaggio non è necessario perché l'app Web esegua il pull dal registro contenitori, ma può informare l'app Web quando viene eseguito il push di una nuova immagine nel registro. Senza di esso, è necessario attivare manualmente un pull di immagine riavviando l'app Web.
  1. Usare az webapp config appsettings set per impostare la variabile di ambiente WEBSITES_PORT come previsto dal codice dell'app:

    az webapp config appsettings set --resource-group msdocs-custom-container-tutorial --name <app-name> --settings WEBSITES_PORT=8000
    

    Sostituire <app-name> con il nome usato nel passaggio precedente.

  2. Abilitare l'identità gestita assegnata dall'utente nell'app Web con il comando az webapp identity assign:

    id=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query id --output tsv)
    az webapp identity assign --resource-group msdocs-custom-container-tutorial --name <app-name> --identities $id
    

    Sostituire <app-name> con il nome usato nel passaggio precedente.

  3. Configurare l'app per eseguire il pull da Registro Azure Container usando le identità gestite.

    appConfig=$(az webapp config show --resource-group msdocs-custom-container-tutorial --name <app-name> --query id --output tsv)
    az resource update --ids $appConfig --set properties.acrUseManagedIdentityCreds=True
    

    Sostituire <app-name> con il nome usato nel passaggio precedente.

  4. Impostare l'ID client usato dall'app Web per eseguire il pull da Registro Azure Container. Questo passaggio non è necessario se si usa l'identità gestita assegnata dal sistema.

    clientId=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query clientId --output tsv)
    az resource update --ids $appConfig --set properties.AcrUserManagedIdentityID=$clientId
    
  5. Abilitare CI/CD nel Servizio app.

    cicdUrl=$(az webapp deployment container config --enable-cd true --name <app-name> --resource-group msdocs-custom-container-tutorial --query CI_CD_URL --output tsv)
    

    CI_CD_URL è un URL generato dal Servizio app. Il Registro di sistema deve usare questo URL per notificare il Servizio app che è stato eseguito il push di un'immagine. In realtà, non crea automaticamente il webhook.

  6. Creare un webhook nel registro contenitori usando il CI_CD_URL ottenuto dall'ultimo passaggio.

    az acr webhook create --name appserviceCD --registry <registry-name> --uri $cicdUrl --actions push --scope appsvc-tutorial-custom-image:latest
    
  7. Per verificare se il webhook è configurato correttamente, eseguirne il ping e verificare se si ottiene una risposta 200 OK.

    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"
    

    Suggerimento

    Per visualizzare tutte le informazioni su tutti gli eventi webhook, rimuovere il parametro --query.

    Se si sta eseguendo lo streaming del log del contenitore, verrà visualizzato un messaggio Starting container for site dopo aver eseguito il ping del webhook, poiché il webhook attiva il riavvio dell'app.

VII. Passare all'app Web

Per testare l'app, passare a https://<app-name>.azurewebsites.net. Sostituire <app-name> con il nome dell'app Web.

La prima volta che si tenta di accedere all'app, l’operazione potrebbe richiedere del tempo, poiché il Servizio app deve eseguire il pull dell'intera immagine dal Registro di sistema. Se il browser raggiunge il timeout, è sufficiente aggiornare la pagina. Una volta eseguito il pull dell'immagine iniziale, i test successivi saranno molto più veloci.

Screenshot dell'app Web in esecuzione in un browser.

VIII. Accedere ai log di diagnostica

Mentre si attende che il Servizio app esegua il pull dell'immagine, è utile monitorare l’attività del Servizio app eseguendo lo streaming dei log del contenitore al terminale.

  1. Attivare la registrazione del contenitore:

    az webapp log config --name <app-name> --resource-group msdocs-custom-container-tutorial --docker-container-logging filesystem
    
  2. Abilitare lo streaming dei log:

    az webapp log tail --name <app-name> --resource-group msdocs-custom-container-tutorial
    

    Se i log di console non sono immediatamente visibili, controllare nuovamente dopo 30 secondi.

    È anche possibile esaminare i file di log nel browser all'indirizzo https://<app-name>.scm.azurewebsites.net/api/logs/docker.

  3. Per arrestare lo streaming dei log in qualsiasi momento, selezionare CTRL+C.

IX. Modificare il codice dell'app e ridistribuirlo

In questa sezione viene apportata una modifica al codice dell'app Web, l'immagine viene ricompilata e quindi ne viene eseguito il push nel registro contenitori. Il servizio app quindi esegue automaticamente il pull dell'immagine aggiornata dal registro per aggiornare l'app Web in esecuzione.

  1. Nella cartella docker-django-webapp-linux locale aprire il file app/templates/app/index.html.

  2. Cambiare il primo elemento HTML in modo che corrisponda al codice seguente.

    <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. Salva le modifiche.

  4. Passare alla cartella docker-django-webapp-linux e ricreare l'immagine:

    docker build --tag appsvc-tutorial-custom-image .
    
  5. Aggiornare il tag dell'immagine a latest:

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

    Sostituire <registry-name> con il nome del registro.

  6. Eseguire il push dell'immagine nel registro:

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  7. Al termine del push dell'immagine, il webhook notifica al Servizio app a proposito del push e il Servizio app tenta di eseguire il pull dell'immagine aggiornata. Attendere alcuni minuti e quindi verificare che l'aggiornamento sia stato distribuito passando a https://<app-name>.azurewebsites.net.

X. Connettersi al contenitore con SSH

SSH consente una comunicazione di sicurezza migliorata tra un contenitore e un client. Per abilitare una connessione SSH al contenitore, è necessario configurare l'immagine personalizzata. Quando il contenitore è in esecuzione, è possibile aprire la connessione SSH.

Configurare il contenitore per SSH

L'app di esempio usata in questa esercitazione ha già la configurazione necessaria nel Dockerfile, che installa il server SSH e imposta anche le credenziali di accesso. Questa sezione è unicamente informativa. Per connettersi al contenitore, passare alla sezione successiva.

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 

Nota

Questa configurazione non consente connessioni esterne al contenitore. SSH è disponibile solo tramite il sito Kudu/SCM. Il sito Kudu/SCM viene autenticato con l'account Azure. root:Docker! non deve essere modificato quando si usa SSH. SCM/KUDU userà le credenziali del portale di Azure. La modifica di questo valore genererà un errore quando si usa SSH.

Il Dockerfile copia anche il file sshd_config nella cartella /etc/ssh/ ed espone la porta 2222 sul contenitore:

COPY sshd_config /etc/ssh/

# ...

EXPOSE 8000 2222

La porta 2222 è una porta interna accessibile dai contenitori nella rete bridge di una rete virtuale privata.

Infine, lo script di ingresso init.sh avvia il server SSH.

#!/bin/bash
service ssh start

Aprire la connessione SSH al contenitore

  1. Passare a https://<app-name>.scm.azurewebsites.net/webssh/host e accedere con l'account Azure. Sostituire <app-name> con il nome dell'app Web.

  2. Quando si esegue l'accesso, si viene reindirizzati a una pagina informativa per l'app Web. Selezionare SSH nella parte superiore della pagina per aprire la shell e usare i comandi.

    Ad esempio, è possibile esaminare i processi in esecuzione all'interno dell'app usando il comando top.

XI. Pulire le risorse

Le risorse create in questo articolo potrebbero comportare costi continui. Per pulire le risorse, è sufficiente eliminare il gruppo di risorse che le contiene:

az group delete --name msdocs-custom-container-tutorial

Passaggi successivi

Contenuto dell'esercitazione:

  • Distribuire un'immagine personalizzata in un registro contenitori privato
  • Distribuire l'immagine personalizzata nel Servizio app
  • Aggiornare e ridistribuire l'immagine
  • Accedere ai log di diagnostica.
  • Connettersi al contenitore tramite SSH.
  • Eseguire il push di un'immagine Docker personalizzata in Registro Azure Container.
  • Distribuire l'immagine personalizzata nel Servizio app.
  • Configurare le variabili di ambiente.
  • Eseguire il pull dell'immagine nel Servizio app usando un'identità gestita.
  • Accedere ai log di diagnostica.
  • Abilitare CI/CD da Registro Azure Container al Servizio app.
  • Connettersi al contenitore tramite SSH.

Nell'esercitazione successiva, si apprenderà come garantire la sicurezza della propria app con un dominio personalizzato e un certificato.

In alternativa, consultare altre risorse: