Montare una condivisione file di Azure in Istanze di Azure Container

Per impostazione predefinita, Istanze di Azure Container è senza stato. Se il contenitore viene riavviato, si arresta in modo anomalo o si arresta, tutto lo stato viene perso. Per rendere persistente lo stato oltre la durata del contenitore, è necessario montare un volume da un archivio esterno. Come illustrato in questo articolo, Istanze di Azure Container possibile montare una condivisione file di Azure creata con File di Azure. File di Azure offre condivisioni file completamente gestite ospitate in Archiviazione di Azure accessibili tramite il protocollo SMB (Server Message Block) standard del settore. L'uso di una condivisione file di Azure con Istanze di Azure Container offre funzionalità di condivisione di file simili all'uso di una condivisione file di Azure con macchine virtuali di Azure.

Limitazioni

  • È possibile montare le condivisioni file di Azure solo in contenitori Linux. Per altre informazioni sulle differenze nel supporto delle funzionalità per i gruppi di contenitori Linux e Windows, vedere la panoramica.
  • Il montaggio del volume di condivisione file di Azure richiede che il contenitore Linux venga eseguito come radice .
  • I montaggi del volume della condivisione file di Azure sono limitati al supporto CIFS.

Nota

Il montaggio di una condivisione File di Azure in un'istanza del contenitore è simile a un montaggio di associazione Docker. Se si monta una condivisione in una directory contenitore in cui sono presenti file o directory, il montaggio nasconde i file o le directory, rendendoli inaccessibili durante l'esecuzione del contenitore.

Importante

Se si distribuiscono gruppi di contenitori in un Rete virtuale di Azure, è necessario aggiungere un endpoint di servizio all'account di archiviazione di Azure.

Creare una condivisione file di Azure

Prima di usare una condivisione file di Azure con Istanze di Azure Container è necessario creare la condivisione. Eseguire questo script per creare un account di archiviazione per ospitare la condivisione file e la condivisione in sé. Il nome dell'account di archiviazione deve essere globalmente univoco, quindi lo script aggiunge un valore casuale alla stringa di base.

# Change these four parameters as needed
ACI_PERS_RESOURCE_GROUP=myResourceGroup
ACI_PERS_STORAGE_ACCOUNT_NAME=mystorageaccount$RANDOM
ACI_PERS_LOCATION=eastus
ACI_PERS_SHARE_NAME=acishare

# Create the storage account with the parameters
az storage account create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --location $ACI_PERS_LOCATION \
    --sku Standard_LRS

# Create the file share
az storage share create \
  --name $ACI_PERS_SHARE_NAME \
  --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME

Ottenere le credenziali di archiviazione

Per montare una condivisione file di Azure come volume in Istanze di Azure Container sono necessari tre valori: il nome dell'account di archiviazione, il nome della condivisione e la chiave di accesso alle risorse di archiviazione.

  • Nome dell'account di archiviazione : se è stato usato lo script precedente, il nome dell'account di archiviazione è stato archiviato nella $ACI_PERS_STORAGE_ACCOUNT_NAME variabile . Per visualizzare il nome dell'account, digitare:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Nome condivisione : questo valore è già noto (definito come acishare nello script precedente)

  • Chiave dell'account di archiviazione : questo valore è disponibile usando il comando seguente:

    STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv)
    echo $STORAGE_KEY
    

Distribuire un contenitore e un volume di montaggio - Interfaccia della riga di comando

Per montare una condivisione file di Azure come volume in un contenitore usando l'interfaccia della riga di comando di Azure, specificare la condivisione e il punto di montaggio del volume quando si crea il contenitore con az container create. Se sono stati seguiti i passaggi precedenti, è possibile montare la condivisione creata in precedenza usando il comando seguente per creare un contenitore:

az container create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name hellofiles \
    --image mcr.microsoft.com/azuredocs/aci-hellofiles \
    --dns-name-label aci-demo \
    --ports 80 \
    --azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --azure-file-volume-account-key $STORAGE_KEY \
    --azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
    --azure-file-volume-mount-path /aci/logs/

Il valore --dns-name-label deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza di contenitore. Aggiornare il valore nel comando precedente se viene visualizzato un messaggio di errore relativo all'etichetta del nome DNS quando si esegue il comando.

Gestire i file nel volume montato

Dopo l'avvio del contenitore, è possibile usare la semplice app Web distribuita tramite l'immagine Microsoft aci-hellofiles per creare piccoli file di testo nella condivisione file di Azure nel percorso di montaggio specificato. Ottenere il nome di dominio completo (FQDN) dell'app Web con il comando az container show:

az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
  --name hellofiles --query ipAddress.fqdn --output tsv

Dopo aver salvato il testo usando l'app, puoi usare il portale di Azure o uno strumento come il Microsoft Azure Storage Explorer per recuperare ed esaminare il file o i file scritti nella condivisione file.

