Montar um compartilhamento de arquivos do Azure em Instâncias de Contêiner do Azure

Por padrão, as Instâncias de Contêiner do Azure não têm estado. Se o contêiner for reiniciado, parar ou falhar, todo o seu estado será perdido. Para persistir o estado além do tempo de vida do contêiner, é necessário montar um volume em um repositório externo. Conforme mostrado neste artigo, as Instâncias de Contêiner do Azure podem montar um compartilhamento de arquivos do Azure criado com os Arquivos do Azure. Os Arquivos do Azure oferecem compartilhamentos de arquivos totalmente gerenciados hospedados no Armazenamento do Microsoft Azure que são acessíveis por meio do protocolo SMB padrão do setor. Usar um compartilhamento de arquivos do Azure com Instâncias de Contêiner do Azure fornece recursos de compartilhamento de arquivos semelhantes ao uso de um compartilhamento de arquivos do Azure com máquinas virtuais do Azure.

Limitações

  • O compartilhamento de Arquivos do Azure só pode ser montado para contêineres do Linux. Examine mais a fundo as diferenças no suporte a recursos para grupos de contêineres do Linux e do Windows na visão geral.
  • A montagem de volume do compartilhamento de arquivo do Azure requer a execução do contêiner do Linux como raiz.
  • As montagens de volume de compartilhamento de Arquivos do Azure são limitadas ao suporte a CIFS.

Observação

A montagem de um compartilhamento de Arquivos do Azure em uma instância de contêiner é semelhante a um bind mount do Docker. Se você montar um compartilhamento em um diretório de contêiner no qual existem arquivos ou diretórios, a montagem obscurece arquivos ou diretórios, tornando-os inacessíveis enquanto o contêiner é executado.

Importante

Se você estiver implantando grupos de contêineres em uma Rede Virtual do Azure, deverá adicionar um ponto de extremidade de serviço à sua Conta de Armazenamento do Azure.

Criar um compartilhamento de arquivo do Azure

Antes de usar um compartilhamento de arquivos do Azure com Instâncias de Contêiner do Azure, você deve criá-lo. Execute o seguinte script para criar uma conta de armazenamento para hospedar o compartilhamento de arquivos e o próprio compartilhamento. O nome da conta de armazenamento deve ser globalmente exclusivo para que o script adicione um valor aleatório à cadeia de caracteres de 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

Obter credenciais de armazenamento

Para montar um compartilhamento de arquivos do Azure como um volume nas Instâncias de Contêiner do Azure, você precisa de três valores: o nome da conta de armazenamento, o nome do compartilhamento e a chave de acesso de armazenamento.

  • Nome da conta de armazenamento - se você tiver usado o script acima, o nome da conta de armazenamento foi armazenado na variável $ACI_PERS_STORAGE_ACCOUNT_NAME. Para ver o nome da conta, digite:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Nome do compartilhamento - esse valor já é conhecido (definido como acishare no script anterior)

  • Chave de conta de armazenamento - esse valor pode ser encontrado usando o seguinte comando:

    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
    

Implantar o contêiner e montar o volume – CLI

Para montar um compartilhamento de arquivos do Azure como volume em um contêiner usando a CLI do Azure, especifique o compartilhamento e o ponto de montagem do volume ao criar o contêiner com az container create. Se você tiver seguido as etapas anteriores, será possível montar o compartilhamento já criado usando o seguinte comando para criar um contêiner:

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/

O valor --dns-name-label precisa ser exclusivo dentro da região do Azure quando você criar a instância de contêiner. Atualize o valor no comando anterior se você receber uma mensagem de erro do rótulo do nome DNS ao executar o comando.

Gerenciar arquivos no volume montado

Depois que o contêiner for iniciado, você poderá usar o aplicativo Web simples implantado por meio da imagem Microsoft aci-hellofiles para criar pequenos arquivos de texto no compartilhamento de arquivos do Azure no caminho de montagem especificado. Obtenha o FQDN (nome de domínio totalmente qualificado) do aplicativo Web com o comando az container show:

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

Após salvar o texto usando o aplicativo, use o portal do Azure ou uma ferramenta como o Gerenciador de Armazenamento do Microsoft Azure para recuperar e inspecionar o arquivo gravado no compartilhamento de arquivos.

Implantar o contêiner e montar o volume – YAML

Você também pode implantar um grupo de contêineres e montar um volume em um contêiner com a CLI do Azure e um modelo YAML. A implantação pelo modelo YAML é um método preferencial ao implantar grupos de contêineres que consistem em vários contêineres.

O modelo YAML a seguir define um grupo de contêineres com um contêiner criado com a imagem aci-hellofiles. O contêiner monta o compartilhamento de arquivos do Azure acishare criado anteriormente como um volume. Quando indicado, insira o nome e a chave de armazenamento para a conta de armazenamento que hospeda o compartilhamento de arquivos.

Como no exemplo da CLI, o valor dnsNameLabel precisa ser exclusivo dentro da região do Azure em que você criar a instância de contêiner. Atualize o valor no arquivo YAML, se necessário.

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

Para implantar com o modelo YAML, salve o YAML anterior em um arquivo nomeado deploy-aci.yaml e, em seguida, execute o comando az container create com o parâmetro --file:

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

Implantar contêiner e montar volume – Resource Manager

Além da implantação da CLI e YAML, é possível implantar um grupo de contêineres e montar um volume em um contêiner usando um modelo do Resource Manager.

Primeiro, popule a matriz volumes na seção properties do grupo de contêineres do modelo.

Em seguida, para cada contêiner em que desejar montar o volume, preencha a matriz volumeMounts na seção properties da definição de contêiner.

O modelo do Resource Manager a seguir define um grupo de contêineres com um contêiner criado com a imagem aci-hellofiles. O contêiner monta o compartilhamento de arquivos do Azure acishare criado anteriormente como um volume. Quando indicado, insira o nome e a chave de armazenamento para a conta de armazenamento que hospeda o compartilhamento de arquivos.

Como nos exemplos anteriores, o valor dnsNameLabel deve ser exclusivo na região do Azure em que você criar a instância de contêiner. Atualize o valor no modelo, se necessário.

{
  "$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>"
            }
          }
        ]
      }
    }
  ]
}

Para implantar com o modelo do Resource Manager, salve o JSON anterior em um arquivo chamado deploy-aci.json e execute o comando az deployment group create com o parâmetro --template-file:

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

Montar vários volumes

Para montar vários volumes em uma instância de contêiner, você deve implantar usando um modelo do Azure Resource Manager, um arquivo YAML ou outro método programático. Para usar um modelo ou arquivo YAML, forneça os detalhes de compartilhamento e defina os volumes preenchendo a matriz volumes na seção properties do arquivo.

Por exemplo, se você criou dois compartilhamentos de Arquivos do Azure denominados share1 e share2 na conta de armazenamento myStorageAccount, a matriz volumes em um modelo do Resource Manager teria aparência semelhante a:

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

Em seguida, para cada contêiner do grupo de contêineres no qual você deseja montar os volumes, popule a matriz volumeMounts na seção properties da definição de contêiner. Por exemplo, isso monta os dois volumes, myvolume1 e myvolume2, definidos anteriormente:

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

Próximas etapas

Saiba como montar outros tipos de volume em Instâncias de Contêiner do Azure: