Em um docker-compose
grupo de contêineres, os contêineres não precisam de endereços, pois podem se comunicar entre si usando esse pseudo-DNS fornecido pelo Docker apenas para os membros desse grupo. Então, para se comunicar com o exterior, é o caso de regressão NAT padrão que Docker adora.
E se eu estiver usando o endereçamento IP baseado em rede macvlan? Como eu poderia atribuir um endereço compartilhado com todo o grupo, em vez de apenas com um único serviço do grupo. Todos os exemplos e documentação que encontrei não apenas não são oficiais, mas também aplicam o endereço no nível de serviço em um arquivo composto. Nunca há qualquer menção ou sugestão de outras opções.
Se eu movesse essas linhas com o endereço IP para longe do serviço e para a parte que faz referência à rede docker macvlan no arquivo de composição, e então deixasse os serviços como antes, para que eles usassem aquela farsa de NAT, mas pelo menos atrás de um independente endereço do host, isso funcionaria?
Encontrei este trecho no GitHub que serve de exemplo:
#
# macvlan def
docker network create -d macvlan \
--subnet=192.168.0.0/24 \
--gateway=192.168.0.1 \
--ip-range=192.168.0.100/28 \
-o parent=eth0 vdsm
#
# compose file
services:
dsm:
container_name: dsm
..<snip>..
networks:
vdsm:
ipv4_address: 192.168.0.100 ╮
│ ↙︎ MOVE SOMEWHERE DOWN HERE
networks: ╭────────────────────╯
vdsm: ↓ ← macvlan/EXT NETWORK REF
external: true
É como uma abordagem híbrida macvlan + NAT (rede de ponte), eu acho. De qualquer forma, funcionaria?
Obrigado.
No Docker, o driver de rede macvlan permite atribuir um endereço MAC e consequentemente um endereço IP à interface de rede virtual de um contêiner, fazendo com que ele apareça como um dispositivo padrão em sua rede. Cada contêiner conectado a uma rede macvlan recebe seu endereço IP exclusivo que pode ser acessado dentro da LAN e potencialmente de redes externas, dependendo da configuração da sua rede.
No entanto, com base na documentação do Docker e na prática padrão, a rede macvlan não fornece um mecanismo para atribuir um endereço IP compartilhado entre um grupo de contêineres da maneira que você descreveu - onde vários contêineres se comportam essencialmente como um só com um único IP endereço em uma rede macvlan. Cada contêiner na rede macvlan geralmente obtém seu próprio endereço IP exclusivo.
A principal razão para isso é que um endereço IP está associado a uma interface de rede, e cada contêiner obtém sua interface de rede virtual quando conectado a uma rede macvlan. O método que você descreveu, tentar mover a atribuição de endereço IP do nível de serviço para a definição de rede, não funcionaria porque a atribuição de endereço IP deve ser feita por contêiner (por serviço). O macvlan do Docker atualmente não suporta a atribuição de um único IP a vários contêineres, pois quebra o design fundamental da rede IP – um IP por interface de rede – ao qual o macvlan adere.
O driver Macvlan no Docker é principalmente para cenários onde você deseja que seus contêineres apareçam como hosts físicos na rede, cada um com seu próprio endereço IP, em vez de compartilhar um único IP. Se você precisar que vários serviços (contêineres) sejam acessados por meio de um único IP, normalmente você os colocaria atrás de um balanceador de carga ou proxy reverso que gerenciaria o tráfego de entrada para os contêineres individuais com base em sua configuração (portas, caminhos, etc.). ).
Sua melhor opção, se você deseja ter um IP estático para um grupo de serviços, seria configurar um dispositivo ou serviço externo, como um balanceador de carga ou um proxy reverso, para ter o IP estático e encaminhar as solicitações para os contêineres apropriados. seus respectivos endereços IP atribuídos pelo macvlan. Isso mantém cada contêiner com seu IP exclusivo, ao mesmo tempo que apresenta uma frente unificada por meio do IP estático do balanceador de carga.
Se você estiver usando o Docker para Mac ou Windows, observe que há uma limitação contínua em que as redes macvlan não permitem que o próprio host se comunique com os contêineres conectados ao macvlan devido à forma como os namespaces de rede são implementados. Isso pode ser contornado em hosts Linux criando uma interface macvlan no host, conforme sugerido no GitHub, mas tal solução alternativa pode não ser aplicável ou pode exigir etapas diferentes em outros sistemas operacionais.