Opções avançadas de rede no Windows
Aplica-se a: Windows Server 2022, Windows Server 2019 e Windows Server 2016
Há suporte para várias opções de driver de rede para aproveitar os recursos e funcionalidades específicos do Windows.
Alternar o agrupamento incorporado com redes do Docker
Aplica-se a todos os drivers de rede
Você pode aproveitar o Switch Embedded Teaming ao criar redes de host de contêiner para uso pelo Docker especificando vários adaptadores de rede (separados por vírgulas) com a -o com.docker.network.windowsshim.interface
opção.
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2", "Ethernet 3" TeamedNet
Definir a ID da VLAN para uma rede
Aplica-se a drivers de rede transparentes e l2bridge
Para definir uma ID de VLAN para uma rede, use a opção para -o com.docker.network.windowsshim.vlanid=<VLAN ID>
o docker network create
comando. Por exemplo, você pode usar o seguinte comando para criar uma rede transparente com uma ID de VLAN de 11:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.vlanid=11 MyTransparentNetwork
Ao definir a ID da VLAN para uma rede, você está definindo o isolamento da VLAN para todos os pontos de extremidade de contêiner que serão conectados a essa rede.
Verifique se o adaptador de rede do host (físico) está no modo de tronco para permitir que todo o tráfego marcado seja processado pelo vSwitch com a porta vNIC (ponto de extremidade do contêiner) no modo de acesso na VLAN correta.
Especificar diretiva OutboundNAT para uma rede
Aplica-se a redes l2bridge
Normalmente, quando você cria uma rede de contêiner usando docker network create
o , os pontos de extremidade de contêiner não têm uma l2bridge
política HNS OutboundNAT aplicada, resultando na impossibilidade de os contêineres alcançarem o mundo externo. Se você estiver criando uma rede, poderá usar a opção para aplicar a -o com.docker.network.windowsshim.enable_outboundnat=<true|false>
política OutboundNAT HNS para conceder aos contêineres acesso ao mundo externo:
C:\> docker network create -d l2bridge -o com.docker.network.windowsshim.enable_outboundnat=true MyL2BridgeNetwork
Se houver um conjunto de destinos (por exemplo, conectividade de contêiner para contêiner é necessária) para onde não queremos que o NAT'ing ocorra, também precisamos especificar uma ExceptionList:
C:\> docker network create -d l2bridge -o com.docker.network.windowsshim.enable_outboundnat=true -o com.docker.network.windowsshim.outboundnat_exceptions=10.244.10.0/24
Especificar o nome de uma rede para o serviço HNS
Aplica-se a todos os drivers de rede
Normalmente, quando você cria uma rede de contêiner usando docker network create
, o nome de rede fornecido é usado pelo serviço Docker, mas não pelo serviço HNS. Se você estiver criando uma rede, poderá especificar o nome que é dado pelo serviço HNS usando a opção para -o com.docker.network.windowsshim.networkname=<network name>
o docker network create
comando. Por exemplo, você pode usar o seguinte comando para criar uma rede transparente com um nome especificado para o serviço HNS:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.networkname=MyTransparentNetwork MyTransparentNetwork
Vincular uma rede a uma interface de rede específica
Aplica-se a todos os drivers de rede, exceto 'nat'
Para vincular uma rede (conectada por meio do comutador virtual Hyper-V) a uma interface de rede específica, use a opção -o com.docker.network.windowsshim.interface=<Interface>
ao docker network create
comando. Por exemplo, você pode usar o seguinte comando para criar uma rede transparente conectada à interface de rede "Ethernet 2":
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2" TransparentNet2
Nota: O valor de com.docker.network.windowsshim.interface é o Nome do adaptador de rede, que pode ser encontrado com:
PS C:\> Get-NetAdapter
Especificar o sufixo DNS e/ou os servidores DNS de uma rede
Aplica-se a todos os drivers de rede
Use a opção para -o com.docker.network.windowsshim.dnssuffix=<DNS SUFFIX>
especificar o sufixo DNS de uma rede e a opção -o com.docker.network.windowsshim.dnsservers=<DNS SERVER/S>
para especificar os servidores DNS de uma rede. Por exemplo, você pode usar o seguinte comando para definir o sufixo DNS de uma rede como "example.com" e os servidores DNS de uma rede como 4.4.4.4 e 8.8.8.8:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.dnssuffix=abc.com -o com.docker.network.windowsshim.dnsservers=4.4.4.4,8.8.8.8 MyTransparentNetwork
VFP
Consulte este artigo para obter mais informações.
Dicas & Insights
Aqui está uma lista de dicas e insights úteis, inspirados por perguntas comuns sobre a rede de contêineres do Windows que ouvimos da comunidade...
O HNS requer que o IPv6 esteja habilitado em máquinas host de contêiner
Como parte de KB4015217 o HNS requer que o IPv6 esteja habilitado em hosts de contêiner do Windows. Se você estiver enfrentando um erro como o abaixo, há uma chance de que o IPv6 esteja desabilitado em sua máquina host.
docker: Error response from daemon: container e15d99c06e312302f4d23747f2dfda4b11b92d488e8c5b53ab5e4331fd80636d encountered an error during CreateContainer: failure in a Windows system call: Element not found.
Estamos trabalhando em alterações na plataforma para detectar/prevenir automaticamente esse problema. Atualmente, a seguinte solução alternativa pode ser usada para garantir que o IPv6 esteja habilitado em sua máquina host:
C:\> reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters /v DisabledComponents /f
Contêineres Linux no Windows
NOVO: Estamos trabalhando para tornar possível executar contêineres Linux e Windows lado a lado sem a VM Moby Linux. Consulte esta postagem de blog sobre Linux Containers on Windows (LCOW) para obter detalhes. Veja como começar.
NOTA: O LCOW está substituindo a VM Moby Linux e utilizará o vSwitch interno "nat" HNS padrão.
As VMs Moby Linux usam o switch DockerNAT com o Docker para Windows (um produto do Docker CE)
O Docker para Windows (o driver do Windows para o mecanismo Docker CE) no Windows 10 usará um vSwitch interno chamado 'DockerNAT' para conectar VMs Moby Linux ao host do contêiner. Os desenvolvedores que usam VMs Moby Linux no Windows devem estar cientes de que seus hosts estão usando o DockerNAT vSwitch em vez do vSwitch "nat" que é criado pelo serviço HNS (que é o switch padrão usado para contêineres do Windows).
Para usar DHCP para atribuição de IP em um host de contêiner virtual, habilite MACAddressSpoofing
Se o host do contêiner for virtualizado e você desejar usar DHCP para atribuição de IP, deverá habilitar MACAddressSpoofing no adaptador de rede da máquina virtual. Caso contrário, o host Hyper-V bloqueará o tráfego de rede dos contêineres na VM com vários endereços MAC. Você pode habilitar MACAddressSpoofing com este comando do PowerShell:
PS C:\> Get-VMNetworkAdapter -VMName ContainerHostVM | Set-VMNetworkAdapter -MacAddressSpoofing On
Se você estiver executando o VMware como hipervisor, precisará habilitar o modo promíscuo para que isso funcione. Detalhes podem ser encontrados aqui
Criando várias redes transparentes em um único host de contêiner
Se desejar criar mais de uma rede transparente, especifique a qual adaptador de rede (virtual) o Comutador Virtual Hyper-V externo deve se vincular. Para especificar a interface de uma rede, use a seguinte sintaxe:
# General syntax:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface=<INTERFACE NAME> <NETWORK NAME>
# Example:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2" myTransparent2
Lembre-se de especificar --subnet e --gateway ao usar a atribuição de IP estático
Ao usar a atribuição de IP estático, você deve primeiro garantir que os parâmetros --subnet e --gateway sejam especificados quando a rede for criada. A sub-rede e o endereço IP do gateway devem ser os mesmos que as configurações de rede para o host do contêiner - ou seja, a rede física. Por exemplo, veja como você pode criar uma rede transparente e executar um ponto de extremidade nessa rede usando a atribuição de IP estático:
# Example: Create a transparent network using static IP assignment
# A network create command for a transparent container network corresponding to the physical network with IP prefix 10.123.174.0/23
C:\> docker network create -d transparent --subnet=10.123.174.0/23 --gateway=10.123.174.1 MyTransparentNet
# Run a container attached to MyTransparentNet
C:\> docker run -it --network=MyTransparentNet --ip=10.123.174.105 windowsservercore cmd
Atribuição de IP DHCP não suportada com redes L2Bridge
Somente a atribuição de IP estático é suportada com redes de contêiner criadas usando o driver l2bridge. Como dito acima, lembre-se de usar os parâmetros --subnet e --gateway para criar uma rede configurada para atribuição de IP estático.
As redes que utilizam o vSwitch externo devem ter seu próprio adaptador de rede
Observe que se várias redes que usam um vSwitch externo para conectividade (por exemplo, Transparent, L2 Bridge, L2 Transparent) forem criadas no mesmo host de contêiner, cada uma delas exigirá seu próprio adaptador de rede.
Atribuição de IP em contêineres parados versus em execução
A atribuição de IP estático é executada diretamente no adaptador de rede do contêiner e só deve ser executada quando o contêiner está em um estado STOP. Não há suporte para "adição a quente" de adaptadores de rede de contêiner ou alterações na pilha de rede (no Windows Server 2016) enquanto o contêiner estiver em execução.
O vSwitch existente (não visível para o Docker) pode bloquear a criação de rede transparente
Se você encontrar um erro ao criar uma rede transparente, é possível que haja um vSwitch externo em seu sistema que não foi descoberto automaticamente pelo Docker e, portanto, está impedindo que a rede transparente seja vinculada ao adaptador de rede externo do host do contêiner.
Ao criar uma rede transparente, o Docker cria um vSwitch externo para a rede e, em seguida, tenta vincular o switch a um adaptador de rede (externo) - o adaptador pode ser um adaptador de rede VM ou o adaptador de rede físico. Se um vSwitch já tiver sido criado no host de contêiner e estiver visível para o Docker, o mecanismo do Windows Docker usará essa opção em vez de criar uma nova. No entanto, se o vSwitch que foi criado fora de banda (ou seja, criado no host de contêiner usando o HYper-V Manager ou PowerShell) e ainda não estiver visível para o Docker, o mecanismo do Windows Docker tentará criar um novo vSwitch e, em seguida, não poderá conectar o novo switch ao adaptador de rede externo do host de contêiner (porque o adaptador de rede já estará conectado ao switch que foi criado fora de banda).
Por exemplo, esse problema surgiria se você primeiro criasse um novo vSwitch em seu host enquanto o serviço Docker estivesse em execução e, em seguida, tentasse criar uma rede transparente. Nesse caso, o Docker não reconheceria o switch que você criou e criaria um novo vSwitch para a rede transparente.
Há três abordagens para resolver esse problema:
- É claro que você pode excluir o vSwitch que foi criado fora de banda, o que permitirá que o docker crie um novo vSwitch e conecte-o ao adaptador de rede do host sem problemas. Antes de escolher essa abordagem, verifique se o vSwitch fora de banda não está sendo usado por outros serviços (por exemplo, Hyper-V).
- Como alternativa, se você decidir usar um vSwitch externo criado fora de banda, reinicie os serviços Docker e HNS para tornar o switch visível para o Docker.
PS C:\> restart-service hns
PS C:\> restart-service docker
- Outra opção é usar a opção '-o com.docker.network.windowsshim.interface' para vincular o vSwitch externo da rede transparente a um adaptador de rede específico que ainda não está em uso no host do contêiner (ou seja, um adaptador de rede diferente daquele que está sendo usado pelo vSwitch que foi criado fora de banda). A opção '-o' é descrita mais adiante na seção Criando várias redes transparentes em um único host de contêiner deste documento.
Soluções alternativas do Windows Server 2016
Embora continuemos a adicionar novos recursos e impulsionar o desenvolvimento, alguns desses recursos não serão portados para plataformas mais antigas. Em vez disso, o melhor plano de ação é "entrar no trem" para as atualizações mais recentes do Windows 10 e do Windows Server. A seção abaixo lista algumas soluções alternativas e advertências que se aplicam ao Windows Server 2016 e versões mais antigas do Windows 10 (ou seja, antes do 1704 Creators Update)
Várias redes NAT no host de contêiner WS2016
As partições para quaisquer novas redes NAT devem ser criadas sob o prefixo de rede NAT interno maior. O prefixo pode ser encontrado executando o seguinte comando do PowerShell e fazendo referência ao campo "InternalIPInterfaceAddressPrefix".
PS C:\> Get-NetNAT
Por exemplo, o prefixo interno da rede NAT do host pode ser, 172.16.0.0/16. Nesse caso, o Docker pode ser usado para criar redes NAT adicionais, desde que sejam um subconjunto do prefixo 172.16.0.0/16. Por exemplo, duas redes NAT podem ser criadas com os prefixos IP 172.16.1.0/24 (gateway, 172.16.1.1) e 172.16.2.0/24 (gateway, 172.16.2.1).
C:\> docker network create -d nat --subnet=172.16.1.0/24 --gateway=172.16.1.1 CustomNat1
C:\> docker network create -d nat --subnet=172.16.2.0/24 --gateway=172.16.1.1 CustomNat2
As redes recém-criadas podem ser listadas usando:
C:\> docker network ls
Docker Compose
O Docker Compose pode ser usado para definir e configurar redes de contêiner junto com os contêineres/serviços que usarão essas redes. A chave Compose 'networks' é usada como a chave de nível superior na definição das redes às quais os contêineres serão conectados. Por exemplo, a sintaxe abaixo define a rede NAT preexistente criada pelo Docker como sendo a rede 'padrão' para todos os contêineres/serviços definidos em um determinado arquivo Compose.
networks:
default:
external:
name: "nat"
Da mesma forma, a sintaxe a seguir pode ser usada para definir uma rede NAT personalizada.
Nota: A 'rede NAT personalizada' definida no exemplo abaixo é definida como uma partição do prefixo interno NAT pré-existente do host do contêiner. Consulte a seção acima, 'Várias redes NAT', para obter mais contexto.
networks:
default:
driver: nat
ipam:
driver: default
config:
- subnet: 172.16.3.0/24
Para obter mais informações sobre como definir/configurar redes de contêiner usando o Docker Compose, consulte a referência do arquivo de composição.