[netCore]在windows Host上存取Linux Container的Http Server

上一篇我示範在Linux container存取本身的http server,

這篇示範如何透過windows host的外部程式來存取Linux container的http server。

一般我們都會希望可以透過file來設定http server,所以我新增了hosting.json

{
  "urls": "http://*:8888"
}

Program.cs 修改如下

public class Program
    {
        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                .AddJsonFile("hosting.json", optional: false)
                .Build();
            BuildWebHost(args, config).Run();
        }

        public static IWebHost BuildWebHost(string[] args, IConfigurationRoot configuration) =>
            WebHost.CreateDefaultBuilder(args)
                .UseConfiguration(configuration)//override from hosting.json file
                .UseStartup<Startup>()
                .Build();
    }

複製檔案至container後,啟動http server

docker run --name NancyServer -p 8888:8888 -p 1533:1433 mylinux04
docker exec -it 8e0654a23116 "bash"
Dotnet WebAPIwithNancy.dll

可以看到正常listening on http://*:8888,之前而我在windows host透過telnet 127.0.0.1 8888 確認沒問題,

但用chrome和postman均失敗,後來重新檢查windows host network、docker network和hyperV netwrok才搞定。

因為Linux container預設採用bridge,所以我們要改存取Linux container的IP和port

Ps:開發環境我都會安裝net-tools和iputils,但正式環境請最小化image為主,因為畢竟不是用拿來debug。

apt-get install net-tools –y、apt-get install iputils-ping -y

如果沒有安裝net-tools,可以使用docker inspect <container id>來確認container ip

下圖是我個人Win10的docker for windows和hyperV網路設定

確認route table存在172.17.0.0網段沒問題後,現在不管我輸入127.0.0.1或container ip都能正常存取Linux container裡的http server

Http Server的debug console也會呈現相關存取IP

參考

Introduction to hosting in ASP.NET Core