Como criar seu primeiro aplicativo de contêiner do Service Fabric no WindowsCreate your first Service Fabric container application on Windows

Executar um aplicativo existente em um contêiner do Windows em um cluster do Service Fabric não requer alterações no seu aplicativo.Running an existing application in a Windows container on a Service Fabric cluster doesn't require any changes to your application. Este artigo mostra como criar uma imagem do Docker que contém um aplicativo Web do Python Flask e como implantá-lo em um cluster do Service Fabric em execução no seu computador local.This article walks you through creating a Docker image containing a Python Flask web application and deploying it to a Service Fabric cluster running on your local machine. Você também compartilhará seu aplicativo em contêineres pelo Registro de Contêiner do Azure.You will also share your containerized application through Azure Container Registry. Este artigo pressupõe uma compreensão básica sobre o Docker.This article assumes a basic understanding of Docker. Saiba mais sobre o Docker lendo a Visão geral de Docker.You can learn about Docker by reading the Docker Overview.

Observação

Este artigo se aplica a um ambiente de desenvolvimento do Windows.This article applies to a Windows development environment. O tempo de execução do cluster do Service Fabric e o tempo de execução do Docker devem estar em execução no mesmo sistema operacional.The Service Fabric cluster runtime and the Docker runtime must be running on the same OS. Você não pode executar contêineres do Windows em um cluster do Linux.You cannot run Windows containers on a Linux cluster.

Observação

Este artigo foi atualizado para usar o novo módulo Az do Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Você ainda pode usar o módulo AzureRM, que continuará a receber as correções de bugs até pelo menos dezembro de 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Para saber mais sobre o novo módulo Az e a compatibilidade com o AzureRM, confira Apresentação do novo módulo Az do Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Para obter instruções de instalação do módulo Az, confira Instalar o Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Pré-requisitosPrerequisites

  • Um computador de desenvolvimento executando:A development computer running:

  • Um cluster do Windows com três ou mais nós em execução no Windows Server com contêineres.A Windows cluster with three or more nodes running on Windows Server with Containers.

    Neste artigo, a versão (build) do Windows Server com contêineres em execução em nós do cluster deve corresponder em seu computador de desenvolvimento.For this article, the version (build) of Windows Server with Containers running on your cluster nodes must match that on your development machine. Isso ocorre porque você compila a imagem do docker em seu computador de desenvolvimento e há restrições de compatibilidade entre versões do sistema operacional do contêiner e o sistema operacional do host no qual ele foi implantado.This is because you build the docker image on your development machine and there are compatibility constraints between versions of the container OS and the host OS on which it is deployed. Para obter mais informações, consulte Compatibilidade do sistema operacional do contêiner e do sistema operacional do host do Windows Server.For more information, see Windows Server container OS and host OS compatibility.

Para determinar a versão do Windows Server com contêineres que você precisa para seu cluster, execute o comando ver em um prompt de comando do Windows no computador de desenvolvimento:To determine the version of Windows Server with Containers you need for your cluster, run the ver command from a Windows command prompt on your development machine:

  • Se a versão contém x.x.14323.x, selecione WindowsServer 2016-Datacenter-with-Containers para o sistema operacional ao criar um cluster.If the version contains x.x.14323.x, then select WindowsServer 2016-Datacenter-with-Containers for the operating system when creating a cluster.

    • Se a versão contém x.x.16299.x, selecione WindowsServerSemiAnnual Datacenter-Core-1709-with-Containers para o sistema operacional ao criar um cluster.If the version contains x.x.16299.x, then select WindowsServerSemiAnnual Datacenter-Core-1709-with-Containers for the operating system when creating a cluster.
  • Um registro no Registro de Contêiner do Azure - Crie um registro de contêiner em sua assinatura do Azure.A registry in Azure Container Registry - Create a container registry in your Azure subscription.

Observação

A implantação de contêineres em um cluster do Service Fabric em execução no Windows 10 tem suporte.Deploying containers to a Service Fabric cluster running on Windows 10 is supported. Consulte este artigo para obter informações sobre como configurar o Windows 10 para executar contêineres do Windows.See this article for information on how to configure Windows 10 to run Windows containers.

Observação

O Service Fabric versões 6.2 e posteriores dá suporte para implantação de contêineres em clusters em execução no Windows Server versão 1709.Service Fabric versions 6.2 and later support deploying containers to clusters running on Windows Server version 1709.

Defina o contêiner DockerDefine the Docker container

Crie uma imagem com base na imagem do Python localizada no Hub do Docker.Build an image based on the Python image located on Docker Hub.

Especifique o contêiner do Docker em um Dockerfile.Specify your Docker container in a Dockerfile. O Dockerfile é composto por instruções para configurar o ambiente do seu contêiner, carregar o aplicativo que você deseja executar e mapear portas.The Dockerfile consists of instructions for setting up the environment inside your container, loading the application you want to run, and mapping ports. O Dockerfile é a entrada para o comando docker build, que cria a imagem.The Dockerfile is the input to the docker build command, which creates the image.

Crie um diretório vazio e crie o arquivo Dockerfile (sem extensão de arquivo).Create an empty directory and create the file Dockerfile (with no file extension). Adicione o seguinte ao Dockerfile e salve as alterações:Add the following to Dockerfile and save your changes:

# Use an official Python runtime as a base image
FROM python:2.7-windowsservercore

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

Leia a referência do Dockerfile para saber mais informações.Read the Dockerfile reference for more information.

Criar um aplicativo Web básicoCreate a basic web application

Crie um aplicativo Web Flask que escuta a porta 80 retornar Hello World!.Create a Flask web application listening on port 80 that returns Hello World!. No mesmo diretório, crie o arquivo requirements.txt.In the same directory, create the file requirements.txt. Adicione o seguinte e salve as alterações:Add the following and save your changes:

Flask

Crie também o arquivo app.py e adicione o seguinte snippet:Also create the app.py file and add the following snippet:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():

    return 'Hello World!'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

Criar a imagemBuild the image

Execute o comando docker build para criar a imagem que executa o seu aplicativo web.Run the docker build command to create the image that runs your web application. Abra uma janela do PowerShell e acesse o diretório que contém o Dockerfile.Open a PowerShell window and navigate to the directory containing the Dockerfile. Execute o comando a seguir:Run the following command:

docker build -t helloworldapp .

Esse comando cria a nova imagem usando as instruções no seu Dockerfile de nomeando (marcação -t) a imagem helloworldapp.This command builds the new image using the instructions in your Dockerfile, naming (-t tagging) the image helloworldapp. Para criar uma imagem de contêiner, primeiro a imagem base é baixada do Hub do Docker ao qual o aplicativo foi adicionado.To build a container image, the base image is first downloaded down from Docker Hub to which the application is added.

Depois de concluir o comando de compilação, execute o comando docker images para ver informações sobre a nova imagem:Once the build command completes, run the docker images command to see information on the new image:

