¿Cómo conectar contenedores Docker?
En "¿Qué es un contenedor?" los dockerdocumentos muestran la siguiente imagen ingeniosa :
Para mi escenario, solo tengo la aplicación A y la aplicación B; llamémoslos Alice y Bob. ¿Cómo se comunican Alice y Bob, general y específicamente? Utilizando el principio KISS, concretamente estoy usando MySQLy BaseXdesde el docker hub.
La noción es para un xqueryarchivo que reside en el host, que luego se envía al BaseXcontenedor para su ejecución. Esta consulta específica es en realidad SQL, por lo MySQLque será necesario consultar el contenedor para obtener el resultado.
¿Requiere esto reenvío de puertos u otros enfoques de redes ? Volúmenes ¿Requiere esto un archivo de redacción adicional compuesto por, a su vez, MySQLy BaseX?
Sin duda, hay muchos enfoques posibles. ¿Qué es lo más pragmático, desde una perspectiva de aprendizaje? Conceptualmente ligero, con una curva de aprendizaje gradual.
Un enfoque parece utilizar la red puente:
Aprovechando que los contenedores pueden verse entre sí.
Esto no me parece relacionado con RESTlos servicios web completos.
En cuanto a las preguntas relacionadas, esto podría tocar un proxy inverso.
Respuestas
También soy bastante nuevo en el juego Docker, pero tengo algunos pequeños proyectos que hago exactamente lo que me pides. A través de mi propia experiencia con prueba y error (principalmente error ...), sugeriría usar un docker-compose.yml con su red configurada en IP internas estáticas para que cada contenedor tenga resultados e IP predecibles y repetibles que pueda configurar sus contenedores para comunicarse.
No estoy familiarizado, BaseXpero tengo una situación de muestra que usa docker-compose version: "3.7"aquí que podría ejecutar fácilmente múltiples aplicaciones y / o agregarse o reutilizarse para que se ajuste a su hipótesis.
Este ejemplo de docker-compose tiene lo siguiente:
Un contenedor separado para llenar mi
app-volumevolumen con el contenido de un repositorio público de GitHub.Un contenedor de servidor web Apache con PHP-FPM habilitado para un "backend selectivo" que se crea a partir de un Dockerfile en el directorio ~ / dockerbuild.
Un contenedor de servidor web nginx utilizado como proxy inverso para que todo lo relacionado con PHP se pase a Apache (pero sirve y almacena en caché prácticamente todo lo demás).
Un contenedor MariaDB en la mezcla para la base de datos de la aplicación que lleno con un archivo mysqldump después de que se compila la aplicación.
Esta es una versión reducida de mi docker-compose.yml, así que tenga en cuenta que puede agregar una variedad de cosas como healthcheck:y command:para satisfacer sus necesidades.
Ejecuta con docker-compose up -d --buildpara construir e iniciar su aplicación en un solo comando (pero probablemente desee crear su propio archivo ba (.sh) que ejecutará después, también para esos importantes toques finales).
Toma nota de static-network. Y aunque estoy usando volúmenes con nombre en el ejemplo, esa es solo una preferencia mía.
version: "3.7"
services:
github_repo_clone:
image: debian:latest
container_name: github_repo_clone
networks:
static-network:
ipv4_address: 172.20.0.254
command: bash -c "
apt-get update &&
apt-get install git -y &&
rm -rf examplerepo &&
git clone https://github.com/exampleuser/examplerepo.git &&
rm -rf /var/www/vhosts/exampleuser/examplerepo &&
mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
rm -rf examplerepo &&
tail -f /dev/null
"
volumes:
- app-volume:/var/www/vhosts
apache_php-fpm_backend:
container_name: debian-build-demo0
build: ~/dockerbuild
ports:
- "8080:8080"
networks:
static-network:
ipv4_address: 172.20.0.2
volumes:
- app-volume:/var/www/vhosts
nginx_rp:
image: nginx:latest
container_name: nginx-build-demo0
ports:
- "80:80"
- "443:443"
networks:
static-network:
ipv4_address: 172.20.0.3
volumes:
- app-volume:/var/www/vhosts
mariadb:
restart: always
image: mariadb:latest
container_name: mariadb-build-demo0
ports:
- "3306:3306"
networks:
static-network:
ipv4_address: 172.20.0.10
environment:
- MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
- MYSQL_DATABASE=dbnamegoeshere
volumes:
- app-volume:/var/www/vhosts
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 10s
retries: 5
volumes:
app-volume:
# external: true
networks:
static-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
Mi comando de limpieza cuando desactivo la aplicación es algo feo, pero no es terriblemente difícil de leer y dice algo como esto: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;
Creo que cada "aplicación independiente" podría (y probablemente debería) tener su propio docker-compose y / o Dockerfiles, pero puede encontrar sinergias con ciertos Dockerfiles para los que puede crear command:instrucciones personalizadas (como el ejemplo de git_repo_clone) para usar & compartido en varias "aplicaciones".