Comment connecter des conteneurs Docker?
Dans "Qu'est-ce qu'un conteneur?" les dockerdocuments montrent l' image astucieuse suivante :
Pour mon scénario, je n'ai que les applications A et B; désignons-les Alice et Bob. Comment Alice et Bob communiquent-ils, de manière générale et spécifique? En utilisant le principe KISS, concrètement j'utilise MySQLet BaseXdepuis le hub docker.
La notion étant pour un xqueryfichier résidant sur l'hôte, qui est ensuite envoyé au BaseXconteneur pour exécution. Cette requête spécifique est en fait SQL, donc le MySQLconteneur devra être interrogé pour le résultat.
Cela nécessite-t-il une redirection de port ou d'autres approches de mise en réseau ? Volumes? Cela nécessite-t-il un fichier de composition supplémentaire composé, à son tour, MySQLet BaseX?
Il existe sans aucun doute de nombreuses approches possibles. Quel est le plus pragmatique du point de vue de l'apprentissage? Conceptuellement léger, avec une courbe d'apprentissage progressive.
Une approche semble utiliser la mise en réseau de pont:
Profitant du fait que les conteneurs peuvent se voir .
Cela ne me semble pas lié aux RESTservices Web complets.
En examinant les questions connexes, cela peut concerner un proxy inverse.
Réponses
Je suis encore assez nouveau dans le jeu Docker, mais j'ai quelques petits projets sur lesquels je fais exactement ce que vous demandez. Grâce à ma propre expérience d'essais et d'erreurs (principalement des erreurs ...), je suggérerais d'utiliser un docker-compose.yml avec votre réseau défini sur des adresses IP internes statiques afin que chaque conteneur ait des résultats et des adresses IP prévisibles et répétables que vous pouvez configurer vos conteneurs pour communiquer à travers.
Je ne suis pas familier avec, BaseXmais j'ai un exemple de situation utilisant docker-compose version: "3.7"ici qui pourrait facilement exécuter plusieurs applications et / ou être ajouté ou réutilisé pour s'adapter à votre hypothétique.
Cet exemple de docker-compose présente les éléments suivants:
Un conteneur séparé pour remplir mon
app-volumevolume avec le contenu d'un dépôt GitHub public.Un conteneur de serveur Web Apache avec PHP-FPM activé pour un "backend sélectif" qui est construit à partir d'un Dockerfile dans le répertoire ~ / dockerbuild.
Un conteneur de serveur Web nginx utilisé comme proxy inverse pour tout ce que PHP doit passer à Apache (mais sert et met en cache à peu près tout le reste).
Un conteneur MariaDB dans le mix pour la base de données d'application que je remplis avec un fichier mysqldump après la création de l'application.
Ceci est une version allégée de mon docker-compose.yml, alors notez que vous pouvez ajouter une variété de choses comme healthcheck:et command:pour répondre à vos besoins.
Vous exécutez avec docker-compose up -d --buildpour construire et démarrer votre application en une seule commande (mais vous voudrez probablement créer votre propre fichier ba (.sh) que vous exécuterez ensuite, également pour ces touches finales importantes).
Prenez note de static-network. Et bien que j'utilise des volumes nommés dans l'exemple, c'est juste une de mes préférences.
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
Ma commande de nettoyage lorsque je supprime l'application est plutôt moche, mais pas très difficile à lire et ressemble à ceci: 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;
Je pense que chaque "application indépendante" pourrait (et devrait probablement) avoir son propre docker-compose et / ou Dockerfiles, mais vous pouvez trouver des synergies avec certains Dockerfiles pour lesquels vous pouvez créer des command:instructions personnalisées (comme l'exemple git_repo_clone) à utiliser & partagé entre plusieurs «applications».