J'ai deux fichiers docker-compose.yml
distincts dans deux dossiers différents:
~/front/docker-compose.yml
~/api/docker-compose.yml
Comment puis-je m'assurer qu'un conteneur dans front
peut envoyer des demandes à un conteneur dans api
?
Je sais que l'option --default-gateway
peut être définie à l'aide de docker run
pour un conteneur individuel, de sorte qu'une adresse IP spécifique puisse être affectée à ce conteneur, mais il semble que cette option ne soit pas disponible lors de l'utilisation de docker-compose
.
Actuellement, je finis par faire un docker inspect my_api_container_id
et regarde la passerelle dans la sortie. Cela fonctionne, mais le problème est que cette adresse IP est attribuée au hasard, je ne peux donc pas compter dessus.
Une autre forme de cette question pourrait donc être:
Mais à la fin, je m'occupe de:
Vous devez simplement vous assurer que les conteneurs avec lesquels vous souhaitez parler se trouvent sur le même réseau. Les réseaux sont une construction de docker de première classe, et non spécifique à la composition.
# 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
Remarque: le réseau de votre application se voit attribuer un nom basé sur le "nom du projet", lequel est basé sur le nom du répertoire dans lequel elle réside. Dans ce cas, un préfixe
front_
a été ajouté.
Ils peuvent ensuite se parler en utilisant le nom du service. De front
vous pouvez faire ping api
et vice versa.
Juste une petite addition à l'excellente réponse de @ johnharris85, lorsque vous exécutez un fichier de composition de docker, un réseau "default
" est créé afin que vous puissiez simplement l'ajouter à l'autre fichier de composition en tant que réseau externe:
# 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
Pour moi, cette approche était plus adaptée car je ne possédais pas le premier fichier docker-compose et souhaitais communiquer avec lui.
UPDATE: à partir de la version de fichier composée 3.5:
Cela fonctionne maintenant:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
docker-compose up -d
rejoindra un réseau appelé 'custom_network'. S'il n'existe pas, il sera créé!
root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done
Maintenant, vous pouvez faire ceci:
version: "2"
services:
web:
image: hello-world
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
Cela créera un conteneur qui sera sur le réseau externe.
Je ne trouve pas encore de référence dans la documentation mais cela fonctionne!
Tous les conteneurs de api
peuvent rejoindre le réseau front
par défaut avec la configuration suivante:
# api/docker-compose.yml
...
networks:
default:
external:
name: front_default
Voir le guide de composition de docker: en utilisant un réseau pré-existant (voir en bas)
Les informations sur les publications précédentes sont correctes, mais elles ne permettent pas de savoir comment lier les conteneurs, qui doivent être connectés en tant que "liens_externes".
J'espère que cet exemple vous aidera à mieux comprendre:
Supposons que vous ayez app1/docker-compose.yml, avec deux services (svc11 et svc12), et app2/docker-compose.yml avec deux autres services (svc21 et svc22) et supposons que vous deviez vous connecter de manière croisée:
svc11 doit se connecter au conteneur de svc22
Donc, la configuration devrait être comme ceci:
c'est 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
c'est 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
Depuis Compose 1.18 (spéc. 3.5), vous pouvez simplement remplacer le réseau par défaut en utilisant votre propre nom personnalisé pour tous les fichiers Compose YAML dont vous avez besoin. C'est aussi simple que de leur ajouter ce qui suit:
networks:
default:
name: my-app
Ce qui précède suppose que vous avez
version
défini sur3.5
(ou supérieur si cela n’est pas déprécié dans 4+).
D'autres réponses ont pointé le même; Ceci est un résumé simplifié.
Je m'assurerais que tous les conteneurs sont docker-compose
'd sur le même réseau en les composant ensemble en même temps, en utilisant:
docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d
Pour utiliser un autre réseau docker-compose, procédez comme suit (pour partager des réseaux entre docker-compose):
- Exécutez le premier projet de composition de docker par
up -d
- Recherchez le nom de réseau du premier groupe composé à l’aide de:
docker network ls
(Il contient le nom du projet de répertoire racine)- Ensuite, utilisez ce nom par cette structure en bas dans le deuxième fichier docker-compose.
deuxième 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
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