如何为Docker窗口容器定义反向代理?

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

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

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 

我们还在容器上使用了一个固定的IP地址,但是我们使用另一个容器与nginx来做反向代理。 我们的想法是,在我们的容器主机(Windows Server 2016),我们只安装Docker,没有别的。 所有configuration都在容器中完成。 这样我们可以轻松地迁移到另一个主机。

这是nginx代理的Dockerfile

 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被复制到nginxconfiguration文件夹中。 它包含反向代理设置。 从我们的某个网站的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. 我们的DNSredirectsomesite.mydomain.com到我们的容器主机的IP
  3. 由于端口80暴露于nginx容器,请求去那里
  4. nginx会将请求代理到172.22.108.6
  5. 用户看到在IP 172.22.108.6容器上运行的网页