2017-03-21 1 views
0

j'ai un fichier Compose docker dans lequel il y a plusieurs conteneurs parmi lesquels il y a une passerelle api et l'autre avec une application AngularJS (le site de cette pile). La passerelle api est concernée pour appeler les apis corrects de plusieurs conteneurs présents dans le fichier de composition. Mais je dois appeler la passerelle api du site Web (conteneur angulaire) et je voudrais savoir quelles sont les meilleures pratiques pour obtenir l'adresse du conteneur de la passerelle api afin de l'appeler à partir du conteneur angulaire (ou du navigateur de toute façon. .). Pour le moment, je travaille au niveau local, donc je précise localhost: PortOfApiGateway/apis/...comment obtenir api adresse de la passerelle afin de l'appeler à partir du récipient angulaire dans docker composer

et tout fonctionne bien, mais évidemment, si essayer de se connecter à un autre hôte, il ne travaille pas ...

Toute suggestion?

Répondre

0

Dans votre fichier docker-Compose, vous pouvez faire vos conteneurs se joindre à un réseau existant, qui peut être le réseau par défaut. Donc, tout ce que vous devez faire est de vous assurer que vos conteneurs rejoignent un réseau dans lequel se trouve déjà votre conteneur angularjs. Ensuite, vous pouvez vous référer à votre conteneur API simplement par le nom que vous lui avez donné dans votre fichier docker-composer (si vous l'appelez api, par exemple, ping api fonctionnera). Voir Networking in Compose.

+0

Oui, c'est vrai mais pas si j'ai besoin d'appeler la passerelle api du navigateur. Vous pouvez imaginer que j'ai un service sur angulaire qui doit appeler un api de ma passerelle api, si j'utilise alias réseau de docker je dois appeler egx: http: // api-gateway: 8080/api/myapi mais le navigateur ne peut pas le faire ... de cette façon, je pense, n'est possible que du côté serveur. – user2972221

+1

Dans ce cas, votre conteneur d'API doit avoir une section 'ports' pour mapper un port de l'hôte au conteneur. En fonction de ce que vous voulez précisément - ce qui n'est toujours pas clair pour moi - vous devrez peut-être configurer un proxy inverse, comme Nginx. Et bien sûr, vous devez ouvrir le port dans le pare-feu du serveur. – Zoyd

+0

oui..je pense que la solution est d'utiliser un proxy inverse! – user2972221

3

En fonction de votre environnement, je vois plusieurs solutions possibles.

1. Vous pouvez avoir un fichier de configuration dans angulaire

Par exemple, angulaire Cli fournit 2 fichiers: environment.ts et environment.prod.ts

Le contenu du fichier peut être:

export const environment = { 
    production: false, 
    apiBaseUrl: 'http://localhost:3000' 
}; 

et l'équivalent de la production peut être l'URL réelle DNS

Ceci est fourni par un CLI mais vous pouvez faire la même chose sans la CLI. L'idée ici est que les fichiers sont choisis au moment de la compilation.

2. Utilisez toujours le même serveur

Vous pouvez supposer que le nom d'hôte sera le même que celui que vous avez obtenu votre application angulaire:

import { Location } from '@angular/common'; 
// Get the hostname 
this.hostname = location.host; 
if (this.hostname.indexOf(':') > 0) { 
this.hostname = this.hostname.substr(0, this.hostname.indexOf(':')); 
} 
// Add a port or a subdomain to get the API url: 
this.apiUrl = 'http://' + this.hostname + ':8080'; 

Variables dans Compose?

Comme vous l'avez dit dans un commentaire précédent, les appels sont effectués à partir du navigateur, donc en dehors Docker. Je ne vois pas un moyen facile de mettre cette information dans le fichier de composition. Cela dit, je serais intéressé de le savoir.

J'espère que ça aide.