首页 > 解决方案 > docker容器之间的端口转发

问题描述

我运行一个 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/用户名/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 container),它显示 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 容器中出现了一些错误。

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

标签: djangodockernginx

解决方案


每个容器都有自己的环回接口,它自己的 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;
        }
    }

推荐阅读