运行 Docker 引擎 API 落后于 Nginx
Running Docker Engine API behind Nginx
我正在尝试 运行 并在 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";
}
}
}
对于遇到同样问题的任何人,我在互联网上进行了广泛的研究,但没有理智的方法来获得我想要使用 Nginx 的东西,即使你解决了这个问题,你也会大吃一惊 autoscaling/load-balancing这个架构。
今天,我使用 stick tables 迁移到了 HAProxy,效果非常好。 Nginx 不适合这个用例。
更新:愚蠢的我。这可以与 nginx and/or HAProxy 一起使用,只需确保在 运行 docker 命令等
时将 HTTP 连接升级(降级?)到 TCP 连接
我正在尝试 运行 并在 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";
}
}
}
对于遇到同样问题的任何人,我在互联网上进行了广泛的研究,但没有理智的方法来获得我想要使用 Nginx 的东西,即使你解决了这个问题,你也会大吃一惊 autoscaling/load-balancing这个架构。
今天,我使用 stick tables 迁移到了 HAProxy,效果非常好。 Nginx 不适合这个用例。
更新:愚蠢的我。这可以与 nginx and/or HAProxy 一起使用,只需确保在 运行 docker 命令等
时将 HTTP 连接升级(降级?)到 TCP 连接