2017-03-15 62 views
5

我在Windows 10周年纪念版上运行了docker windows容器,并且希望将IIS设置为容器的反向代理。根据https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/,似乎表明它是不可能的,因为使用本地主机无法引用内部NAT范围。这留下了一个动态分配的IP地址,只有在运行映像后运行docker inspect命令才能发现该IP地址。我希望有一种更有效的方式,我可以忽略。如何为Docker窗口容器定义反向代理

回答

2

我们通过将默认子网上的IP地址分配给每个Windows容器并从容器中导出端口80来解决此问题。这给了我们一个稳定的地址放入ARR反向代理规则。例如,以下内容将在地址172.20.118.129处创建一个容器,然后验证容器是否在请求的地址上运行。

PS C:\WINDOWS\system32> docker run -d --name myservice --ip=172.20.118.129 microsoft/iis:nanoserver 
7d20d8a131805727868ddf85f7c1f455fa2489bb2607b250e694a9e530a61302 
PS C:\WINDOWS\system32> docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myservice 
172.20.118.129 
+0

您认为您的解决方案还适用于生产部署吗?你如何配置ARR?谢谢 –

1

我们还使用我们的集装箱固定的IP地址,但我们用另一个容器nginx做反向代理。我们的想法是,在我们的容器主机(Windows Server 2016)上,我们只安装Docker,而没有其他任何东西。所有配置都在容器中完成。这样我们可以轻松迁移到另一台主机。

这是Dockerfile为nginx的代理

FROM microsoft/windowsservercore 

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] 

ARG NgInxVersion="1.13.5" 
ENV NgInxZipUrl="http://nginx.org/download/nginx-${NgInxVersion}.zip" 

RUN Invoke-WebRequest -Uri $env:NgInxZipUrl -UseBasicParsing -Outfile c:\\nginx.zip 
RUN Expand-Archive -Path c:\\nginx.zip -DestinationPath c:\\nginx 

WORKDIR "c:\\nginx\\nginx-${NgInxVersion}" 

COPY ./nginx.conf conf\\nginx.conf 

ENTRYPOINT powershell .\\nginx.exe 

注意,nginx.conf被复制到nginx配置文件夹。它包含反向代理设置。从http节点提取我们的网站之一:

server { 
    listen  80; 
    server_name somesite.mydomain.com; 

    location/{ 
     proxy_pass http://172.22.108.6/; 
    } 
} 

nginx容器应-p 80:80

运行当我们添加新的容器,我们运行一个PowerShell脚本,更新的nginx.conf并重新加载nginx的。 (这将是罕见的)

例子:

  1. 用户浏览http://somesite.mydomain.com
  2. 我们的DNS重定向somesite.mydomain.com到ip我们的集装箱主机的
  3. 由于端口80暴露nginx的容器,请求去那里
  4. nginx将代理请求到172.22.108.6
  5. 用户看到运行在容器上的网页ip 172.22.108.6
+0

你也可以用IIS和ARR创建一个容器来替换nginx(这里的指南https://chris.59north.com/post/Combining-Windows-Server-2016-Container-ASPNET-5-and-Application-Request -Routing-(ARR) - 使用-泊坞)。但是我发现nginx更轻巧,更容易设置。 – Rubanov