Comunicación entre múltiples proyectos de Docker-Compose
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
pueda enviar solicitudes a un contenedor en api
?
Sé que esa --default-gateway
opción se puede configurar usando docker run
para un contenedor individual, de modo que se pueda 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 un 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 en particular usando Docker-Compose?
Pero al final lo que estoy cuidando es:
- ¿Cómo pueden comunicarse entre sí dos proyectos diferentes de Docker-Compose?
Sólo necesita asegurarse de que los contenedores con los que desea comunicarse entre sí estén en la misma red. Las redes son una construcción acoplable de primera clase y no son específicas de componer.
# front/docker-compose.yml
version: '2'
services:
front:
...
networks:
- some-net
networks:
some-net:
driver: bridge
...
# api/docker-compose.yml
version: '2'
services:
api:
...
networks:
- front_some-net
networks:
front_some-net:
external: true
Nota: La red de su aplicación recibe un nombre basado en el "nombre del proyecto", que se basa en el nombre del directorio en el que reside; en este caso,
front_
se agregó un prefijo.
Luego podrán hablar entre sí utilizando el nombre del servicio. De front
puedes hacer ping api
y viceversa.
ACTUALIZACIÓN: A partir de la versión 3.5 del archivo de redacción:
Esto ahora funciona:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
docker-compose up -d
se unirá a una red llamada 'custom_network'. ¡Si no existe, será creado!
root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done
Ahora puedes hacer esto:
version: "2"
services:
web:
image: hello-world
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
Esto creará un contenedor que estará en la red externa.
Todavía no puedo encontrar ninguna referencia en los documentos, ¡pero funciona!
Solo una pequeña adición a la gran respuesta de @johnharris85: cuando ejecuta un archivo de redacción acoplable, default
se crea una " " red para que pueda agregarla al otro archivo de redacción como una red externa:
# front/docker-compose.yml
version: '2'
services:
front_service:
...
...
# api/docker-compose.yml
version: '2'
services:
api_service:
...
networks:
- front_default
networks:
front_default:
external: true
Para mí, este enfoque era más adecuado porque no poseía el primer archivo de Docker-Compose y quería comunicarme con él.