django - 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 容器中出现了一些错误。
我在哪里做错了?我该如何解决?
解决方案
每个容器都有自己的环回接口,它自己的 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;
}
}
推荐阅读
- scala - 如何在更改数据框中的列顺序时修复 org.apache.spark.sql.AnalysisException?
- c++ - 代码占用了我一半的输入
- javascript - 我们如何在控制台中记录通过/失败的 url 检查结果?
- vb.net - 在动态表 vb.net 中添加列表的所有元素
- vba - ConversationID 可以更改对话中的现有项目吗?
- php - 如何在 Laravel 中重命名 Http 目录“控制器”
- vba - 使用 VBA Excel 将特定数字转换为日期/时间
- ruby-on-rails - Rails:如何按关联的属性名称对属性数组进行排序
- java - 适用于所有客户端的主要 LinkedHashMap
- azure-devops - 将测试结果从 VSTS 复制到自托管 Azure VM