¿Cómo puede un contenedor Docker llamar a otro contenedor Docker?
Tengo dos contenedores Docker
- Una API web
- Una aplicación de consola que llama a la API web
Ahora, en mi API web local hay un host local y la aplicación de consola no tiene problemas para llamar a la API. Sin embargo, no tengo idea de cuándo se acoplan estas dos cosas, ¿cómo puedo hacer que la URL de la API acoplable esté disponible para la aplicación de consola acoplable?
No creo que necesite Docker Compose porque estoy pasando la URL de la API como argumento de la API, por lo que solo es cuestión de asegurarme de que la Dockerized API's
URL sea accesible paraDockerized Console
¿Algunas ideas?
La idea no es pasar la URL, sino el nombre de host del otro contenedor al que desea llamar.
Ver redes en Redactar
De forma predeterminada, Compose configura una única red para su aplicación. Cada contenedor de un servicio se une a la red predeterminada y otros contenedores de esa red pueden acceder a él y descubrirlo en un nombre de host idéntico al nombre del contenedor.
Esto es lo que reemplaza la opción obsoleta--link
.
Y si sus contenedores no se ejecutan en un solo nodo del servidor Docker, el modo Docker Swarm permitiría esa capacidad de descubrimiento en múltiples nodos.
Esta es la mejor manera que he encontrado para conectar varios contenedores en una máquina local/clúster único.
Dado: servicio-proveedor-de-datos, servicio-consumidor-de-datos
- Opción 1: usar la red
docker network create data-network
docker run --name=data-provider-service --net=data-network -p 8081:8081 data-provider-image
docker run --name=data-consumer-service --net=data-network -p 8080:8080 data-consumer-image
Asegúrese de utilizar URI como: http://data-provider-service:8081/
dentro de su data-consumer-service
.
- Opción 2: usar Docker Compose
Puede definir ambos servicios en un archivo docker-compose.yml y usar depends_on
la propiedad en data-provider-service
. p.ej
data-consumer-service:
depends_on:
- data-provider-service
Puedes ver más detalles aquí en mi publicación de Medium: https://saggu.medium.com/how-to-connect-nultiple-docker-conatiners-17f7ca72e67f
Puedes usar la link
opción con docker run
:
Ejecute la API:
docker run -d --name api api_image
Ejecute el cliente:
docker run --link api busybox ping api
Deberías ver que eso api
se puede resolver mediante Docker.
Dicho esto, seguir docker-compose
siendo una mejor opción.
El problema se puede resolver fácilmente si se utiliza la función de redacción. Con componer, simplemente crea un archivo de configuración ( docker-compose.yml
) como este:
version: '3'
services:
db:
image: postgres
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
Para que se ejecute, simplemente llame up
así:
docker-compose up
Esta es la mejor manera de ejecutar toda su pila, así que consulte esta referencia: https://docs.docker.com/compose/
¡Éxito!