簡體   English   中英

如何在 Windows 10 上通過 DockerNAT IP 地址訪問 Docker 容器?

[英]How to access Docker container through DockerNAT IP address on Windows 10?

概述

我正在使用一門課程來學習如何 Dockerize 我的 ASP.NET Core 應用程序。 我在我的配置中嘗試使用的令牌服務器存在網絡問題。

ASP.NET Core Web 應用程序 ( webmvc ) 允許通過令牌服務器 ( tokenserver ) 進行授權。

docker-compose 用於服務

令牌服務器

  tokenserver:
    build:
      context: .\src\Services\TokenServiceApi
      dockerfile: Dockerfile
    image: shoes/token-service
    environment:
      - ASPNETCORE_ENVIRONMENT=ContainerDev
      - MvcClient=http://localhost:5500
    container_name: tokenserviceapi
    ports:
      - "5600:80"

    networks:
      - backend
      - frontend
    depends_on:
      - mssqlserver

tokenserver知道webmvc url。

微博

  webmvc:
    build:
      context: .\src\Web\WebMvc
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=ContainerDev
      - CatalogUrl=http://catalog
      - IdentityUrl=http://10.0.75.1:5600
    container_name: webfront
    ports:
      - "5500:80"
    networks:
      - frontend
    depends_on:
      - catalog
      - tokenserver

運行容器確認webmvc將嘗試訪問位於http://10.0.75.1:5600的身份服務器。

通過在我的 Windows 機器上運行ipconfig我確認 DockerNAT 正在使用10.0.75.1

Ethernet adapter vEthernet (DockerNAT):

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 10.0.75.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

從主機訪問時http://10.0.75.1:5600/不可訪問,而http://localhost:5600可訪問。

但是,我必須依賴 DockerNAT IP,因為webmvc必須從其自己的容器訪問服務,其中 localhost:5600 沒有意義:

docker exec -it webfront bash
root@be382eb4608b:/app# curl -i -X GET http://10.0.75.1:5600
HTTP/1.1 404 Not Found
Date: Fri, 03 Jan 2020 08:55:48 GMT
Server: Kestrel
Content-Length: 0

root@be382eb4608b:/app# curl -i -X GET http://localhost:5600
curl: (7) Failed to connect to localhost port 5600: Connection refused

令牌服務容器檢查(相關部分)

"HostConfig": {
    "Binds": [],
    ....
    "NetworkMode": "shoesoncontainers_backend",
    "PortBindings": {
        "80/tcp": [
            {
                "HostIp": "",
                "HostPort": "5600"
            }
        ]
    },

"NetworkSettings": {
    "Bridge": "",
    "SandboxID": "6637a47944251a4dc59205dc6e03670bc4b03f8bf38a7be0dc11b72adf6a3afa",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {
        "80/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "5600"
            }
        ]
    },
    "SandboxKey": "/var/run/docker/netns/6637a4794425",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "",
    "Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "",
    "IPPrefixLen": 0,
    "IPv6Gateway": "",
    "MacAddress": "",
    "Networks": {
        "shoesoncontainers_backend": {
            "IPAMConfig": null,
            "Links": null,
            "Aliases": [
                "tokenserver",
                "d31d9b5f4ec7"
            ],
            "NetworkID": "a50a9cee66e6a65a2bb90a7035bae4d9716ce6858a17d5b22e147dfa8e33d686",
            "EndpointID": "405b1beb5e20636bdf0d019b36494fd85ece86cfbb8c2d57283d64cc20e5d760",
            "Gateway": "172.28.0.1",
            "IPAddress": "172.28.0.4",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:1c:00:04",
            "DriverOpts": null
        },
        "shoesoncontainers_frontend": {
            "IPAMConfig": null,
            "Links": null,
            "Aliases": [
                "tokenserver",
                "d31d9b5f4ec7"
            ],
            "NetworkID": "b7b3e8599cdae7027d0bc871858593f41fa9b938c13f906b4b29f8538f527ca0",
            "EndpointID": "e702b29016b383b7d5872f8c55cad0f189d6f58f2631316cf0313f3df30331c0",
            "Gateway": "172.29.0.1",
            "IPAddress": "172.29.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:1d:00:03",
            "DriverOpts": null
        }
    }
}

我還在具有高級安全性的 Windows Defender 防火牆中為端口 5600 創建了一個入站規則。

問題:如何在 Windows 10 上通過 DockerNAT IP 地址訪問 Docker 容器?

我認為您正在尋找host.docker.internal 它是一個特殊的 DNS 名稱,允許您從容器連接到主機上的服務或主機上公開的容器。

官方文檔

你可以在這里做更長的解釋。

我不確定為什么它不能按預期工作,但是使用此處提供的信息,我能夠弄清楚如何使其工作:

您可以嘗試在防火牆中添加傳入規則:

例子:

協議:any/tcp/udp/... 程序:任何動作:允許本地端口:任何遠程端口:任何本地地址:10.0.75.1 遠程地址:10.0.75.0/24

或者您可以嘗試使用地址 10.0.75.2 而不是 10.0.75.1

對我來說,第二種解決方案有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM