从一个nginx镜像启动的容器中分出部分location配置到另外一个nginx容器
今天使用nginx+docker容器的方式,搭建了前端服务的代理转发,以前全部的前端页面的js、csss文件都是放在容器外面,通过在docker-compose.yml文件中配置映射的方式映射到容器内部,进行访问,现在自己学会了制作nginx镜像,就把前端的js和css文件一并放入镜像文件中,直接启动,更新操作省去了很多解压和压缩文件的麻烦,更新操作也变得丝滑了很多
原本前端代理路径的的nginx的配置如下:
server {listen 18080 default_server;server_name _;sendfile on;keepalive_timeout 3600s;client_max_body_size 200m;root /data/cwos/frontend/xh;index index.html portal/cbs-xh/index.htmlproxy_connect_timeout 600s;proxy_read_timeout 600s;proxy_send_timeout 600s;proxy_set_header X-Real_IP $remote_addr;proxy_set_header Host $host;proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}
location /cbs-xh { alias /data/cwos/frontend/xh; try_files $uri $uri/ /portal$uri /portal/cbs-xh/index.html;}
主要是两个关键信息root的目录和location的路径,都是服务器上实际存在的路径,路径的大致结构如下图:

然后我niginx的配置文件中关于cbs-xh的部分location修改一下,改成代理转发的upstream,变成如下内容
location /cbs-xh { proxy_pass http://cbs-xh; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }#server外面添加一个转发
upstream cbs-xh {check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;server ecs.ip01:7778;
}
接着把7778端口直接映射为另外一个容器的对外端口,这里我另外一个nginx容器采用的是bridge的网络模式启用,所以需要再容器启动时把7778端口映射到容器内部,这样外部的请求来了以后就会原封不动滴转到新的nginx容器,新的容器的docker-compose.yml配置如下:
version: '3'
services:iac_xh_frontend:image: nexus-docker.********t:1.0.0.202508221736container_name: "iac_xh_frontend"network_mode: bridgerestart: alwaysports:- 7778:10100environment:- "LANG=en_US.UTF-8"volumes:- /etc/localtime:/etc/localtime:rologging:driver: "json-file"options:max-size: "10m"max-file: "5"
然后通过网桥模式,我们就把请求转发到容器内部,查看容器内部的nginx配置为如下内容:
server_tokens off;
server {listen 10100 default_server;server_name _;client_max_body_size 60m;root /usr/share/nginx/html/cbs-xh/;index index.html portal/cbs-xh/index.htmlproxy_set_header X-Real-IP $remote_addr;error_page 404 /404.html;location = /40x.html {}location /cbs-xh { alias /usr/share/nginx/html/cbs-xh/; try_files $uri $uri/ /portal$uri /portal/cbs-xh/index.html;}
}
这个location的位置部分,和最开始nginx配置中cbs-xh的部分几乎一致,除了最开始的文件位置不一样,如下的比对图:
location /cbs-xh { alias /usr/share/nginx/html/cbs-xh/; try_files $uri $uri/ /portal$uri /portal/cbs-xh/index.html;}
location /cbs-xh { alias /data/cwos/frontend/xh; try_files $uri $uri/ /portal$uri /portal/cbs-xh/index.html;}
在此,我们就完成的nginx,容器的拆分工作,启动新的nginx镜像容器后旧的nginx容器,得到两个运行的容器,如下图所示:

然后我们就可以试着访问18080和7778端口了,两个端口访问的结果完全一致,访问结果截图如下图所示:

最后我们进入7778端口代表的容器内部,再访问同一个结果,得到的结果如下图所示:

发现两个接口都能得到相同的结果,但是访问10010,却是通的

改成localhost的ip模式,却可以正常,如下图:

后来才知道原来docker的网桥模式是这种.默认bridge网络模式下
localhost指向容器自身的网络命名空间,即容器内部的回环地址(127.0.0.1),与宿主机完全隔离
2
3。此时若需访问宿主机服务,必须使用以下方式:
宿主机网关IP:172.17.0.1(Docker默认网桥的首个IP)
3
特殊域名:通过extra_hosts配置host.docker.internal映射到host-gateway
