我嘗試使用 docker 連接我的服務以進行學習。
當我在本地主機中嘗試時,一切都很好。
但是當我在 Docker 上嘗試它時,當我嘗試從產品服務 http 重定向到我的身份驗證服務時出現錯誤。
我嘗試的是使用 http 重定向,我向 auth-service 發出了一個新請求,它可以作業并連接,但是當我嘗試在 Docker 中重定向它時出現錯誤。
這是我
正在使用 golang 和 Gin-gonic 庫的重定向代碼
url := os.Getenv("AUTH_SERVICE_URL") // http://auth-service:8081
c.Redirect(http.StatusSeeOther, url "/refresh?token=" tokenStr)
c.Abort()
return
這是我的新請求代碼
url := os.Getenv("AUTH_SERVICE_URL") // http://auth-service:8081
request, err := http.NewRequest(http.MethodGet, url "/refresh?token=" tokenStr, nil)
log.Println("make request to", request.URL)
if err != nil {
panic("Internal Server Error")
}
client := http.Client{
Timeout: 30 * time.Second,
}
response, err := client.Do(request)
if err != nil {
panic(fmt.Sprint("unable to get auth request", err.Error()))
}
log.Println("REFRESH TOKEN", response.Header)
我只是想知道,為什么當我使用 http 重定向時它在 docker 上出現錯誤,但是當我在本地主機上嘗試它時它可以作業。
我正在使用郵遞員進行測驗,但出現此錯誤。
Error: getaddrinfo ENOTFOUND auth-service
但是當我在我的 Docker 中使用具有相同 URL 的新 Http 請求代碼時,它可以作業。
這是我的產品服務 docker-compose
version: '3'
services:
product-service:
build:
context: .
dockerfile: .
ports:
- "8082:8082"
environment:
AUTH_SERVICE_URL: http://auth-service:8081
DB_DRIVER: postgres
DB_USER: postgres
DB_PASSWORD: password
DB_HOST: postgresDB
DB_PORT: 5431
DB_NAME: v_product
DB_SSL_MODE: disable
PORT: 8082
networks:
- auth-service_default
- product-service_default
depends_on:
- postgresDB
postgresDB:
image: 'postgres:12.12'
ports:
- "5431:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: v_product
networks:
- product-service_default
volumes:
- psql_user:/var/lib/postgresql/data
volumes:
psql_user:
networks:
auth-service_default:
external: true
product-service_default:
external: true
這是我的身份驗證服務 docker-compose
version: '3'
services:
auth-service:
build:
context: .
dockerfile: .
ports:
- "8081:8081"
environment:
USER_SERVICE_URL: http://user-service:8080
PORT: 8081
networks:
- user-service_default
- auth-service_default
networks:
user-service_default:
external: true
auth-service_default:
external: true
注意:我嘗試重定向的端點是:GET
:8081/refresh?token=JWTOKEN
并且我使用See Other
代碼進行重定向,因為它是從POST
請求重定向的。
uj5u.com熱心網友回復:
HTTP重定向的作業原理是這樣的(有關圖表等的更好描述,請參見鏈接):
- 客戶(例如郵遞員)發出請求(例如
GET http://auth-service:8080
) - 服務器以重定向狀態(
303
在這種情況下為“查看其他”)和新 URL(例如http://auth-service:8081/refresh?token=blah
)回應 - 客戶端請求新的 URL。
因此,根據評論,您的應用正在重定向到http://auth-service:8081/refresh?token=blah
. 問題是,當不是容器的客戶端嘗試查找主機的 IP 地址時,auth-service
它不會找到它(它不在本地hosts
檔案中,并且您使用的任何 DNS 服務器都不知道該地址)。因此,解決方法是回傳客戶端可以訪問的 URL(例如http://127.0.0.1:8081
)。
即使客戶可以解決auth-service
其地址可能類似于172.21.0.2
. 這是一個無法從主機訪問的私有地址(因為您使用的是橋接網路)。這種型別的網路允許容器之間進行通信(在限制范圍內)并啟動傳出連接,但不為主機或連接到主機的設備提供入站訪問。
外部訪問(通常)通過發布的埠;那ports: - "5431:5432"
是docker-compose.yml
. 這些條目允許您在主機上公開容器埠(在這種情況下5432
,容器上的埠作為主機上的埠公開5432
,但埠號可以不同)。
- 容器中的網路如何作業
抱歉 - 在堆疊溢位答案中解釋太多了!碼頭工人檔案非常好。
1.5 它是否對我的重定向操作生效,或者我只是錯誤地指定了主機,因為重定向是由客戶端操作的?
重定向是使用http 協議執行的。HTTP是應用層協議;通信通常通過 TCP/IP 連接進行。花一點時間來了解所涉及的所有不同層是值得的(在 IT 中總是有更多要學習的東西!)。
在底層 TCP 堆疊中,主機(和其他外部系統)只能通過發布的埠訪問容器。DNS(主機名如何映射到 IP)和 IP 路由(來自主機的流量可以到達容器)是單獨的考慮因素,這毫無意義。
- 在這種情況下,客戶是 Postman 對嗎?
郵遞員很好。另一種方法是使用以幾乎相同的方式運行的瀏覽器。
- 如果我說當容器嘗試與命名主機服務連接時,如果每個容器連接到同一個網路并且它與服務器到服務器的通信相同,則可以完成通信嗎?
同一網路上的容器可以通信,Docker 提供了一個嵌入式 DNS 服務器,使它們能夠執行查找(因此映射auth-service
到容器 IP 地址和host.docker.internal
主機)。重要的是要注意這個嵌入式 DNS 服務器不被主機使用(并且無論如何都會受到限制,因為主機不能通過它們的 IP 地址直接與容器通信)。
希望這會有所幫助——這可能會讓人很困惑,特別是如果您對網路沒有太多經驗的話。我會注意到我經常在這種情況下使用邊緣路由器/反向代理(例如Traefik)。有了這個,你可以只映射一個埠(或者如果你想要 HTTPS,也可以映射兩個),然后 Traefik 將請求路由到適當的容器(這現在可能會讓你感到困惑,但將來可能會有用!)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/507596.html
標籤:码头工人 去 网页服务 码头工人撰写 http-重定向