celaut-project / nodo

Service Orchestration for Distributed Networks
1 stars 0 forks source link

Container Connections #4

Closed jse07 closed 3 years ago

jse07 commented 4 years ago

Todos los demonios deben escuchar en 0.0.0.0, para evitar problemas. Aun asi, ¿Como un contenedor emite una peticion a una direccion del localhost?¿Y si no es local host?

jse07 commented 4 years ago

Hay casos en los que un contenedor Docker puede requerir acceso a servicios para el host.

Hay dos opciones para lograr esto:

  1. Obtenga la dirección IP del host desde el contenedor con el siguiente código:

#get the IP of the host computer from within Docker container /sbin/ip route|awk '/default/ { print $3 }' Se puede acceder a cualquier servicio en el host a través de esta dirección IP, pero otros contenedores Docker tendrán una dirección IP o DNS diferente en la red Docker.

  1. Conecte el contenedor Docker a la red local ejecutando este comando:

docker run --network="host" Esto conectará el contenedor a la red host, lo que permite que el contenedor Docker llegue a cualquier servicio que se ejecute en el host a través de localhost. También funciona para cualquier otro contenedor Docker que se ejecute en la red local o tenga sus puertos expuestos al localhost.

La primera opcion obliga a enrutar todas las comunicaciones entre contenedores.

Por tanto, todos los contenedores deben ser ejecutados compartiendo la red del host.

jse07 commented 4 years ago

Tal vez se puedan usar con bridge, ya que los imports especificarán los puertos que van a usar. Pero, a no ser que iniciemos los imports antes del contenedor principal (la idea es que no haga falta), no podremos realizar toda la asignacion de puertos al iniciar el contenedor, se deben de asignar al momento en que se solicite al gateway... Concreatamente en Docker, no nos permite asignar puertos en caliente, la única opcion seria parar el contenedor, lo cual afectaría demasiado al rendimiento.

jse07 commented 4 years ago

https://github.com/docker/docker.github.io/issues/4942

jse07 commented 4 years ago

En los imports se especifica el puerto en el que se solicitará la petición, (o lista de puertos si se van a usar varias instancias simultáneas). En caso de que se pase el puerto por parámetro ( así el nodo lo tendría más facilidad para aplicar la red host) se pondría una referencia a la variable en el build del contenedor.

jse07 commented 4 years ago

No se pueden crear dobles enlaces entre contenedores, hacer docker run -p 8080:8080 alpine1, y despues docker run -p 8080:8080 alpine2, ya que el puerto 8080 del host ya no esta disponible. https://docs.docker.com/network/network-tutorial-standalone/

jse07 commented 4 years ago

Por lo tanto, la comunicacion entre contenedores debe efectuarse como trabajaba gateway al principio, devolviendo la ip a la que el contenedor debe conectarse. De esta forma no haría falta usar enlaces entre host y contenedor, ni siquiera para la API, y el contenedor solo debería de tener que especificar el puerto de su API.

jse07 commented 4 years ago

Ahora, que pasa si el gateway retorna la ip de un contenedor que no esta en la subred donde se encuentra el contenedor que solicita la peticion??

jse07 commented 3 years ago

Docker Desktop Windows ejecuta Docker Engine en un WSL2 backend, por lo que no nos podemos conectar directamente a las ip de los contenedores con un host Windows.

https://docs.docker.com/docker-for-windows/networking/