$ docker images

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
helloworldapp                 latest              8ce25f5d6a79        2 minutes ago       10.4 GB

Executar o aplicativo localmenteRun the application locally

Verifique a imagem localmente antes de enviá-la ao registro de contêiner.Verify your image locally before pushing it the container registry.

Executar o aplicativo:Run the application:

docker run -d --name my-web-site helloworldapp

name fornece um nome para o contêiner em execução (em vez da ID do contêiner).name gives a name to the running container (instead of the container ID).

Depois que o contêiner iniciar, localize seu endereço IP para que você pode se conectar ao seu contêiner em execução em um navegador:Once the container starts, find its IP address so that you can connect to your running container from a browser:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" my-web-site

Se esse comando não retorna nada, execute o seguinte comando e inspecione o elemento NetworkSettings->Networks para ver o endereço IP:If that command does not return anything, run the following command and inspect the NetworkSettings->Networks element for the IP address:

docker inspect my-web-site

Conectar-se ao contêiner em execução.Connect to the running container. Abra um navegador da web apontando para o endereço IP retornado, por exemplo "http://172.31.194.61".Open a web browser pointing to the IP address returned, for example "http://172.31.194.61". Você deve ver o cabeçalho "Olá, Mundo!"You should see the heading "Hello World!" ser exibido no navegador.display in the browser.

Para interromper o contêiner, execute:To stop your container, run:

docker stop my-web-site

Exclua o contêiner do seu computador de desenvolvimento:Delete the container from your development machine:

docker rm my-web-site

Enviar a imagem para o registro de contêinerPush the image to the container registry

Depois de verificar que o contêiner é executado na máquina de desenvolvimento, envie a imagem para seu registro no Registro de Contêiner do Azure.After you verify that the container runs on your development machine, push the image to your registry in Azure Container Registry.

Execute docker login para entrar no seu registro de contêiner com sua credenciais de registro.Run docker login to sign in to your container registry with your registry credentials.

O seguinte exemplo passa a ID e senha de uma entidade de serviço do Azure Active Directory.The following example passes the ID and password of an Azure Active Directory service principal. Por exemplo, você pode atribuir uma entidade de serviço ao registro para um cenário de automação.For example, you might have assigned a service principal to your registry for an automation scenario. Ou, você pode entrar usando seu nome de registro de usuário e senha.Or, you could sign in using your registry username and password.

docker login myregistry.azurecr.io -u xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -p myPassword

O comando a seguir cria uma marca ou alias imagem, com um caminho totalmente qualificado para o registro.The following command creates a tag, or alias, of the image, with a fully qualified path to your registry. Este exemplo coloca a imagem no namespace samples para evitar confusão na raiz do registro.This example places the image in the samples namespace to avoid clutter in the root of the registry.

docker tag helloworldapp myregistry.azurecr.io/samples/helloworldapp

Enviar a imagem para o eu registro de contêiner:Push the image to your container registry:

docker push myregistry.azurecr.io/samples/helloworldapp

Crie o serviço em contêineres no Visual StudioCreate the containerized service in Visual Studio

As ferramentas e o SDK do Service Fabric oferecem um modelo de serviço para ajudar você a criar um aplicativo em contêineres.The Service Fabric SDK and tools provide a service template to help you create a containerized application.

  1. Inicie o Visual Studio.Start Visual Studio. Selecione Arquivo > Novo > Projeto.Select File > New > Project.
  2. Selecione Aplicativo do Service Fabric, nomeie-o como "MyFirstContainer" e clique em OK.Select Service Fabric application, name it "MyFirstContainer", and click OK.
  3. Selecione Contêiner na lista de modelos de serviço.Select Container from the list of service templates.
  4. Em Nome da imagem insira "myregistry.azurecr.io/samples/helloworldapp", a imagem é enviada para o seu repositório de contêiner.In Image Name enter "myregistry.azurecr.io/samples/helloworldapp", the image you pushed to your container repository.
  5. Dê um nome ao seu serviço e clique em OK.Give your service a name, and click OK.

Configurar a comunicaçãoConfigure communication

O serviço em contêineres precisa de um ponto de extremidade para comunicação.The containerized service needs an endpoint for communication. Adicione um elemento Endpoint com o protocolo, a porta e o tipo ao arquivo ServiceManifest.xml.Add an Endpoint element with the protocol, port, and type to the ServiceManifest.xml file. Neste exemplo, uma porta fixa 8081 é usada.In this example, a fixed port 8081 is used. Se nenhuma porta for especificada, uma porta aleatória do intervalo de portas de aplicativo é escolhida.If no port is specified, a random port from the application port range is chosen.

<Resources>
  <Endpoints>
    <Endpoint Name="Guest1TypeEndpoint" UriScheme="http" Port="8081" Protocol="http"/>
  </Endpoints>
</Resources>

Observação

Endpoints adicionais para um serviço podem ser adicionados declarando elementos EndPoint adicionais com valores de propriedade aplicáveis.Additional Endpoints for a service can be added by declaring additional EndPoint elements with applicable property values. Cada porta só pode declarar um valor de protocolo.Each Port can only declare one protocol value.

Definindo um ponto de extremidade, o Service Fabric publica o ponto de extremidade para o Serviço de nomeação.By defining an endpoint, Service Fabric publishes the endpoint to the Naming service. Outros serviços em execução no cluster podem resolver este contêiner.Other services running in the cluster can resolve this container. Você também pode executar a comunicação de contêiner para contêiner usando o proxy reverso.You can also perform container-to-container communication using the reverse proxy. A comunicação é realizada fornecendo a porta de escuta de proxy reverso HTTP e o nome dos serviços com os quais você deseja se comunicar como variáveis de ambiente.Communication is performed by providing the reverse proxy HTTP listening port and the name of the services that you want to communicate with as environment variables.

O serviço está ouvindo em uma porta específica (8081 neste exemplo).The service is listening on a specific port (8081 in this example). Quando o aplicativo for implantado para um cluster no Azure, o cluster e o aplicativo executam atrás de um balanceador de carga do Azure.When the application deploys to a cluster in Azure, both the cluster and the application run behind an Azure load balancer. A porta do aplicativo deve estar aberta no balanceador de carga do Microsoft Azure para que o tráfego de entrada pode obter por meio para o serviço.The application port must be open in the Azure load balancer so that inbound traffic can get through to the service. Você pode abrir essa porta no balanceador de carga do Microsoft Azure usando um script do PowerShell ou o portal do Azure.You can open this port in the Azure load balancer using a PowerShell script or in the Azure portal.

Configurar e definir as variáveis de ambienteConfigure and set environment variables

Variáveis de ambiente podem ser especificadas para cada pacote de códigos no manifesto do serviço.Environment variables can be specified for each code package in the service manifest. Esse recurso está disponível para todos os serviços, independentemente de eles serem implantados como contêineres ou processos ou executáveis convidados.This feature is available for all services irrespective of whether they are deployed as containers or processes or guest executables. Você pode substituir valores de variáveis de ambiente no manifesto do aplicativo ou especificá-los durante a implantação como parâmetros de aplicativo.You can override environment variable values in the application manifest or specify them during deployment as application parameters.

