Conecte el contenedor Docker a la red de host y al puente interno

14

Estoy tratando de ejecutar un contenedor Docker como un enrutador entre una --internalred privada ( ) Docker y la hostred predefinida . Esto significa que el contenedor debe tener dos interfaces de red: una interfaz "externa", que puede acceder a todas las direcciones IP del host, y una interfaz "interna", que actúa como una puerta de enlace para los contenedores en la red interna de Docker

El contenedor del enrutador en sí enviará tráfico de red NAT desde / hacia los contenedores.

No he encontrado una manera de configurar Docker para ejecutar el contenedor con esas dos interfaces. Lo más cercano que podría obtener es tener dos bridgeinterfaces asignadas, que no es exactamente lo que necesito.

Intentar conectarse manualmente da como resultado un error:

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

¿Alguien puede mostrarme cómo lograr esto, preferiblemente incluso con Docker Compose?

Hexaholico
fuente
@PunMum Lamentablemente no. Terminamos conectando todos los contenedores directamente a la red host y configurando las IP dentro de los contenedores.
Hexaholic

Respuestas:

2

De acuerdo con estas preguntas y respuestas sobre github :

La red de host es especial. Tienes que usar network_mode: host en el servicio

030
fuente
El network_modeno funciona si necesita algo conectado a una red interna y la red host. Parece una locura que no podamos encontrar una buena solución clara para este problema.
jv-dev
2

Docker no permite conectar un contenedor a la red host y a cualquier otra red de puente Docker al mismo tiempo. Trataré de ilustrar la razón con un ejemplo:

  • Pensemos en un contenedor C1. Hipotéticamente, C1 estaría conectado a la red de host (--net = host) y a una red de puente Docker Br1 (--net = Br1).
  • Un segundo contenedor, digamos C2, está conectado a Br1.

Con la configuración anterior, supongo que la red del host es visible desde C2, y supongo que esta es la razón por la cual Docker automáticamente nos impide exponer involuntariamente la red del host a contenedores no especificados por el host.

Dicho esto, si tenemos un conjunto de contenedores, y queremos que todos estén interconectados, con solo un contenedor que tenga acceso a la red host, mi enfoque sería:

  • [C2, ..., CN] están conectados a un puente Docker definido por el usuario Br1 (--net = Br1)
  • C1 está conectado a la red de host (--net = host)
  • C1 expone un puerto para ser accesible desde el resto de contenedores

EDITAR: aún tendríamos que adaptar las políticas de iptables de tal manera que se pueda llegar a C1 desde el resto de contenedores (consulte https://docs.docker.com/network/iptables/ )

JJFanFer
fuente