Tengo dos archivos docker-compose.yml
separados en dos carpetas diferentes:
¿Cómo puedo asegurarme de que un contenedor en front
pueda enviar solicitudes a un contenedor en api
?
Sé que la opción --default-gateway
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 al azar, por lo que no puedo confiar en ella.
Otra forma de esta pregunta podría ser:
Pero al final lo que estoy cuidando es:
Solo debe asegurarse de que los contenedores que desea hablar entre ellos estén en la misma red. Las redes son una construcción docker de primera clase, y no específica para 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 vive, en este caso se agregó un prefijo
front_
Luego pueden hablar entre ellos usando el nombre del servicio. Desde front
puede hacer ping api
y viceversa.
Solo una pequeña adición a la gran respuesta de @ johnharris85, cuando está ejecutando un archivo de redacción acoplable, se crea una red "default
" 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 era el propietario del primer archivo de composición acoplable y quería comunicarme con él.
ACTUALIZACIÓN: A partir de la versión del archivo compose 3.5:
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!
[email protected]:~# 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.
No puedo encontrar ninguna referencia en los documentos todavía, pero funciona!
Todos los contenedores de api
pueden unirse a front
default network con la siguiente configuración:
# api/docker-compose.yml
...
networks:
default:
external:
name: front_default
Consulte la guía de composición de la ventana acoplable: usando una red preexistente (vea en la parte inferior)
La información de las publicaciones anteriores es correcta, pero no tiene detalles sobre cómo vincular los contenedores, que deben estar conectados como "enlaces_control externo".
Espero que este ejemplo te quede más claro:
Supongamos 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 supone que necesita conectarse de forma cruzada:
svc11 necesita conectarse al contenedor de svc22
Así que la configuración debería ser así:
esto es app1/docker-compose.yml:
version: '2'
services:
svc11:
container_name: container11
[..]
networks:
- default # this network
- app2_default # external network
external_links:
- container22:container22
[..]
svc12:
container_name: container12
[..]
networks:
default: # this network (app1)
driver: bridge
app2_default: # external network (app2)
external: true
esto es app2/docker-compose.yml:
version: '2'
services:
svc21:
container_name: container21
[..]
networks:
- default # this network (app2)
- app1_default # external network (app1)
external_links:
- container11:container11
[..]
svc22:
container_name: container22
[..]
networks:
default: # this network (app2)
driver: bridge
app1_default: # external network (app1)
external: true
Desde Componer 1.18 (espec. 3.5), puede anular la red predeterminada utilizando su propio nombre personalizado para todos los archivos de Componente YAML que necesita. Es tan simple como agregarles lo siguiente:
networks:
default:
name: my-app
Lo anterior asume que tienes
version
establecido en3.5
(o superior si no lo desaprueban en 4+).
Otras respuestas han apuntado lo mismo; Este es un resumen simplificado.
Me aseguraría de que todos los contenedores estén docker-compose
'd en la misma red al componerlos al mismo tiempo, usando:
docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d