¿Cómo resuelvo correctamente la IP de otro contenedor en un Docker Swarm? (DNS)

5

Estoy jugando con la implementación de servicios en un Docker Swarm. Tengo problemas para permitir que un contenedor se conecte constantemente a un contenedor en un nodo diferente.

Digamos que estoy construyendo un grupo de GlusterFS; Necesito abrir una terminal en cada contenedor y agregar el demonio Gluster a la piscina. ¿Cómo me refiero a otros contenedores en la piscina? Actualmente estoy usando una dirección IP, pero ¿qué pasa si un contenedor muere y se recrea? Hasta donde sé, no hay garantía de que el nuevo contenedor tenga la misma dirección IP. Podría usar el servidor DNS incorporado para referirme a los otros contenedores, pero parece que solo puedo resolver nombres de contenedores e ID de contenedores a direcciones IP, y ambos cambiarán si un contenedor muere y se recrea, por lo que no tiene sentido.

¿No debería poder resolver los nombres de host de los otros contenedores en sus direcciones IP? Asumí que lo haría, pero no lo hace.

¿Hay alguna solución a mi enigma? (Tengo la sensación de que podría estar usando servicios incorrectamente, y que en este caso debería crear manualmente un contenedor en cada nodo).

Hubro
fuente
¿Estás tratando de resolver nombres de host para una situación como container A of service X + container B of service Yo para container A of service X + container B of service X? Entonces, ¿está hablando de réplicas que deberían poder conectarse entre sí utilizando sus nombres de host o es su pregunta sobre dos servicios diferentes que deben conectarse entre sí? Más adelante debería lograrse fácilmente mediante la --nameopción de crear el servicio de
acoplador

Respuestas:

6

Dependiendo de su situación exacta, debe usar diferentes soluciones:

Resolución de nombre de host dentro del servicio

Problema: tiene varios contenedores (/ réplicas) del mismo servicio serviceX, por ejemplo:

  • contenedor a1b3d130275acon nombre de hostserviceX.1.nq4rjbae
  • contenedor 65040b1cada6con nombre de hostserviceX.2.m9wl1f1r
  • contenedor 944704427b9econ nombre de hostserviceX.3.3d08baql

Ahora, desea recuperar el nombre de host del segundo ( serviceX.2.m9wl1f1r) y el tercer ( serviceX.3.3d08baql) contenedor desde el contenedor one ( serviceX.1.nq4rjbae).

Docker proporciona una solución llamada descubrimiento de contenedores utilizando una consulta DNS contra tasks.$serviceName, por ejemplo:

nslookup tasks.serviceX
[...]
Name:      tasks.serviceX
Address 1: 10.0.0.205 a1b3d130275a  (<- resolved locally by /etc/hosts)
Address 2: 10.0.0.206 serviceX.2.m9wl1f1r
Address 3: 10.0.0.207 serviceX.3.3d08baql

También hay discusiones sobre serviceX.{1,2,3}cómo resolver y, por lo tanto, crear nombres de host predecibles. ² ³ ⁴ Pero por ahora, ninguno de estos está implementado, por lo que esta solución solo funciona en tiempo de ejecución.

Nota: Establecer el nombre de host usando la función de plantilla (como docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}) haría que los nombres de host sean localmente predecibles, pero otros contenedores no podrán resolverlos.

Resolución de nombres de host entre servicios

Problema: Usted tiene contenedores mutliple de los diferentes servicios serviceX, serviceY. Pero solo un contenedor por servicio, por ejemplo:

  • contenedor a1b3d130275acon nombre de hostserviceX.1.nq4rjbae
  • contenedor 65040b1cada6con nombre de hostserviceY.2.m9wl1f1r

Y desea conectarse a un contenedor de otro servicio ( serviceX) desde un servicio ( serviceY) y viceversa. Solo tiene que usar el --nameparámetro:

docker service create --name=serviceX serviceX
docker service create --name=serviceY serviceY

Y puede confiar en que el contenedor a1b3d130275ase resolverá por nombre de host serviceXy el contenedor 65040b1cada6por nombre de host serviceY.

Referencia:

Murmel
fuente