Tengo dos docker-compose.yml
archivos separados en dos carpetas diferentes:
~/front/docker-compose.yml
~/api/docker-compose.yml
¿Cómo puedo asegurarme de que un contenedor front
puede enviar solicitudes a un contenedor api
?
Sé que esa --default-gateway
opción se puede configurar usando docker run
un 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_id
y 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
front
usted puede hacerping api
y viceversa.fuente
name
propiedad, 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,
default
se 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 -d
se 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
api
pueden unirse a la redfront
predeterminada 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-compose
en la misma red componiéndolos juntos al mismo tiempo, usando:fuente
link
odepends_on
de un contenedor de frente a un contenedor de API?build path ~/front/api either does not exist or is not accessible
o al revés,build path ~/api/front either does not exist or is not accessible
ACTUALIZACIÓ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
scoring
yner
.Scoring
api necesita enviar una solicitud a laner
api 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_default
y 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_default
usando el comando:fuente
Puede agregar un
.env
archivo 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_default
como 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 refused
mientras intenta comunicarse entre dos contenedoresY tú quieres
api_a
comunicarse 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_a
contenedor estás ejecutando la aplicación Django:manage.py runserver 0.0.0.0:8000
y el segundo docker-compose.yml de otro proyecto:
project_api_b/docker-compose-yml
:dentro del
api_b
contenedor estás ejecutando la aplicación Django:manage.py runserver 0.0.0.0:8001
E intentar conectar desde el contenedor
api_a
a laapi_b
URL delapi_b
contenedor 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