O snippet XML do manifesto do serviço a seguir mostra um exemplo de como especificar variáveis de ambiente para um pacote de códigos:The following service manifest XML snippet shows an example of how to specify environment variables for a code package:

<CodePackage Name="Code" Version="1.0.0">
  ...
  <EnvironmentVariables>
    <EnvironmentVariable Name="HttpGatewayPort" Value=""/>    
  </EnvironmentVariables>
</CodePackage>

Essas variáveis de ambiente podem ser substituídas no manifesto do aplicativo:These environment variables can be overridden in the application manifest:

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="Guest1Pkg" ServiceManifestVersion="1.0.0" />
  <EnvironmentOverrides CodePackageRef="FrontendService.Code">
    <EnvironmentVariable Name="HttpGatewayPort" Value="19080"/>
  </EnvironmentOverrides>
  ...
</ServiceManifestImport>

Configurar mapeamento de porta para host e descoberta de contêiner para contêinerConfigure container port-to-host port mapping and container-to-container discovery

Configure uma porta de host usada para se comunicar com o contêiner.Configure a host port used to communicate with the container. A associação de porta mapeia a porta na qual o serviço está escutando dentro do contêiner para uma porta no host.The port binding maps the port on which the service is listening inside the container to a port on the host. Adicionar um elemento PortBinding no elemento ContainerHostPolicies do arquivo ApplicationManifest.xml.Add a PortBinding element in ContainerHostPolicies element of the ApplicationManifest.xml file. Para este artigo, ContainerPort é 80 (o contêiner expõe a porta 80, conforme especificado no Dockerfile) e EndpointRef é "Guest1TypeEndpoint" (o ponto de extremidade definido anteriormente no manifesto do serviço).For this article, ContainerPort is 80 (the container exposes port 80, as specified in the Dockerfile) and EndpointRef is "Guest1TypeEndpoint" (the endpoint previously defined in the service manifest). As solicitações de entrada para o serviço na porta 8081 são mapeadas para a porta 80 no contêiner.Incoming requests to the service on port 8081 are mapped to port 80 on the container.

<ServiceManifestImport>
    ...
    <Policies>
        <ContainerHostPolicies CodePackageRef="Code">
            <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
        </ContainerHostPolicies>
    </Policies>
    ...
</ServiceManifestImport>

Observação

PortBindings adicionais para um serviço podem ser adicionados, declarando elementos PortBinding adicionais com valores de propriedade aplicável.Additional PortBindings for a service can be added by declaring additional PortBinding elements with applicable property values.

Definir autenticação do registro de contêinerConfigure container registry authentication

Configurar a autenticação de registro de contêiner adicionando RepositoryCredentials a ContainerHostPolicies do arquivo ApplicationManifest.xml.Configure container registry authentication by adding RepositoryCredentials to ContainerHostPolicies of the ApplicationManifest.xml file. Adicione a conta e a senha para o registro de contêiner myregistry.azurecr.io, o que permite ao serviço baixar a imagem de contêiner do repositório.Add the account and password for the myregistry.azurecr.io container registry, which allows the service to download the container image from the repository.

<ServiceManifestImport>
    ...
    <Policies>
        <ContainerHostPolicies CodePackageRef="Code">
            <RepositoryCredentials AccountName="myregistry" Password="=P==/==/=8=/=+u4lyOB=+=nWzEeRfF=" PasswordEncrypted="false"/>
            <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
        </ContainerHostPolicies>
    </Policies>
    ...
</ServiceManifestImport>

É recomendável que você criptografe a senha do repositório usando um certificado de criptografia que é implantado em todos os nós do cluster.We recommend that you encrypt the repository password by using an encipherment certificate that's deployed to all nodes of the cluster. Quando o Service Fabric implanta o pacote de serviço para o cluster, o certificado de criptografia é usado para descriptografar o texto cifrado.When Service Fabric deploys the service package to the cluster, the encipherment certificate is used to decrypt the cipher text. O cmdlet Invoke-ServiceFabricEncryptText é usado para criar o texto cifrado para a senha, que é adicionado ao arquivo ApplicationManifest.xml.The Invoke-ServiceFabricEncryptText cmdlet is used to create the cipher text for the password, which is added to the ApplicationManifest.xml file.

O script a seguir cria um novo certificado autoassinado e o exporta para um arquivo PFX.The following script creates a new self-signed certificate and exports it to a PFX file. O certificado é importado para um cofre de chaves existente e, em seguida, implantado para o cluster do Service Fabric.The certificate is imported into an existing key vault and then deployed to the Service Fabric cluster.

# Variables.
$certpwd = ConvertTo-SecureString -String "Pa$$word321!" -Force -AsPlainText
$filepath = "C:\MyCertificates\dataenciphermentcert.pfx"
$subjectname = "dataencipherment"
$vaultname = "mykeyvault"
$certificateName = "dataenciphermentcert"
$groupname="myclustergroup"
$clustername = "mycluster"

$subscriptionId = "subscription ID"

Login-AzAccount

Select-AzSubscription -SubscriptionId $subscriptionId

