【问题标题】:In multi container setup, failing to call service from another container while using Docker-Compose在多容器设置中,使用 Docker-Compose 时无法从另一个容器调用服务
【发布时间】:2020-01-20 18:31:12
【问题描述】:

我正在使用带有多容器设置的 docker compose。我有一个 Angular 应用程序,部署在 nginx 上并暴露于端口 80。在第二个容器上,我托管 .note 核心 API,该服务返回一个字符串。

在 Angular 中,我调用 URL http://localhost/api/values

看看我附加的 docker compose.yml 文件。使用我目前的设置,当我在本地浏览器中点击“http://localhost:81”时,我得到了想要的结果。

但是,在 Angular 应用程序 (http://localhost/api/values) 中,我想使用“webapi”(http://webapi/api/values),而不是使用“localhost”,我尝试了各种选项,但没有得到想要的输出。到目前为止,我尝试使用主机名、容器名称、别名等

如果您能在这里指出我的错误并帮助我获得期望的输出,我将不胜感激。另外,如果您能建议最佳选择,以防我们在 .net 服务上运行多个实例,我将不胜感激。

解决此问题后,我计划将其部署在 Azure 上,是否需要任何其他设置/配置?

这是我的 yml 文件

提前致谢。

version: '3.7'

services:
  web:
    build: hello
    container_name: web
    hostname: web
    image: jayforu/hello
    networks:
      backend:
         #aliases: 
          #  - web
      #   ipv4_address: 172.16.238.01

    ports:
      - 81:80
  webapi:
    build: HelloApi
    container_name: webapi
    hostname: webapi
    image: jayforu/helloapi
    networks:
      backend:
         #aliases: 
          #  - webapi
        #ipv4_address: 172.16.238.02
    ports:
      - 80:80
networks:
  backend:
   # ipam:
      driver: bridge
    #  config:
     #   - subnet: "172.16.238.0/24"

【问题讨论】:

  • 这实际上不是 docker 问题,它与 Angular 及其配置有关,这可能有助于stackoverflow.com/questions/45970744/…
  • 你试过打电话给http://webapi:80/api/values吗?
  • 另一方面,您仍然可以将您的 URL 用作 localhost,这里的确切问题是端口,如果您使用端口 81 它应该适合您,因为您发布了端口 81跨度>
  • 使用 locahost 它可以在 81 上运行,当我将 localhost 更改为 webapi 或 webapi:80 时,它会失败。我怀疑这是否是 Angular 问题。我只是调用驻留在另一个容器上的服务。
  • @mamounothman 我已经更改了配置,并且我已经在公共 git repo 上添加了我的代码,你能抽出时间看看吗?我创建了日志文件夹来显示网络信息和我构建项目的步骤。 API URL 正在文件 hello-world.service.ts 中使用。 github.com/jayrajvcybage/dockercompose.git如果你能纠正我的错误,我将不胜感激

标签: angular docker docker-compose


【解决方案1】:

根据 cmets,您必须执行以下操作才能使其正常工作

手动构建镜像并在 docker-compose 中指定本地构建的镜像(我认为这不是必需的,因为您在 docker-compose 中构建镜像)

# My docker compose installation doesn't support 3.7.
version: '3.6'

services:
  web:
    image: hello:latest
    networks:
      - backend
    ports:
        - 80:80
  webapi:
    image: helloapi2:latest
    networks:
      - backend
    ports:
      - 81:80
networks:
  backend:
      driver: bridge

我将 hello-worl.service.ts 中的 http.get 方法 urlport 更改为您的主机,在我的情况下,我使用的是虚拟机,因此我的容器部署在 http://192.168.99.100 和在 docker-compose 中为 webapi 服务指定的端口 81 上侦听,在您的情况下,如果它的 localhost 则将其更改为 http://localhost:81

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
    providedIn: 'root'
})
export class HelloWorldService {
    constructor(private http: HttpClient) {
    }
    messages: string[];
    executeHelloWorldService(): Observable<boolean> {
      return this.http.get<string[]>('http://http://192.168.99.100:81/api/values').pipe(
        map((data: string[]) => {
          this.messages = data;
          return true;
        }));
    }
}

【讨论】:

  • 谢谢,这确实有效,但是,当 webapi 是 Docker 网桥上的主机/主机名时,这不起作用,webapi:80/api/values。由于来自 JS 的调用,我相信它可以找到 locahost 但不能找到 webapi。
  • @JPM 我想我误解了你的问题,Angular 应用程序的事情是将 API URL 动态存储在设置文件中,并根据环境(生产、本地、固定、测试)使用它。
猜你喜欢
  • 2021-05-17
  • 2022-12-09
  • 1970-01-01
  • 2017-11-13
  • 2016-06-20
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多