【问题标题】:Windows Server Docker container cannot connect to proxy container after web server restartWeb 服务器重新启动后,Windows Server Docker 容器无法连接到代理容器
【发布时间】:2021-01-17 08:19:14
【问题描述】:

我有 2 个使用 Docker Compose 部署的 Windows Server Docker 容器。一个容器运行反向代理服务器,另一个容器运行 Web 服务器。 Web 服务器提供一个简单的 index.html 页面。两者都在运行 Nginx。

运行时,一切都按预期工作。我可以通过代理访问内容。但是,如果我重新启动 Web 服务器,我会收到错误的网关错误。然后我需要重新启动代理才能让它再次工作。

如何在无需重新启动代理的情况下使其正常工作?

Docker 撰写:

version: '3'

services: 
    web:
        build:
            context: ./web
            dockerfile: ./dockerfile
    proxy:
        build:
            context: ./proxy
            dockerfile: ./dockerfile
        ports:
            - "8089:80"

代理 Dockerfile:

FROM sixeyed/nginx:windowsservercore

COPY nginx.conf C:/nginx/conf
CMD C:\nginx\nginx.exe

代理 nginx.config:

events {
}
http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://web:80/;
        }
    }
}

Web Dockerfile:

FROM sixeyed/nginx:windowsservercore

COPY nginx.conf C:/nginx/conf
COPY index.html C:/nginx/html/index.html

CMD C:\nginx\nginx.exe

Web nginx.config:

events {
}

http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

【问题讨论】:

    标签: docker nginx docker-compose network-programming windows-server


    【解决方案1】:

    问题

    proxy容器的nginx.conf中的web引用是指启动nginx服务器时引用的容器的up。当web 重新启动时,旧 ip 变得不可用并使用新 ip,然后容器 web 引用被更新,但是 nginx 服务器仍然引用旧 ip,因为配置更改仅在启动/重启时应用。

    解决方案

    当您的 Web 容器被替换时,您需要重新启动 nginx 代理服务器(不一定是容器)。这可以通过使用 docker-gen 监控有关容器的元数据并在检测到更改时重新启动 nginx 来完成。幸运的是 nginx-proxy 为你做这件事。 nginx-proxy 维护良好,是您必须自己维护此业务逻辑的替代方案。

    参考文献

    Nginx 代理:https://github.com/nginx-proxy/nginx-proxy

    【讨论】:

    • 大公司如何解决这个问题?我的意思是,一旦其中一台服务器重新启动,整个服务器园区都需要重新启动,这不可能吧?
    • @Caramiriel 大公司会使用 ECS 或 Kubernetes 之类的东西
    • 对于 nginx,nginx-proxy 方案可以正常工作。但是如果我正确阅读了评论,对于相互连接的容器,建议使用 ECS 或 K8s 吗?这些库不需要重新启动?
    【解决方案2】:

    Nginx 正在缓存 web 容器的解析 DNS IP。 您可以通过在代理 nginx.config 文件中添加 resolver 127.0.0.11 valid=1s 来配置 Nginx 以使 DNS 缓存无效(使用与 DNS 记录中设置的不同的 TTL)。

    Nginx 解析器信息:http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2022-12-09
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2021-08-21
      • 2020-10-05
      相关资源
      最近更新 更多