# Create a self signed cert, export to PFX file.
New-SelfSignedCertificate -Type DocumentEncryptionCert -KeyUsage DataEncipherment -Subject $subjectname -Provider 'Microsoft Enhanced Cryptographic Provider v1.0' `
| Export-PfxCertificate -FilePath $filepath -Password $certpwd

# Import the certificate to an existing key vault. The key vault must be enabled for deployment.
$cer = Import-AzureKeyVaultCertificate -VaultName $vaultName -Name $certificateName -FilePath $filepath -Password $certpwd

Set-AzKeyVaultAccessPolicy -VaultName $vaultName -ResourceGroupName $groupname -EnabledForDeployment
Add-AzServiceFabricApplicationCertificate -ResourceGroupName $groupname -Name $clustername -SecretIdentifier $cer.SecretId

Criptografar a senha usando o cmdlet Invoke-ServiceFabricEncryptText.Encrypt the password using the Invoke-ServiceFabricEncryptText cmdlet.

$text = "=P==/==/=8=/=+u4lyOB=+=nWzEeRfF="
Invoke-ServiceFabricEncryptText -CertStore -CertThumbprint $cer.Thumbprint -Text $text -StoreLocation Local -StoreName My

Substitua a senha com o texto codificado retornado pelo cmdlet Invoke-ServiceFabricEncryptText e defina PasswordEncrypted como "true".Replace the password with the cipher text returned by the Invoke-ServiceFabricEncryptText cmdlet and set PasswordEncrypted to "true".

<ServiceManifestImport>
    ...
    <Policies>
        <ContainerHostPolicies CodePackageRef="Code">
            <RepositoryCredentials AccountName="myregistry" Password="MIIB6QYJKoZIhvcNAQcDoIIB2jCCAdYCAQAxggFRMIIBTQIBADA1MCExHzAdBgNVBAMMFnJ5YW53aWRhdGFlbmNpcGhlcm1lbnQCEFfyjOX/17S6RIoSjA6UZ1QwDQYJKoZIhvcNAQEHMAAEg
gEAS7oqxvoz8i6+8zULhDzFpBpOTLU+c2mhBdqXpkLwVfcmWUNA82rEWG57Vl1jZXe7J9BkW9ly4xhU8BbARkZHLEuKqg0saTrTHsMBQ6KMQDotSdU8m8Y2BR5Y100wRjvVx3y5+iNYuy/JmM
gSrNyyMQ/45HfMuVb5B4rwnuP8PAkXNT9VLbPeqAfxsMkYg+vGCDEtd8m+bX/7Xgp/kfwxymOuUCrq/YmSwe9QTG3pBri7Hq1K3zEpX4FH/7W2Zb4o3fBAQ+FuxH4nFjFNoYG29inL0bKEcTX
yNZNKrvhdM3n1Uk/8W2Hr62FQ33HgeFR1yxQjLsUu800PrYcR5tLfyTB8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBBybgM5NUV8BeetUbMR8mJhgFBrVSUsnp9B8RyebmtgU36dZiSObDsI
NtTvlzhk11LIlae/5kjPv95r3lw6DHmV4kXLwiCNlcWPYIWBGIuspwyG+28EWSrHmN7Dt2WqEWqeNQ==" PasswordEncrypted="true"/>
            <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
        </ContainerHostPolicies>
    </Policies>
    ...
</ServiceManifestImport>

Configurar credenciais de todo o clusterConfigure cluster-wide credentials

Começando com o tempo de execução 6.3, o Service Fabric permite que você configure credenciais de todo o cluster que podem ser usadas como credenciais do repositório padrão por aplicativos.Starting with the 6.3 runtime, Service Fabric allows you to configure cluster-wide credentials which can be used as default repository credentials by applications.

Você pode habilitar ou desabilitar o recurso adicionando o atributo UseDefaultRepositoryCredentials a ContainerHostPolicies em ApplicationManifest.xml com um valor de true ou false.You can enable or disable the feature by adding the UseDefaultRepositoryCredentials attribute to ContainerHostPolicies in ApplicationManifest.xml with a true or false value.

<ServiceManifestImport>
    ...
    <Policies>
        <ContainerHostPolicies CodePackageRef="Code" UseDefaultRepositoryCredentials="true">
            <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
        </ContainerHostPolicies>
    </Policies>
    ...
</ServiceManifestImport>

O Service Fabric, em seguida, usa as credenciais do repositório padrão que você pode especificar em ClusterManifest na seção Hosting.Service Fabric then uses the default repository credentials which you can specify in the ClusterManifest under the Hosting section. Se UseDefaultRepositoryCredentials for true, o Service Fabric lerá os seguintes valores de ClusterManifest:If UseDefaultRepositoryCredentials is true, Service Fabric reads the following values from the ClusterManifest:

  • DefaultContainerRepositoryAccountName (cadeia de caracteres)DefaultContainerRepositoryAccountName (string)
  • DefaultContainerRepositoryPassword (cadeia de caracteres)DefaultContainerRepositoryPassword (string)
  • IsDefaultContainerRepositoryPasswordEncrypted (booliano)IsDefaultContainerRepositoryPasswordEncrypted (bool)
  • DefaultContainerRepositoryPasswordType (cadeia de caracteres) – com suporte a partir do tempo de execução 6.4DefaultContainerRepositoryPasswordType (string) --- Supported starting with the 6.4 runtime

Veja um exemplo do que você pode adicionar dentro da seção Hosting no arquivo ClusterManifestTemplate.json.Here is an example of what you can add inside the Hosting section in the ClusterManifestTemplate.json file. O Hosting seção pode ser adicionada no momento da criação do cluster ou posterior em uma atualização de configuração.The Hosting section can be added at cluster creation or later in a configuration upgrade. Para obter mais informações, consulte Alterar configurações de cluster do Azure Service Fabric e Gerenciar segredos de aplicativo do Azure Service FabricFor more information, see Change Azure Service Fabric cluster settings and Manage Azure Service Fabric application secrets

"fabricSettings": [
    ...,
    {
        "name": "Hosting",
        "parameters": [
          {
            "name": "EndpointProviderEnabled",
            "value": "true"
          },
          {
            "name": "DefaultContainerRepositoryAccountName",
            "value": "someusername"
          },
          {
            "name": "DefaultContainerRepositoryPassword",
            "value": "somepassword"
          },
          {
            "name": "IsDefaultContainerRepositoryPasswordEncrypted",
            "value": "false"
          },
          {
            "name": "DefaultContainerRepositoryPasswordType",
            "value": "PlainText"
          }
        ]
      },
]

Configurar o modo de isolamentoConfigure isolation mode

O Windows dá suporte a dois modos de isolamento para contêineres: processo e Hyper-V.Windows supports two isolation modes for containers: process and Hyper-V. Com o modo de isolamento de processo, todos os contêineres em execução no mesmo computador host compartilham o kernel com o host.With the process isolation mode, all the containers running on the same host machine share the kernel with the host. Com o modo de isolamento do Hyper-V, os kernels são isolados entre cada contêiner do Hyper-V e o host do contêiner.With the Hyper-V isolation mode, the kernels are isolated between each Hyper-V container and the container host. O modo de isolamento é especificado no elemento ContainerHostPolicies no arquivo de manifesto do aplicativo.The isolation mode is specified in the ContainerHostPolicies element in the application manifest file. Os modos de isolamento que podem ser especificados são process, hyperv e default.The isolation modes that can be specified are process, hyperv, and default. O padrão é o modo de isolamento de processo nos hosts do Windows Server.The default is process isolation mode on Windows Server hosts. Em hosts do Windows 10, somente o modo de isolamento do Hyper-V tem suporte, assim o contêiner é executado no modo de isolamento do Hyper-V, independentemente de sua configuração de modo de isolamento.On Windows 10 hosts, only Hyper-V isolation mode is supported, so the container runs in Hyper-V isolation mode regardless of its isolation mode setting. O snippet a seguir mostra como o modo de isolamento é especificado no arquivo de manifesto do aplicativo.The following snippet shows how the isolation mode is specified in the application manifest file.

<ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv">

Observação

O modo de isolamento do Hyper-v está disponível nas SKUs do Azure Ev3 e Dv3 que têm suporte para virtualização aninhada.The hyperv isolation mode is available on Ev3 and Dv3 Azure SKUs which have nested virtualization support.

Configurar governança de recursosConfigure resource governance

A governança de recursos restringe os recursos que o contêiner pode usar no host.Resource governance restricts the resources that the container can use on the host. O elemento ResourceGovernancePolicy, especificado no manifesto do aplicativo, é usado para declarar os limites de recurso para um pacote de códigos de serviço.The ResourceGovernancePolicy element, which is specified in the application manifest, is used to declare resource limits for a service code package. Limites de recursos podem ser definidos para os seguintes recursos: Memory, MemorySwap, CpuShares (peso relativo da CPU), MemoryReservationInMB, BlkioWeight (peso relativo de BlockIO).Resource limits can be set for the following resources: Memory, MemorySwap, CpuShares (CPU relative weight), MemoryReservationInMB, BlkioWeight (BlockIO relative weight). Neste exemplo, o pacote de serviço Guest1Pkg obtém um núcleo nos nós de cluster em que ele é colocado.In this example, service package Guest1Pkg gets one core on the cluster nodes where it is placed. Os limites de memória são absolutos e, portanto, o pacote de códigos é limitado a 1024 MB de memória (e a uma reserva de garantia reversível da mesma).Memory limits are absolute, so the code package is limited to 1024 MB of memory (and a soft-guarantee reservation of the same). Os pacotes de códigos (contêineres ou processos) não podem alocar mais memória do que esse limite. A tentativa de fazer isso resultará em uma exceção de memória insuficiente.Code packages (containers or processes) are not able to allocate more memory than this limit, and attempting to do so results in an out-of-memory exception. Para que a imposição do limite de recursos funcione, todos os pacotes de códigos em um pacote de serviço devem ter limites de memória especificados.For resource limit enforcement to work, all code packages within a service package should have memory limits specified.

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="Guest1Pkg" ServiceManifestVersion="1.0.0" />
  <Policies>
    <ServicePackageResourceGovernancePolicy CpuCores="1"/>
    <ResourceGovernancePolicy CodePackageRef="Code" MemoryInMB="1024"  />
  </Policies>
</ServiceManifestImport>

Configurar o HEALTHCHECK do DockerConfigure docker HEALTHCHECK

Iniciando a versão 6.1, o Service Fabric integra automaticamente os eventos do HEALTHCHECK do Docker em seu relatório de integridade do sistema.Starting v6.1, Service Fabric automatically integrates docker HEALTHCHECK events to its system health report. Isso significa que, se o contêiner tiver o HEALTHCHECK habilitado, o Service Fabric relatará a integridade sempre que o status de integridade do contêiner for alterado conforme relatado pelo Docker.This means that if your container has HEALTHCHECK enabled, Service Fabric will report health whenever the health status of the container changes as reported by Docker. Um relatório de integridade OK será exibido no Service Fabric Explorer quando o health_status for íntegro e um AVISO aparecerá quando o health_status for não íntegro.An OK health report will appear in Service Fabric Explorer when the health_status is healthy and WARNING will appear when health_status is unhealthy.

Começando com a versão mais recente de atualização de v 6.4, você tem a opção para especificar que as avaliações de HEALTHCHECK do docker devem ser relatadas como um erro.Starting with the latest refresh release of v6.4, you have the option to specify that docker HEALTHCHECK evaluations should be reported as an error. Se essa opção estiver habilitada, uma Okey relatório de integridade será exibido quando health_status está Íntegro e erro aparecerá quando health_status é Íntegro.If this option is enabled, an OK health report will appear when health_status is healthy and ERROR will appear when health_status is unhealthy.

A instrução do HEALTHCHECK apontando para a verificação real que é executada para monitorar a integridade do contêiner deve estar presente no Dockerfile usado ao gerar a imagem de contêiner.The HEALTHCHECK instruction pointing to the actual check that is performed for monitoring container health must be present in the Dockerfile used while generating the container image.

HealthCheckHealthy

HealthCheckUnhealthyApp

HealthCheckUnhealthyDsp

Você pode configurar o comportamento do HEALTHCHECK para cada contêiner especificando as opções do HealthConfig como parte do ContainerHostPolicies no ApplicationManifest.You can configure HEALTHCHECK behavior for each container by specifying HealthConfig options as part of ContainerHostPolicies in ApplicationManifest.

<ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="ContainerServicePkg" ServiceManifestVersion="2.0.0" />
    <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <HealthConfig IncludeDockerHealthStatusInSystemHealthReport="true"
              RestartContainerOnUnhealthyDockerHealthStatus="false" 
              TreatContainerUnhealthyStatusAsError="false" />
      </ContainerHostPolicies>
    </Policies>
</ServiceManifestImport>

Por padrão IncludeDockerHealthStatusInSystemHealthReport é definido como verdadeiro, RestartContainerOnUnhealthyDockerHealthStatus é definido como False, e TreatContainerUnhealthyStatusAsError é definido como false.By default IncludeDockerHealthStatusInSystemHealthReport is set to true, RestartContainerOnUnhealthyDockerHealthStatus is set to false, and TreatContainerUnhealthyStatusAsError is set to false.

Se o RestartContainerOnUnhealthyDockerHealthStatus for definido como true, um contêiner relatando repetidamente um estado não íntegro será reiniciado (possivelmente em outros nós).If RestartContainerOnUnhealthyDockerHealthStatus is set to true, a container repeatedly reporting unhealthy is restarted (possibly on other nodes).

Se TreatContainerUnhealthyStatusAsError é definido como verdadeiro, erro relatórios de integridade serão exibido quando o contêiner health_statusestá Íntegro.If TreatContainerUnhealthyStatusAsError is set to true, ERROR health reports will appear when the container's health_status is unhealthy.

Se você deseja desabilitar a integração do HEALTHCHECK para todo o cluster do Service Fabric, precisará definir o EnableDockerHealthCheckIntegration como false.If you want to the disable the HEALTHCHECK integration for the entire Service Fabric cluster, you will need to set EnableDockerHealthCheckIntegration to false.

Como implantar o aplicativo de contêinerDeploy the container application

Salve todas as suas alterações e compile o aplicativo.Save all your changes and build the application. Para publicar o seu aplicativo, clique o botão direito do mouse em MyFirstContainer no Gerenciador de Soluções e selecione Publicar.To publish your application, right-click on MyFirstContainer in Solution Explorer and select Publish.

Em Ponto de Extremidade de Conexão, insira o ponto de extremidade de gerenciamento para o cluster.In Connection Endpoint, enter the management endpoint for the cluster. Por exemplo, "containercluster.westus2.cloudapp.azure.com:19000".For example, "containercluster.westus2.cloudapp.azure.com:19000". Você pode encontrar o ponto de extremidade de conexão do cliente na guia de Visão geral para o cluster no portal do Azure.You can find the client connection endpoint in the Overview tab for your cluster in the Azure portal.

Clique em Publicar.Click Publish.

O Service Fabric Explorer é uma ferramenta baseada na Web para inspecionar e gerenciar aplicativos e nós em um cluster do Service Fabric.Service Fabric Explorer is a web-based tool for inspecting and managing applications and nodes in a Service Fabric cluster. Abra um navegador e navegue até http://containercluster.westus2.cloudapp.azure.com:19080/Explorer/ e siga a implantação do aplicativo.Open a browser and navigate to http://containercluster.westus2.cloudapp.azure.com:19080/Explorer/ and follow the application deployment. O aplicativo é implantado, mas fica em estado de erro até que a imagem seja baixada nos nós de cluster (o que pode levar algum tempo, dependendo do tamanho da imagem): ErroThe application deploys but is in an error state until the image is downloaded on the cluster nodes (which can take some time, depending on the image size): Error

O aplicativo está pronto quando está com o estado Ready: ProntoThe application is ready when it's in Ready state: Ready

Abra um navegador e navegue até http://containercluster.westus2.cloudapp.azure.com:8081.Open a browser and navigate to http://containercluster.westus2.cloudapp.azure.com:8081. Você deve ver o cabeçalho "Olá, Mundo!"You should see the heading "Hello World!" ser exibido no navegador.display in the browser.

LimparClean up

Você continua a incorrer em encargos enquanto o cluster estiver em execução, considere excluir o cluster.You continue to incur charges while the cluster is running, consider deleting your cluster.

Depois que você enviar a imagem para o registro de contêiner, você pode excluir a imagem local do seu computador de desenvolvimento:After you push the image to the container registry, you can delete the local image from your development computer:

docker rmi helloworldapp
docker rmi myregistry.azurecr.io/samples/helloworldapp

Compatibilidade do sistema operacional do contêiner e do sistema operacional do host do Windows ServerWindows Server container OS and host OS compatibility

Os contêineres do Windows Server não são compatíveis em todas as versões de um sistema operacional do host.Windows Server containers are not compatible across all versions of a host OS. Por exemplo:For example:

  • Os contêineres do Windows Server criados usando o Windows Server versão 1709 não funcionam em um host executando o Windows Server versão 2016.Windows Server containers built using Windows Server version 1709 do not work on a host running Windows Server version 2016.
  • Contêineres do Windows Server criados usando o Windows Server 2016 funcionam no modo de isolamento do Hyper-V apenas em um host executando o Windows Server versão 1709.Windows Server containers built using Windows Server 2016 work in Hyper-V isolation mode only on a host running Windows Server version 1709.
  • Com contêineres do Windows Server criados usando o Windows Server 2016, pode ser necessário garantir que a revisão do sistema operacional do contêiner e sistema operacional do host são as mesmas durante a execução no modo de isolamento do processo em um host executando o Windows Server 2016.With Windows Server containers built using Windows Server 2016, it might be necessary to ensure that the revision of the container OS and host OS are the same when running in process isolation mode on a host running Windows Server 2016.

Para obter mais informações, consulte Compatibilidade de versão de contêiner do Windows.To learn more, see Windows Container Version Compatibility.

Considere a compatibilidade do sistema operacional do host e do sistema operacional do contêiner ao compilar e implantar contêineres para o cluster do Service Fabric.Consider the compatibility of the host OS and your container OS when building and deploying containers to your Service Fabric cluster. Por exemplo:For example:

  • Verifique se que você implanta os contêineres com um sistema operacional compatível com o sistema operacional nos nós do cluster.Make sure you deploy containers with an OS compatible with the OS on your cluster nodes.
  • Certifique-se de que o modo de isolamento especificado para o aplicativo de contêiner é consistente com o suporte para o sistema operacional do contêiner no nó onde ele está sendo implantado.Make sure that the isolation mode specified for your container app is consistent with support for the container OS on the node where it is being deployed.
  • Considere como as atualizações do sistema operacional para os nós do cluster ou contêineres podem afetar sua compatibilidade.Consider how OS upgrades to your cluster nodes or containers may affect their compatibility.

Recomendamos as seguintes práticas para certificar-se de que os contêineres são implantados corretamente no cluster do Service Fabric:We recommend the following practices to make sure that containers are deployed correctly on your Service Fabric cluster:

  • Use a marcação de imagem explícita com as imagens do Docker para especificar a versão do sistema operacional do Windows Server a partir da qual um contêiner é criado.Use explicit image tagging with your Docker images to specify the version of Windows Server OS that a container is built from.
  • Use a marcação do SO em seu arquivo de manifesto do aplicativo para certificar-se de que seu aplicativo é compatível com versões e atualizações diferentes do Windows Server.Use OS tagging in your application manifest file to make sure that your application is compatible across different Windows Server versions and upgrades.

Observação

Com o Service Fabric versão 6.2 e posterior, você pode implantar contêineres baseados no Windows Server 2016 localmente em um host do Windows 10.With Service Fabric version 6.2 and later, you can deploy containers based on Windows Server 2016 locally on a Windows 10 host. No Windows 10, os contêineres são executados no modo de isolamento do Hyper-V, independentemente do modo de isolamento definido no manifesto do aplicativo.On Windows 10, containers run in Hyper-V isolation mode, regardless of the isolation mode set in the application manifest. Para obter mais informações, consulte Configurar o modo de isolamento.To learn more, see Configure isolation mode.

Especifique a compilação do sistema operacional das imagens de contêiner específicasSpecify OS build specific container images

Os contêineres do Windows Server podem não ser compatíveis entre diferentes versões do sistema operacional.Windows Server containers may not be compatible across different versions of the OS. Por exemplo, os contêineres do Windows Server criados usando o Windows Server 2016 não funcionam na versão 1709 do Windows Server no modo de isolamento do processo.For example, Windows Server containers built using Windows Server 2016 do not work on Windows Server version 1709 in process isolation mode. Portanto, se os nós do cluster forem atualizados para a versão mais recente, os serviços de contêiner criados com versões anteriores do sistema operacional poderão falhar.Hence, if cluster nodes are updated to the latest version, container services built using the earlier versions of the OS may fail. Para contornar isso com a versão 6.1 do tempo de execução e mais recente, o Service Fabric oferece suporte à especificação de várias imagens do sistema operacional por contêiner e marca-as com as versões de compilação do sistema operacional no manifesto do aplicativo.To circumvent this with version 6.1 of the runtime and newer, Service Fabric supports specifying multiple OS images per container and tagging them with the build versions of the OS in the application manifest. Você pode obter a versão do sistema operacional executando winver em um prompt de comando do Windows.You can get the build version of the OS by running winver at a Windows command prompt. Atualize os manifestos do aplicativo e especificar as substituições de imagem por versão do sistema operacional antes de atualizar o sistema operacional nos nós.Update the application manifests and specify image overrides per OS version before updating the OS on the nodes. O snippet de código a seguir mostra como especificar várias imagens de contêiner no manifesto do aplicativo, ApplicationManifest.xml:The following snippet shows how to specify multiple container images in the application manifest, ApplicationManifest.xml:

      <ContainerHostPolicies> 
         <ImageOverrides> 
           <Image Name="myregistry.azurecr.io/samples/helloworldappDefault" /> 
               <Image Name="myregistry.azurecr.io/samples/helloworldapp1701" Os="14393" /> 
               <Image Name="myregistry.azurecr.io/samples/helloworldapp1709" Os="16299" /> 
         </ImageOverrides> 
      </ContainerHostPolicies> 

A versão de compilação para o WIndows Server 2016 é 14393 e a versão de compilação para a versão 1709 do Windows Server é 16299.The build version for WIndows Server 2016 is 14393, and the build version for Windows Server version 1709 is 16299. O manifesto do serviço continua a especificar apenas uma imagem por serviço de contêiner, como mostra o seguinte:The service manifest continues to specify only one image per container service as the following shows:

<ContainerHost>
    <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName> 
</ContainerHost>

Observação

Os recursos de marcação da versão de compilação do sistema operacional só estão disponíveis para o Service Fabric no WindowsThe OS build version tagging features is only available for Service Fabric on Windows

Se o sistema operacional subjacente na VM é a compilação 16299 (versão 1709), o Service Fabric escolherá a imagem do contêiner correspondente a essa versão do Windows Server.If the underlying OS on the VM is build 16299 (version 1709), Service Fabric picks the container image corresponding to that Windows Server version. Se uma imagem de contêiner sem marcas também for fornecida junto com as imagens de contêiner marcadas no manifesto do aplicativo, o Service Fabric tratará a imagem não marcada como uma que funciona entre versões diferentes.If an untagged container image is also provided alongside tagged container images in the application manifest, then Service Fabric treats the untagged image as one that works across versions. Marque as imagens de contêiner explicitamente para evitar problemas durante as atualizações.Tag the container images explicitly to avoid issues during upgrades.

A imagem de contêiner sem marcas funcionará como substituição da fornecida em ServiceManifest.The untagged container image will work as an override for the one provide in the ServiceManifest. Portanto, a imagem myregistry.azurecr.io/samples/helloworldappDefault"imagem" substituirá ImageName "myregistry.azurecr.io/samples/helloworldapp" no ServiceManifest.So image "myregistry.azurecr.io/samples/helloworldappDefault" will override the ImageName "myregistry.azurecr.io/samples/helloworldapp" in the ServiceManifest.

Exemplo completo de manifestos de serviço e aplicativo do Service FabricComplete example Service Fabric application and service manifests

Aqui estão os manifestos de aplicativo e serviço completos usados neste artigo.Here are the complete service and application manifests used in this article.

ServiceManifest.xmlServiceManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="Guest1Pkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <!-- This is the name of your ServiceType.
         The UseImplicitHost attribute indicates this is a guest service. -->
    <StatelessServiceType ServiceTypeName="Guest1Type" UseImplicitHost="true" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
      <ContainerHost>
        <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName>
        <!-- Pass comma delimited commands to your container: dotnet, myproc.dll, 5" -->
        <!--Commands> dotnet, myproc.dll, 5 </Commands-->
        <Commands></Commands>
      </ContainerHost>
    </EntryPoint>
    <!-- Pass environment variables to your container: -->    
    <EnvironmentVariables>
      <EnvironmentVariable Name="HttpGatewayPort" Value=""/>
      <EnvironmentVariable Name="BackendServiceName" Value=""/>
    </EnvironmentVariables>

  </CodePackage>

  <!-- Config package is the contents of the Config directory under PackageRoot that contains an
       independently-updateable and versioned set of custom configuration settings for your service. -->
  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to
           listen. Please note that if your service is partitioned, this port is shared with
           replicas of different partitions that are placed in your code. -->
      <Endpoint Name="Guest1TypeEndpoint" UriScheme="http" Port="8081" Protocol="http"/>
    </Endpoints>
  </Resources>
</ServiceManifest>

ApplicationManifest.xmlApplicationManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="MyFirstContainerType"
                     ApplicationTypeVersion="1.0.0"
                     xmlns="http://schemas.microsoft.com/2011/01/fabric"
                     xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                     xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <Parameters>
    <Parameter Name="Guest1_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
       should match the Name and Version attributes of the ServiceManifest element defined in the
       ServiceManifest.xml file. -->
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Guest1Pkg" ServiceManifestVersion="1.0.0" />
    <EnvironmentOverrides CodePackageRef="FrontendService.Code">
      <EnvironmentVariable Name="HttpGatewayPort" Value="19080"/>
    </EnvironmentOverrides>
    <ConfigOverrides />
    <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="myregistry" Password="MIIB6QYJKoZIhvcNAQcDoIIB2jCCAdYCAQAxggFRMIIBTQIBADA1MCExHzAdBgNVBAMMFnJ5YW53aWRhdGFlbmNpcGhlcm1lbnQCEFfyjOX/17S6RIoSjA6UZ1QwDQYJKoZIhvcNAQEHMAAEg
gEAS7oqxvoz8i6+8zULhDzFpBpOTLU+c2mhBdqXpkLwVfcmWUNA82rEWG57Vl1jZXe7J9BkW9ly4xhU8BbARkZHLEuKqg0saTrTHsMBQ6KMQDotSdU8m8Y2BR5Y100wRjvVx3y5+iNYuy/JmM
gSrNyyMQ/45HfMuVb5B4rwnuP8PAkXNT9VLbPeqAfxsMkYg+vGCDEtd8m+bX/7Xgp/kfwxymOuUCrq/YmSwe9QTG3pBri7Hq1K3zEpX4FH/7W2Zb4o3fBAQ+FuxH4nFjFNoYG29inL0bKEcTX
yNZNKrvhdM3n1Uk/8W2Hr62FQ33HgeFR1yxQjLsUu800PrYcR5tLfyTB8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBBybgM5NUV8BeetUbMR8mJhgFBrVSUsnp9B8RyebmtgU36dZiSObDsI
NtTvlzhk11LIlae/5kjPv95r3lw6DHmV4kXLwiCNlcWPYIWBGIuspwyG+28EWSrHmN7Dt2WqEWqeNQ==" PasswordEncrypted="true"/>
        <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
      </ContainerHostPolicies>
      <ServicePackageResourceGovernancePolicy CpuCores="1"/>
      <ResourceGovernancePolicy CodePackageRef="Code" MemoryInMB="1024"  />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <!-- The section below creates instances of service types, when an instance of this
         application type is created. You can also create one or more instances of service type using the
         ServiceFabric PowerShell module.

         The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
    <Service Name="Guest1">
      <StatelessService ServiceTypeName="Guest1Type" InstanceCount="[Guest1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

Configurar o intervalo de tempo antes do contêiner ser forçado a terminarConfigure time interval before container is force terminated

Você pode configurar um intervalo de tempo para a execução aguardar antes do contêiner ser removido após a exclusão do serviço (ou um movimento para outro nó) ter iniciado.You can configure a time interval for the runtime to wait before the container is removed after the service deletion (or a move to another node) has started. Configurar o intervalo de tempo envia o comando docker stop <time in seconds> para o contêiner.Configuring the time interval sends the docker stop <time in seconds> command to the container. Para obter mais detalhes, consulte parar docker.For more detail, see docker stop. O intervalo de tempo de espera é especificado na seção Hosting.The time interval to wait is specified under the Hosting section. O Hosting seção pode ser adicionada no momento da criação do cluster ou posterior em uma atualização de configuração.The Hosting section can be added at cluster creation or later in a configuration upgrade. O snippet de manifesto do cluster a seguir mostra como definir o intervalo de espera:The following cluster manifest snippet shows how to set the wait interval:

"fabricSettings": [
    ...,
    {
        "name": "Hosting",
        "parameters": [
          {
                "name": "ContainerDeactivationTimeout",
                "value" : "10"
          },
          ...
        ]
    }
]

O intervalo de tempo padrão é definido para 10 segundos.The default time interval is set to 10 seconds. Como essa configuração é dinâmica, uma configuração somente atualiza no cluster que atualiza no tempo limite.Since this configuration is dynamic, a config only upgrade on the cluster updates the timeout.

Configurar a execução para remover as imagens de contêiner não utilizadasConfigure the runtime to remove unused container images

Você pode configurar o cluster do Service Fabric para remover as imagens de contêiner não utilizadas do nó.You can configure the Service Fabric cluster to remove unused container images from the node. Essa configuração permite que o espaço em disco seja recapturado se houver imagens de contêiner demais no nó.This configuration allows disk space to be recaptured if too many container images are present on the node. Para habilitar esse recurso, atualize a seção Hosting no manifesto do cluster, conforme mostrado no seguinte trecho:To enable this feature, update the Hosting section in the cluster manifest as shown in the following snippet:

"fabricSettings": [
    ...,
    {
        "name": "Hosting",
        "parameters": [
          {
                "name": "PruneContainerImages",
                "value": "True"
          },
          {
                "name": "ContainerImagesToSkip",
                "value": "microsoft/windowsservercore|microsoft/nanoserver|microsoft/dotnet-frameworku|..."
          }
          ...
          }
        ]
    } 
]

Para as imagens que não devem ser excluídas, você pode especificá-las no parâmetro ContainerImagesToSkip.For images that shouldn't be deleted, you can specify them under the ContainerImagesToSkip parameter.

Configurar o tempo de download de imagem de contêinerConfigure container image download time

O tempo de execução do Service Fabric aloca 20 minutos para baixar e extrair as imagens de contêiner, o que funciona para a maioria das imagens de contêiner.The Service Fabric runtime allocates 20 minutes to download and extract container images, which work for the majority of container images. Para imagens grandes, ou quando a conexão de rede estiver lenta, talvez seja necessário aumentar o tempo de espera antes de cancelar o download e a extração da imagem.For large images, or when the network connection is slow, it might be necessary to increase the time to wait before aborting the image download and extraction. Esse tempo limite é definido usando o atributo ContainerImageDownloadTimeout na seção Hospedagem do manifesto do cluster, conforme mostrado no snippet de código a seguir:This time out is set using the ContainerImageDownloadTimeout attribute in the Hosting section of the cluster manifest as shown in the following snippet:

"fabricSettings": [
    ...,
    {
        "name": "Hosting",
        "parameters": [
          {
              "name": "ContainerImageDownloadTimeout",
              "value": "1200"
          }
        ]
    }
]

Definir política de retenção de contêinerSet container retention policy

Para ajudar a diagnosticar as falhas de inicialização do contêiner, o Service Fabric (versão 6.1 ou superiores) oferece suporte à retenção de contêineres que encerraram ou falharam na inicialização.To assist with diagnosing container startup failures, Service Fabric (version 6.1 or higher) supports retaining containers that terminated or failed to startup. Essa política pode ser definida no arquivo ApplicationManifest.xml conforme mostrado no snippet de código a seguir:This policy can be set in the ApplicationManifest.xml file as shown in the following snippet:

 <ContainerHostPolicies CodePackageRef="NodeService.Code" Isolation="process" ContainersRetentionCount="2"  RunInteractive="true"> 

A configuração ContainersRetentionCount especifica o número de contêineres mantidos quando ocorre uma falha.The setting ContainersRetentionCount specifies the number of containers to retain when they fail. Se um valor negativo for especificado, todos os contêineres com falha serão mantidos.If a negative value is specified, all failing containers will be retained. Quando o atributo ContainersRetentionCount não for especificado, nenhum contêiner será retido.When the ContainersRetentionCount attribute is not specified, no containers will be retained. O atributo ContainersRetentionCount também oferece suporte a Parâmetros de Aplicativo para que os usuários possam especificar valores diferentes para clusters de teste e produção.The attribute ContainersRetentionCount also supports Application Parameters so users can specify different values for test and production clusters. Use restrições de posicionamento para direcionar o serviço de contêiner para um determinado nó quando esses recursos forem usados com a finalidade de impedir que o serviço de contêiner se mova para outros nós.Use placement constraints to target the container service to a particular node when using this feature to prevent the container service from moving to other nodes. Todos os contêineres retidos usando esse recurso devem ser removidos manualmente.Any containers retained using this feature must be manually removed.

Iniciar o daemon do Docker com argumentos personalizadosStart the Docker daemon with custom arguments

Com a versão 6.2, e superiores, do tempo de execução do Service Fabric, você pode iniciar o daemon do Docker com argumentos personalizados.With the 6.2 version of the Service Fabric runtime and greater, you can start the Docker daemon with custom arguments. Ao especificar argumentos personalizados, o Service Fabric não passa outro argumento para o mecanismo do docker, com exceção do argumento --pidfile.When custom arguments are specified, Service Fabric does not pass any other argument to docker engine except the --pidfile argument. Portanto, não passe --pidfile como um argumento.Hence, --pidfile shouldn't be passed as an argument. Além disso, o argumento deve manter a escuta do daemon do docker no pipe de nome padrão no Windows (ou um soquete de domínio do unix no Linux) para o Service Fabric se comunicar com o Daemon.Additionally, the argument should continue to have the docker daemon listen on the default name pipe on Windows (or unix domain socket on Linux) for Service Fabric to communicate with the Daemon. Os argumentos personalizados são passados no manifesto do cluster na seção Hospedagem em ContainerServiceArguments conforme mostrado no snippet de código a seguir:The custom arguments are passed in the cluster manifest under the Hosting section under ContainerServiceArguments as shown in the following snippet:

"fabricSettings": [
    ...,
    { 
        "name": "Hosting", 
        "parameters": [ 
          { 
            "name": "ContainerServiceArguments", 
            "value": "-H localhost:1234 -H unix:///var/run/docker.sock" 
          } 
        ] 
    } 
]

Próximas etapasNext steps