【问题标题】:Port forwarding between docker containersdocker容器之间的端口转发
【发布时间】:2019-05-30 17:02:27
【问题描述】:

我运行一个 nginx 容器sudo docker run --name some-nginx -d -p 8030:8030 --rm -v /home/username/nginx_test/nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.15.8alpine

/home/username/nginx_test/nginx.conf:

user  nginx;
worker_processes  auto;
error_log  /dev/null;
pid        /var/run/nginx.pid;

events { 
    worker_connections  1024;
    multi_accept on;  
    use epoll;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    ##
    # Gzip Settings and client, log settings
    ##



    server {
        listen       8030;
        set $port_endpoint http://127.0.0.1:8080;

        location / {
            proxy_pass $port_endpoint;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy true;
            proxy_redirect     off;
        }
    }
}

在http://127.0.0.1:8080,有django项目docker容器。

它按类型运行:sudo docker run --name some-nginx -d -p 8080:8080 --rm some/django:0.1,和

它有 uwsgi 文件:

[uwsgi]
chdir              = /smaple_django
wsgi-file          = /smaple_django/smaple_django/wsgi.py
master             = true
processes          = 10
http               = :8080
vacuum             = true

max-requests       = 1000
harakiri           = 10 

enable-threads     = true
lazy-apps          = true
single-interpreter = true

它单独运行良好,因此我的浏览器位于http://127.0.0.1:8080(django 容器),它显示了 django 的首页。

但是当我在浏览器中转到http://127.0.0.1:8030 时,它在 nginx 上显示 502 bad gateway。我认为它必须通过这些 nginx.conf 行连接到http://127.0.0.1:8080:

server {
        listen       8030;
        set $port_endpoint http://127.0.0.1:8080;

        location / {
            proxy_pass $port_endpoint;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy true;
            proxy_redirect     off;
        }
    }

好像是nginx容器和django容器有一些不好的slip。

我在哪里做错了?我该如何解决?

【问题讨论】:

  • 在您的 nginx 容器配置中,您应该使用其主机名而不是您的 localhost ip (127.0.0.1) 来引用另一个容器,这不起作用。 sudo docker run --name some-nginx -d -p 8080:8080 --rm some/django:0.1 也在这里,您可能是想让名称有所不同?

标签: django docker nginx


【解决方案1】:

每个容器都有自己的环回接口,它自己的 127.0.0.1。与之交谈将在内部与容器交谈,而不是与您发布端口的主机交谈。在容器之间,您可以通过将它们放在同一个用户创建的 docker 网络上进行通信,并使用容器名称、id 或别名来引用容器。具有 v2 或 v3 语法的 compose 文件会自动执行此操作,因此我建议您朝这个方向发展。

sudo docker network create nginxnet

sudo docker run --net nginxnet --name some-nginx -d -p 8030:8030 --rm -v /home/username/nginx_test/nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.15.8alpine

sudo docker run --net nginxnet --name some-nginx -d -p 8080:8080 --rm some/django:0.1

使用此配置:

server {
        listen       8030;
        set $port_endpoint http://some-nginx:8080;

        location / {
            proxy_pass $port_endpoint;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-NginX-Proxy true;
            proxy_redirect     off;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2014-10-08
    • 2013-07-20
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多