same network example different compose networking docker docker-compose

networking - network - Comunicación entre múltiples proyectos docker-compose



docker-compose external network (9)

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 el front puede enviar solicitudes a un contenedor en la api ?

Sé que la opción --default-gateway se puede configurar usando docker run para 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 utiliza 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 particular usando docker-compose?

Pero al final lo que estoy cuidando es:

  • ¿Cómo pueden comunicarse entre sí dos proyectos diferentes de compilación acoplable?

Para usar otra red docker-compose, simplemente haga lo siguiente (para compartir redes entre docker-compose):

  1. Ejecute el primer proyecto docker-compose por up -d
  2. Encuentre el nombre de la red del primer docker-compose por: docker network ls (contiene el nombre del proyecto del directorio raíz)
  3. Luego use ese nombre con esta estructura a continuación en el segundo archivo docker-compose.

segundo docker-compose.yml

version: ''3'' services: service-on-second-compose: # Define any names that you want. . . . networks: - <put it here(the network name that comes from "docker network ls")> networks: - <put it here(the network name that comes from "docker network ls")>: external: true


ACTUALIZACIÓN: a partir de la versión 3.5 del archivo de composició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, ¡se creará!

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!


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:

networks: default: name: my-app

Lo anterior supone que tiene la version establecida en 3.5 (o superior si no la desaprobarán en 4+).

Otras respuestas han señalado lo mismo; Este es un resumen simplificado.


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

  • svc21 necesita conectarse al contenedor de svc11.

Entonces 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


Me aseguraría de que todos los contenedores estén compuestos por docker-compose en la misma red componiéndolos juntos al mismo tiempo, usando:

docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d


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.

# 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 utilizando el nombre del servicio. Desde el front puedes hacer ping api y viceversa.


Solo una pequeña adición a la excelente respuesta de @ johnharris85, cuando está ejecutando un archivo de composición de docker, se crea una red " default " para que pueda agregarla al otro archivo de composició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 docker-compose y quería comunicarme con él.


Todos los contenedores de api pueden unirse a la red front predeterminada con la siguiente configuración:

# api/docker-compose.yml ... networks: default: external: name: front_default

Consulte la guía de redacción de Docker: uso de una red preexistente (consulte al final)


version: ''2'' services: bot: build: . volumes: - ''.:/home/node'' - /home/node/node_modules networks: - my-rede mem_limit: 100m memswap_limit: 100m cpu_quota: 25000 container_name: 236948199393329152_585042339404185600_bot command: node index.js environment: NODE_ENV: production networks: my-rede: external: name: name_rede_externa