Come collegare i contenitori Docker?
In "Cos'è un contenitore?" i dockerdocumenti mostrano la seguente immagine elegante :
Per il mio scenario ho solo l'App A e l'App B; designiamoli Alice e Bob. Come comunicano Alice e Bob, in generale e nello specifico? Utilizzando il principio KISS, concretamente sto usando MySQLe BaseXdal docker hub.
L'idea è di un xqueryfile che risiede sull'host, che viene quindi inviato al BaseXcontenitore per l'esecuzione. Questa query specifica è effettivamente SQL, quindi il MySQLcontenitore dovrà essere interrogato per il risultato.
Ciò richiede il port forwarding o altri approcci di rete ? Volumi? Ciò richiede un file di composizione aggiuntivo composto da, a sua volta, MySQLe BaseX?
Senza dubbio ci sono molti approcci possibili. Qual è il più pragmatico, da una prospettiva di apprendimento? Concettualmente leggero, con una curva di apprendimento graduale.
Un approccio sembra utilizzare il bridge networking:
Approfittando del fatto che i contenitori possono vedersi .
Questo non mi sembra correlato a RESTservizi web completi.
Guardando le domande correlate, questo potrebbe toccare un proxy inverso.
Risposte
Sono ancora abbastanza nuovo anche nel gioco Docker, ma ho alcuni piccoli progetti che faccio esattamente quello che mi chiedi. Attraverso la mia esperienza con tentativi ed errori (principalmente errori ...), suggerirei di utilizzare un docker-compose.yml con la tua rete impostata su IP interni statici in modo che ogni contenitore abbia risultati prevedibili e ripetibili e IP che puoi configurare i tuoi contenitori per comunicare attraverso.
Non ho familiarità, BaseXma ho una situazione di esempio che utilizza docker-compose version: "3.7"qui che potrebbe facilmente eseguire più app e / o essere aggiunto o riproposto per adattarsi al tuo ipotetico.
Questo esempio docker-compose ha quanto segue:
Un contenitore separato per popolare il mio
app-volumevolume con i contenuti di un repository GitHub pubblico.Un contenitore di server web Apache con PHP-FPM abilitato per un "backend selettivo" che viene costruito da un Dockerfile nella directory ~ / dockerbuild.
Un contenitore di server web nginx utilizzato come proxy inverso per tutto ciò che PHP deve essere passato ad Apache (ma serve e memorizza praticamente tutto il resto).
Un contenitore MariaDB nel mix per il DB dell'app che popolo con un file mysqldump dopo che l'app è stata creata.
Questa è una versione ridotta del mio docker-compose.yml, quindi tieni presente che puoi aggiungere una varietà di cose come healthcheck:e command:per soddisfare le tue esigenze.
Esegui docker-compose up -d --buildsia per creare che per avviare la tua app in un unico comando (ma probabilmente vorrai creare il tuo file ba (.sh) che esegui anche in seguito, per quegli importanti tocchi finali).
Prendi nota di static-network. E mentre sto usando volumi con nome nell'esempio, questa è solo una mia preferenza.
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
Il mio comando di pulizia quando tolgo l'app è un po 'brutto, ma non troppo difficile da leggere e fa qualcosa del genere: 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;
Penso che ogni "app indipendente" possa (e probabilmente dovrebbe) avere il proprio docker-compose e / o Dockerfile, ma potresti trovare sinergie con alcuni Dockerfile per cui puoi creare command:istruzioni personalizzate (come l'esempio git_repo_clone) da utilizzare & condiviso tra più "app".