在 Nginx 后面运行 Docker Engine API

Posted

技术标签:

【中文标题】在 Nginx 后面运行 Docker Engine API【英文标题】:Running Docker Engine API behind Nginx 【发布时间】:2020-05-28 15:12:42 【问题描述】:

我正在尝试在 nginx 后面运行和使用 docker 作为反向代理。一切正常,除非 docker 使用原始流 "application/vnd.docker.raw-stream" 响应而不是正常的 HTTP 响应。这发生在端点/start/attach 等这里记录:https://docs.docker.com/engine/api/v1.21/#operation/ExecStart

这是我的 nginx 配置没有将 docker 响应转发给客户端的情况。我尝试搜索它,只有一篇博客文章建议对实际 nginx C 文件进行修补:https://blog.yadutaf.fr/2014/12/12/how-to-run-docker-behind-an-nginx-reverse-proxy/

我完全按照上面的博客,但是,设置r->upstream->upgrade = 1; 似乎对docker 中的/start HTTP 端点没有影响。 Nginx 根本没有响应。有没有办法解决?这是我此刻的 nginx.conf 文件:

daemon off;
error_log /dev/stdout info;
# error_log logs/error.log debug;

events 


http 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                               '$status $body_bytes_sent "$http_referer" '
                               '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /dev/stdout main;
    # include       mime.types;
    # default_type  application/octet-stream;
    # sendfile        on;
    # keepalive_timeout  65;

    upstream dockerpool 
        # session_sticky cookie=sessionid fallback=off mode=insert option=indirect;
        # backup server
        # server nginx_dev_test:80;
        server socat:2376;
    

    server 
        listen 80;

        location / 
            # The upstream here must be a nginx variable
            set $ups dockerpool;
            proxy_buffering off;
            proxy_pass http://$ups;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        
    


【问题讨论】:

任何可以访问 Docker API 的人都可以轻松地启动系统。为什么要通过 nginx 实例发布出来? 我对软件有自定义需求,不用担心安全部分,一切都在受控环境中进行。如果可能的话,请帮助我处理技术部分@DavidMaze 【参考方案1】:

对于任何遇到同样问题的人,我在互联网上进行了广泛的研究,没有理智的方法可以得到我想要使用 Nginx 的东西,即使你解决了这个问题,你也会对自动缩放/加载大吃一惊-平衡这种架构。

今天,我使用棍子桌搬到了 HAProxy,就像一个魅力。 Nginx 不适合这种用例。

更新:愚蠢的我。这可以与 nginx 和/或 HAProxy 一起使用,只需确保在运行 docker 命令等时将 HTTP 连接升级(降级?)到 TCP 连接。

【讨论】:

以上是关于在 Nginx 后面运行 Docker Engine API的主要内容,如果未能解决你的问题,请参考以下文章

Angular App 在 nginx 上运行并在附加的 nginx 反向代理后面

在 nginx 代理后面使用 docker 私有注册表 (v2) 的 HTTP 响应格式错误

docker 容器

docker 中 nginx 后面的 Keycloak 导致 404 和不定式重定向

在 Nginx 代理后面时,Keycloak Docker Instace 中的 X-Frame-Options 拒绝加载

带有ssl的nginx代理后面的docker容器内的Wordpress