Connectez le conteneur Docker au réseau hôte et au pont interne

14

J'essaie d'exécuter un conteneur Docker en tant que routeur entre un --internalréseau Docker privé ( ) et le hostréseau prédéfini . Cela signifie que le conteneur doit avoir deux interfaces réseau: une interface "extérieure", qui peut accéder à toutes les adresses IP des hôtes, et une interface "intérieure", qui sert de passerelle pour les conteneurs du réseau Docker interne.

Le conteneur de routeur lui-même acheminera ensuite le trafic réseau NAT depuis / vers les conteneurs.

Je n'ai pas trouvé de moyen de configurer Docker pour exécuter le conteneur avec ces deux interfaces. Le plus proche que j'ai pu obtenir est d'avoir deux bridgeinterfaces assignées, ce qui n'est pas exactement ce dont j'ai besoin.

Une tentative de connexion manuelle entraîne une erreur:

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

Quelqu'un peut-il me montrer comment y parvenir, de préférence même avec Docker Compose?

Hexaholic
la source
@PunMum Malheureusement non. Nous avons fini par connecter tous les conteneurs directement au réseau hôte et à configurer les adresses IP à l'intérieur des conteneurs.
Hexaholic

Réponses:

2

Selon ce Q&A sur github :

Le réseau hôte est spécial. Vous devez utiliser network_mode: host sur le service

030
la source
Le network_modene fonctionne pas si vous avez besoin de quelque chose connecté à un réseau interne et au réseau hôte. Il semble insensé que nous ne puissions pas trouver une bonne solution claire à ce problème.
jv-dev
2

Docker ne permet pas de connecter un conteneur au réseau hôte et à tout autre réseau de pont Docker en même temps. Je vais essayer d'illustrer la raison avec un exemple:

  • Pensons à un conteneur C1. En théorie, C1 serait connecté au réseau hôte (--net = host) et à un réseau de pont Docker Br1 (--net = Br1).
  • Un deuxième conteneur, disons C2, est connecté à Br1.

Avec la configuration ci-dessus, je suppose que le réseau hôte est visible depuis C2, et je suppose que c'est la raison pour laquelle Docker nous empêche automatiquement d'exposer involontairement le réseau hôte à des conteneurs non spécifiés par l'hôte.

Cela étant dit, si nous avons un ensemble de conteneurs, et que nous voulons qu'ils soient tous interconnectés, avec un seul conteneur ayant accès au réseau hôte, mon approche serait:

  • [C2, ..., CN] sont connectés à un pont Docker défini par l'utilisateur Br1 (--net = Br1)
  • C1 est connecté au réseau hôte (--net = host)
  • C1 expose un port afin d'être accessible depuis le reste des conteneurs

EDIT: Nous aurions encore à adapter les politiques iptables de telle manière que C1 puisse être atteint à partir du reste des conteneurs (voir https://docs.docker.com/network/iptables/ )

JJFanFer
la source