Distribuire il contenitore e montare il volume - YAML

È anche possibile distribuire un gruppo di contenitori e montare un volume in un contenitore con l'interfaccia della riga di comando di Azure e un modello YAML. La distribuzione in base al modello YAML è un metodo preferito quando si distribuiscono gruppi di contenitori costituiti da più contenitori.

Il modello YAML seguente definisce un gruppo di contenitori con un contenitore creato con l'immagine aci-hellofiles. Il contenitore monta la condivisione file di Azure acishare creata in precedenza come volume. Se indicato, immettere il nome e la chiave di archiviazione per l'account di archiviazione che ospita la condivisione file.

Come nell'esempio dell'interfaccia della riga di comando, il dnsNameLabel valore deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza del contenitore. Aggiornare il valore nel file YAML, se necessario.

apiVersion: '2019-12-01'
location: eastus
name: file-share-demo
properties:
  containers:
  - name: hellofiles
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-hellofiles
      ports:
      - port: 80
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /aci/logs/
        name: filesharevolume
  osType: Linux
  restartPolicy: Always
  ipAddress:
    type: Public
    ports:
      - port: 80
    dnsNameLabel: aci-demo
  volumes:
  - name: filesharevolume
    azureFile:
      sharename: acishare
      storageAccountName: <Storage account name>
      storageAccountKey: <Storage account key>
tags: {}
type: Microsoft.ContainerInstance/containerGroups

Per eseguire la distribuzione con il modello YAML, salvare il codice YAML precedente in un file denominato deploy-aci.yaml, quindi eseguire il comando az container create con il parametro --file:

# Deploy with YAML template
az container create --resource-group myResourceGroup --file deploy-aci.yaml

Distribuire un contenitore e un volume di montaggio - Resource Manager

Oltre alla distribuzione dell'interfaccia della riga di comando e YAML, è possibile distribuire un gruppo di contenitori e montare un volume in un contenitore usando un modello di azure Resource Manager.

Popolare innanzitutto la matrice volumes nella sezione properties del gruppo di contenitori del modello.

Quindi, per ogni contenitore in cui si vuole montare il volume, popolare la volumeMounts matrice nella properties sezione della definizione del contenitore.

Il modello di Resource Manager seguente definisce un gruppo di contenitori con un contenitore creato con l'immagineaci-hellofiles. Il contenitore monta la condivisione file di Azure acishare creata in precedenza come volume. Se indicato, immettere il nome e la chiave di archiviazione per l'account di archiviazione che ospita la condivisione file.

Come negli esempi precedenti, il dnsNameLabel valore deve essere univoco all'interno dell'area di Azure in cui si crea l'istanza del contenitore. Aggiornare il valore nel modello, se necessario.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "hellofiles",
    "container1image": "mcr.microsoft.com/azuredocs/aci-hellofiles"
  },
  "resources": [
    {
      "name": "file-share-demo",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "/aci/logs"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ],
          "dnsNameLabel": "aci-demo"
        },
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
                "shareName": "acishare",
                "storageAccountName": "<Storage account name>",
                "storageAccountKey": "<Storage account key>"
            }
          }
        ]
      }
    }
  ]
}

Per eseguire la distribuzione con il modello di Resource Manager, salvare il codice JSON precedente in un file denominato deploy-aci.json, quindi eseguire il comando az deployment group create con il --template-file parametro :

# Deploy with Resource Manager template
az deployment group create --resource-group myResourceGroup --template-file deploy-aci.json

Montare più volumi

Per montare più volumi in un'istanza del contenitore, è necessario eseguire la distribuzione usando un modello di Azure Resource Manager, un file YAML o un altro metodo programmatico. Per usare un modello o un file YAML, specificare i dettagli della condivisione e definire i volumi popolando la volumes matrice nella properties sezione del file.

Ad esempio, se sono state create due condivisioni di File di Azure denominate share1 e share2 nell'account di archiviazione myStorageAccount, la matrice volumes in un modello di Resource Manager sarà simile a quanto segue:

"volumes": [{
  "name": "myvolume1",
  "azureFile": {
    "shareName": "share1",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
},
{
  "name": "myvolume2",
  "azureFile": {
    "shareName": "share2",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
}]

Successivamente, per ogni contenitore del relativo gruppo in cui si desidera montare i volumi, inserire la matrice volumeMounts nella sezione properties della definizione del contenitore. Ad esempio, in questo modo vengono montati i due volumi, myvolume1 e myvolume2, definiti in precedenza:

"volumeMounts": [{
  "name": "myvolume1",
  "mountPath": "/mnt/share1/"
},
{
  "name": "myvolume2",
  "mountPath": "/mnt/share2/"
}]

Passaggi successivi

Informazioni su come montare altri tipi di volume in Istanze di Azure Container: