Planeo dividir mi servidor monolítico en muchos contenedores acoplables pequeños, pero todavía no he encontrado una buena solución para la "comunicación entre contenedores". Este es mi escenario objetivo:
Sé cómo vincular contenedores y cómo exponer puertos, pero ninguna de estas soluciones me satisface.
¿Existe alguna solución para comunicarse a través de nombres de host (nombres de contenedor) entre los contenedores como en una red de servidor tradicional?
networking
docker
Patrick Gotthard
fuente
fuente
Respuestas:
Editar: después de Docker 1.9, el
docker network
comando (ver más abajo https://stackoverflow.com/a/35184695/977939 ) es la forma recomendada de lograr esto.Mi solución es configurar un dnsmasq en el host para que el registro DNS se actualice automáticamente: los registros "A" tienen los nombres de los contenedores y apuntan a las direcciones IP de los contenedores automáticamente (cada 10 segundos). El script de actualización automática se pega aquí:
Asegúrese de que su servicio dnsmasq esté disponible el
docker0
. Luego, comience su contenedor con--dns HOST_ADDRESS
para usar este servicio mini dns.Referencia: http://docs.blowb.org/setup-host/dnsmasq.html
fuente
La nueva función de red le permite conectarse a contenedores por su nombre, por lo que si crea una nueva red, cualquier contenedor conectado a esa red puede llegar a otros contenedores por su nombre. Ejemplo:
1) Crear nueva red
2) Conectar contenedores a la red
o
3) Contenedor de ping por nombre
Consulte esta sección de la documentación;
Nota: A diferencia de la herencia,
links
la nueva red no creará variables de entorno ni las compartirá con otros contenedores.Actualmente, esta función no admite alias
fuente
docker-compose down,up,restart
?bridge
red predeterminada debido a la compatibilidad con versiones anteriores, pero sí, estoy de acuerdo, ¡ definitivamente debería estar habilitado de manera predeterminada!Eso debería ser lo que
--link
es de , al menos para la parte de nombre de host.Con Docker 1.10 y PR 19242 , eso sería:
(ver la última sección a continuación)
Eso es lo que actualiza los
/etc/hosts
detalles del archivo.Por ejemplo, inicie un servidor LDAP:
Y defina una imagen para probar ese servidor LDAP:
Puede exponer el "
openldap
contenedor comointernalopenldap
" dentro de la imagen de prueba con --link:Entonces, si escribe 'lds', ese alias funcionará:
Eso devolvería a la gente. El significado
internalopenldap
se alcanza correctamente a partir de laldaptest
imagen.Por supuesto, se agregará Docker 1.7
libnetwork
, que proporciona una implementación nativa de Go para conectar contenedores. Vea la publicación del blog .Introdujo una arquitectura más completa, con el Container Network Model (CNM)
Eso actualizará la CLI de Docker con nuevos comandos de "red" y documentará cómo
-net
se usa el indicador " " para asignar contenedores a las redes.docker 1.10 tiene una nueva sección alias de ámbito de red , ahora oficialmente documentada en
network connect
:fuente
EDITAR : Ya no es de vanguardia: http://blog.docker.com/2016/02/docker-1-10/
Respuesta original
Luché con él toda la noche. Si no le teme a la vanguardia, la última versión del motor Docker y Docker componen implementan libnetwork.
Con el archivo de configuración correcto (que debe colocarse en la versión 2), creará servicios que se verán entre sí. Y, además, también puede escalarlos con docker-compose (puede escalar cualquier servicio que desee que no vincule el puerto en el host)
Aquí hay un archivo de ejemplo
Y la referencia para esta nueva versión del archivo de redacción: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
fuente
Hasta donde yo sé, usando solo Docker esto no es posible. Necesita algo de DNS para mapear las direcciones IP del contenedor a los nombres de host.
Si quieres una solución lista para usar. Una solución es utilizar, por ejemplo, Kontena . Viene con tecnología de superposición de red de Weave y esta tecnología se utiliza para crear redes LAN privadas virtuales para cada servicio y se puede acceder a cada servicio
service_name.kontena.local-address
.Aquí hay un ejemplo simple del archivo YAML de la aplicación Wordpress donde el servicio Wordpress se conecta al servidor MySQL con la dirección wordpress-mysql.kontena.local:
fuente