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

Ted*_*ord 7 docker

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

Rub*_*nov 5

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

这是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
Run Code Online (Sandbox Code Playgroud)

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

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

    location / {
        proxy_pass   http://172.22.108.6/;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ted*_*ord 3

我们通过为每个 Windows 容器分配默认子网上的 IP 地址并将端口 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
Run Code Online (Sandbox Code Playgroud)