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).
fuente
container A of service X + container B of service Y
o paracontainer 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--name
opción de crear el servicio deRespuestas:
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:a1b3d130275a
con nombre de hostserviceX.1.nq4rjbae
65040b1cada6
con nombre de hostserviceX.2.m9wl1f1r
944704427b9e
con 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: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:a1b3d130275a
con nombre de hostserviceX.1.nq4rjbae
65040b1cada6
con 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--name
parámetro:Y puede confiar en que el contenedor
a1b3d130275a
se resolverá por nombre de hostserviceX
y el contenedor65040b1cada6
por nombre de hostserviceY
.Referencia:
fuente