在某些特殊情況下,會需要在Docker Container 內取得Host Address,以便從Docker Container繞出來到Host測試或執行某些在Host Port上的服務。理論上,一般情況,Host直接處理服務就好,沒太大必要從Host進Docker Container再從Docker Container繞出來Host。不過,我自己有一個應用場景是“測試”。
針對已經寫好且測試完成的程式專案,會經由製作Docker Image並且用Container的方式運行。不過,專案開發中,需要持續修修改改程式,如果每次測試都Build Image,會花不少時間。所以,原先Host進Docker Container執行服務的方式,改為Host進Docker Container再繞出Host執行服務測試。如此一來,服務的執行都在Host處理,整個測試過程跟Container就無關且方便。
設定方式如下:
首先,將啟動Docker Container的docker-compose.yml檔案設定extra_host屬性,如下:
# docker-compose.yml
...
container_name: i-am-a-container
extra_hosts:
- host.docker.internal:host-gateway
...
當Docker Container透過docker-compose啟動之後,就可以在Container內部用host.docker.internal取得host的位址了。
測試如下:
# In the container(i-am-a-container)
# host的3333有swagger API服務
curl host.docker.internal:3333/tosmm/status
可以成功取得host於3333 port的服務
參考
https://github.com/docker/for-linux/issues/264
https://askubuntu.com/questions/1212555/what-apt-package-installs-ip-addr-command