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):
- Ejecute el primer proyecto docker-compose por
up -d
- Encuentre el nombre de la red del primer docker-compose por:
docker network ls
(contiene el nombre del proyecto del directorio raíz)- 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 en3.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