版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
尝试用的docker Nginx代理本机的服务。
本机Django服务配置在8001端口,由supervisor+daphne启动,命令配置如下:
[program:apollo]
command=/home/user/pythonvirtualenv/apollo/bin/daphne -b 0.0.0.0 -p 8001 --proxy-headers config.asgi:application
之后用supervisor启动Django:
(apollo) root@user:~/program/apollo$ sudo supervisorctl start apollo
apollo: started
本地的nginx配置在路径/etc/nginx/sites-enabled/下,监听80端口,代理8001:
upstream apollo {
server 127.0.0.1:8001;
}
server {
listen 80;
server_name 192.168.50.104;
client_max_body_size 1000m;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
location /admin/{
proxy_pass http://apollo/admin/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
再由docker启动Nginx镜像,命名为tmp_nginx1,使用本地的配置文件:
root@user:~/Desktop$ docker run --name tmp_nginx1 -d -p 83:80 -v /etc/nginx/sites-enabled/:/etc/nginx/sites-enabled/ nginx
000bd23e56c262424c6ffb0557f0e39916a6d083b279bc5dcb64770f7d3ba917
启动成功:
但是并不能找到本机的服务:
最开始分析原因是以为容器的nginx寻找容器内的8001端口时无法和本机端口通信,需要映射。所以启动新容器验证,结果因为端口冲突,根本无法启动:
root@user:~/Desktop$ docker run --name tmp_nginx1 -d -p 83:80 -p 8001:8001 -v /etc/nginx/sites-enabled/:/etc/nginx/sites-enabled/ nginx
b7d225ef99d45023d36725e11fdcc20eb583e65550c1c24bf6c9f624de2c344c
docker: Error response from daemon: driver failed programming external connectivity on endpoint tmp_nginx1 (22a619e72e9b9176819161ee53d69df1afdc866a83b3edbea10c217a661ca32d): Error starting userland proxy: listen tcp 0.0.0.0:8001: bind: address already in use.
实际上容器默认是可以和容器外网络环境通信的,端口映射仅用于外部网络访问容器服务。
Docker安装时会创建一个docker0的bridge,创建的容器默认挂在docker0,当docker0收到172.17.0.0/16网段的外出包,会由MASQUERADE将源地址换为host地址,即作一次NAT。
所以这里需要把容器内nginx反向代理的地址还为本机的IP,不然nginx会在容器内的网络寻找服务。在桌面新建配置文件,准确代理本机IP以及PORT:
# ~/Desktop/nginx.conf
upstream apollo_spa {
server 192.168.50.104:8001; # 这里需要写本机IP
}
server {
listen 80;
server_name _;
client_max_body_size 1000m;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
location /admin/{
proxy_pass http://apollo/admin/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
再次启动容器,使用新的配置文件,映射到本机82端口:
root@user:~/Desktop$ docker run --name tmp_nginx_1 -d -p 82:80 -v ~/Desktop/nginx.conf:/etc/nginx/nginx.conf nginx
80f6a68c6f988e57424f4db6e2944103414a0516a0e2e05578d779641e34f273
成功