从一个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.html
proxy_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.202508221736
container_name: "iac_xh_frontend"
network_mode: bridge
restart: always
ports:
- 7778:10100
environment:
- "LANG=en_US.UTF-8"
volumes:
- /etc/localtime:/etc/localtime:ro
logging:
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.html
proxy_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
更多推荐
所有评论(0)