2017-03-20 128 views
0

我是Docker容器的新手,遇到以下問題。我正在開發一個網頁,向暴露的api發出請求。它們都發布在通過網絡鏈接的不同容器上。 這是我的搬運工,compose.yml文件:網絡Docker容器上的HttpClient請求

version: '2' 

services: 
    api: 
    image: my/api 
    networks: 
     - api 
    ports: 
     - "8080:5000"  
    container_name: api 

    web: 
    build: 
     context: ./DockerWeb  
    networks: 
     - api  
    ports: 
     - "80:5000"  
    container_name: web 

networks:  
    api: 
    driver: bridge 

我注意到,如果我連接到容器中運行我的網頁上我可以ping該API容器不使用ping api

問題來當任何問題試圖對api容器進行任何Web服務調用。我試圖初始化一個HttpClient對象,但是這種對象的BaseAddress屬性必須設置爲有效的Uri。

_client = new HttpClient(); 
_client.BaseAddress = new Uri(config.ApiUrl); //config.ApiUrl = "api" 

這引發以下錯誤

UriFormatException: Invalid URI: The format of the URI could not be determined.

有沒有辦法要麼一)以不同的方式暴露容器名稱,或b)作出一個Web服務的調用,而不需要使用URI? 我該如何做到這一點?

UPDATE

我已經更新了ApiUrl爲包含值http:api:8080,但現在正執行呼叫

System.AggregateException: One or more errors occurred. (An error occurred while sending the request.) ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.CurlException: Couldn't connect to server

,當我得到一個例外,我也直接嘗試調用API端點從我的web容器中使用wget

wget http://api:8080/ 

但是我仍然收到回一個錯誤:

Connecting to api (api)|172.24.0.4|:8080... failed: Connection refused

這可能是一個API配置錯誤?

回答

1

api僅僅是主機名。該URI將http://api:8080(或https://api:someotherport如果設置了SSL/TLS)。

+0

謝謝你的回答。我已經更新來調用http:api:8080,但是我得到一個異常「System.Net.Http.CurlException:無法連接到服務器」我也嘗試了以下從我的Web容器'wget http:// api :8080 /'我收到以下錯誤:連接到api(api)| 172.24.0.4 |:8080 ...失敗:連接被拒絕。 –

+0

我注意到,即使我公開端口8080的API,這不是容器之間使用的端口。在同一網絡中的容器之間,使用EXPOSE指令公開的端口。在這種情況下,它將是5000.試圖http:// api:5000 /工作 –

+0

@LuisBecerril對不起。我必須對docker compose yml文件中的端口綁定次序感到困惑。 – spender

0

這裏還有爲2種類的通信的:

集裝箱網>集裝箱API

在這種情況下,實際上,你可以使用主機名「api」連接到你的api。 這是你如果你的html生成服務器端必須做的。

Web客戶端>集裝箱API

然而在這裏我假設你正在使用某種形式的JavaScript的Web應用程序(角或其他)。在這種情況下,html(和調用)不是從Web容器製作的,而是直接來自您的Web瀏覽器。

因此,在這種情況下,你必須使用http://localhost:8080(我想這是碼頭工人在本地機器上運行)。

我希望它有幫助

+0

我無法使用localhost:8080,因爲這會破壞容器命名鏈接。我需要使用http:// api:8080,以便在運行時解析api容器的IP地址。我仍然無法連接 –

+0

我不是故意在docker-compose文件中使用localhost。這裏的問題在於你的客戶端從Docker外部連接,所以這裏不使用容器鏈接。你是否可以確認至少是否使用localhost工作(在你的web應用中)並確認你是否在JavaScript web應用中使用這個調用,使用Angular – DidierH