desarrollo-web-br-bd.com

Comunicación entre múltiples proyectos docker-componer.

Tengo dos archivos docker-compose.yml separados en dos carpetas diferentes:

  • ~/front/docker-compose.yml
  • ~/api/docker-compose.yml

¿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:

  • ¿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 se pueden comunicar dos proyectos de ventana acoplable diferentes entre sí?
136
Jivan

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.

185
johnharris85

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.

51
Tal Joffe

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!

39
cstrutton

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)

22
dedek

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

  • svc21 necesita conectarse al contenedor de svc11.

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
7
Daniel Blanco

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 en 3.5 (o superior si no lo desaprueban en 4+).

Otras respuestas han apuntado lo mismo; Este es un resumen simplificado.

3
emyller

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
1
Nauraushaun