Tengo dos docker-compose.ymlarchivos separados en dos carpetas diferentes:
~/front/docker-compose.yml~/api/docker-compose.yml
¿Cómo puedo asegurarme de que un contenedor frontpuede enviar solicitudes a un contenedor api?
Sé que esa --default-gatewayopción se puede configurar usando docker runun contenedor individual, de modo que se puede asignar una dirección IP específica a este contenedor, pero parece que esta opción no está disponible cuando se usa docker-compose.
Actualmente termino haciendo una docker inspect my_api_container_idy miro la puerta de enlace en la salida. Funciona, pero el problema es que esta IP se atribuye aleatoriamente, por lo que no puedo confiar en ella.
Otra forma de esta pregunta podría ser:
- ¿Puedo atribuir una dirección IP fija a un contenedor particular usando docker-compose?
Pero al final lo que estoy cuidando es:
- ¿Cómo se pueden comunicar entre sí dos proyectos diferentes de compilación acoplable?
networking
docker
docker-compose
Jivan
fuente
fuente

Respuestas:
Solo necesita asegurarse de que los contenedores con los que desea comunicarse estén en la misma red. Las redes son una construcción de acoplador de primera clase, y no son específicas para componer.
...
Luego pueden hablar entre ellos utilizando el nombre del servicio. De
frontusted puede hacerping apiy viceversa.fuente
namepropiedad, lo que deshabilitará el pre-pendiente automático con el nombre del proyecto. Luego, cualquier proyecto puede usar esa red y crearla automáticamente si aún no existe.Solo una pequeña adición a la excelente respuesta de @ johnharris85, cuando está ejecutando un archivo de compilación de docker,
defaultse crea una red " " para que pueda agregarlo al otro archivo de componer como una red externa:...
Para mí, este enfoque era más adecuado porque no poseía el primer archivo docker-compose y quería comunicarme con él.
fuente
services:la etiqueta, sería la sintaxisnetworks:anidado entoncesfront_default:(quitar el "-") y luego anidar una IP estática:ipv4_address: '172.20.0.44'ACTUALIZACIÓN: A partir de componer archivo versión 3.5:
Esto ahora funciona:
docker-compose up -dse unirá a una red llamada 'custom_network'. Si no existe, ¡se creará!Ahora puedes hacer esto:
Esto creará un contenedor que estará en la red externa.
¡Todavía no puedo encontrar ninguna referencia en los documentos pero funciona!
fuente
Todos los contenedores de
apipueden unirse a la redfrontpredeterminada con la siguiente configuración:Consulte la guía de redacción de Docker: uso de una red preexistente (consulte al final)
fuente
La información de las publicaciones anteriores es correcta, pero no tiene detalles sobre cómo vincular contenedores, que deben conectarse como "enlaces externos".
Espero que este ejemplo te sea más claro:
Suponga que tiene app1 / docker-compose.yml, con dos servicios (svc11 y svc12), y app2 / docker-compose.yml con dos servicios más (svc21 y svc22) y suponga que necesita conectarse de forma cruzada:
svc11 necesita conectarse al contenedor de svc22
Entonces la configuración debería ser así:
esto es app1 / docker-compose.yml:
esto es app2 / docker-compose.yml:
fuente
Desde Compose 1.18 (espec. 3.5), puede anular la red predeterminada utilizando su propio nombre personalizado para todos los archivos Compose YAML que necesite. Es tan simple como agregarles lo siguiente:
Otras respuestas han apuntado lo mismo; Este es un resumen simplificado.
fuente
Me aseguraría de que todos los contenedores estén
docker-composeen la misma red componiéndolos juntos al mismo tiempo, usando:fuente
linkodepends_onde un contenedor de frente a un contenedor de API?build path ~/front/api either does not exist or is not accessibleo al revés,build path ~/api/front either does not exist or is not accessibleACTUALIZACIÓN: A partir de componer archivo versión 3.5:
Encontré un problema similar y lo resolví agregando un pequeño cambio en uno de mi proyecto docker-compose.yml.
Por ejemplo tenemos dos api
scoringyner.Scoringapi necesita enviar una solicitud a lanerapi para procesar la solicitud de entrada. Para hacerlo, se supone que ambos comparten la misma red.Nota: Cada contenedor tiene su propia red que se crea automáticamente al momento de ejecutar la aplicación dentro de la ventana acoplable. Por ejemplo, la red ner api se creará como
ner_defaulty la red api de puntuación se denominará comoscoring default. Esta solución funcionará para la versión: '3'.Como en el escenario anterior, mi API de puntuación quiere comunicarse con una API ner, luego agregaré las siguientes líneas. Lo que significa que siempre que creo el contenedor para ner api, se agrega automáticamente a la red scoring_default.
ner / docker-compose.yml
puntuación / docker-compose.yml
Podemos ver cómo los contenedores anteriores ahora son parte de la misma red llamada
scoring_defaultusando el comando:fuente
Puede agregar un
.envarchivo en todos sus proyectos que contenganCOMPOSE_PROJECT_NAME=somename.COMPOSE_PROJECT_NAME anula el prefijo utilizado para nombrar recursos, por lo que todos sus proyectos utilizarán
somename_defaultcomo su red, lo que hace posible que los servicios se comuniquen entre sí como lo estaban en el mismo proyecto.NB: Recibirá advertencias para contenedores "huérfanos" creados a partir de otros proyectos.
fuente
fuente
segundo docker-compose.yml
fuente
Otra opción es simplemente ejecutar el primer módulo con 'docker-compose', verificar la ip relacionada con el módulo y conectar el segundo módulo con la red anterior como externa, y apuntar la ip interna
ejemplo app1: nueva red creada en las líneas de servicio, marca como externa: verdadera en la parte inferior app2: indica la "nueva red" creada por app1 cuando sube, marca como externa: verdadera en la parte inferior y configura la configuración para conectarse, la ip que app1 tiene en esta red.
Con esto, deberían poder hablar entre ellos
* de esta manera es solo para el enfoque de prueba local, con el fin de no hacer una configuración demasiado compleja ** Sé que es muy 'parche' pero funciona para mí y creo que es tan simple que otros pueden aprovechar esto
fuente
Si usted es
Connection refusedmientras intenta comunicarse entre dos contenedoresY tú quieres
api_acomunicarse conapi_b(o viceversa) sin la misma "red de acopladores"(ejemplo a continuación)
puede usar el "host" del segundo contenedor como IP de su computadora y el puerto que se asigna desde el contenedor Docker. Puede obtener la IP de su computadora con este script (desde: Encontrar direcciones IP locales usando stdlib de Python ):
Ejemplo:
project_api_a/docker-compose.yml:dentro del
api_acontenedor estás ejecutando la aplicación Django:manage.py runserver 0.0.0.0:8000y el segundo docker-compose.yml de otro proyecto:
project_api_b/docker-compose-yml:dentro del
api_bcontenedor estás ejecutando la aplicación Django:manage.py runserver 0.0.0.0:8001E intentar conectar desde el contenedor
api_aa laapi_bURL delapi_bcontenedor será:http://<get_ip_from_script_above>:8001/Puede ser especialmente valioso si está utilizando incluso más de dos (tres o más) proyectos compuestos por docker y es difícil proporcionar una red común para todo esto: es una buena solución y solución
fuente