docker nginx 代理宿主机服务 雨点打透心脏的1/2处 2022-10-24 13:29 706阅读 0赞 docker 的出现解决了我们很多问题,让我们避免陷入各种依赖安装的痛苦中,但是docker本身自己也有一些自己的规则,如果不知道也会让我们走很多弯路。 最近在阿里云服务启动了一个nginx容器,在代理静态文件的时候都是正常访问的,但是在进行反向代理tomcat服务的过程中就一直报错: [error] 37#37: *5 connect() failed (111: Connection refused) while connecting to upstream, client: 111.199.4.122, server: 8.140.97.8, request: "GET /wuxingtest-1.0-SNAPSHOT HTTP/1.1", upstream: "http://127.0.0.1:8080/wuxingtest-1.0-SNAPSHOT", host: "8.140.97.8" 大意就是连接失败,而且页面提示的 502 Bad Gateway,本来以为是服务问题,经过本地访问正常,后来以为是权限问题,于是又修改了tomcat目录的权限,但是问题依旧存在。然后尝试了修改nginx配置也无法解决问题。 总之各种方式尝试之后都没有解决问题,最后想会不会是docker的配置跟本机安装的配置方式不一样?因为虽然docker的配置文件可以用宿主机的配置文件,但是解析毕竟是在docker容器中进行的,而docker容器中的localhost跟宿主机的localhost肯定不一样,**果然如此!** # linux docker 代理宿主机服务方式: # ### 1、在安装Docker的时候,会在宿主机安装一个虚拟网关 docker0,查询docker0的IP地址 ### ip addr show docker0 就是:172.17.0.1 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:f1:49:65:45 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:f1ff:fe49:6545/64 scope link valid_lft forever preferred_lft forever ### 2、配置nginx.conf ### # 注意 upstream 没有http, 这里的ip就是上面对于docker来说宿主机的ip upstream music { server 172.17.0.1:8080; } server { listen 80; # 如果由域名配置为域名即可,如果没有域名配置为本机ip地址 # 如果想要外部访问就配置为本机的外网ip server_name xx.xx.xx.xx; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 这里就是上面的upstream proxy_pass http://music; } } ### 3、访问:tomcat webapps 目录下的 proj项目 ### http://xx.xx.xx.xx/pro/ # mac下docker代理本机服务的配置方式 # mac下的docker有加一层虚拟机,所以无法直接访问,需要使用docker.for.mac.host.internal,也就是说,如果想要通过mac下的docker访问宿主机的ip需要使用docker.for.mac.host.internal,一下就是一个server的配置例子 # 这里的ip就是相对于docker来说,宿主机的ip是docker.for.mac.host.internal upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80; server_name 123.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8080; } } ## 常见的问题 400 ## 本来请求的方法和路径都是正常的,本地直接访问也正常,但是被nginx代理之后就报400,这时候需要检查一下 location的配置,是不是把代理的header信息给丢掉了,还是上面的例子,如果改成下面这种方式就会报400 upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80; server_name 123.com; location / { # 这里只保留的proxy_pass信息,其他的header配置都删掉了 proxy_pass http://rest_8080; } } 解决办法就是把下面丢掉的三行header补充回来。 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ## mac下nginx代理本地服务的nginx.conf例子 ## 首先需要修改hosts文件: sudo vi /etc/hosts 添加内容如下: 127.0.0.1 123.com 127.0.0.1 abc.com user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; # 代理本地8080端口的服务 upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80; # 监听 123.com 域名 server_name 123.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8080; } } # 代理本地8090端口的服务 upstream rest_8090 { server docker.for.mac.host.internal:8090; } server { listen 80; # 监听 abc.com 域名 server_name abc.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8090; } } #gzip on; include /etc/nginx/conf.d/*.conf; } # docker 代理静态文件的方式 # 首先需要明确的是,对于docker nginx来说,它只知道docker容器内的目录,因此如果我们宿主机的文件如果想要被docker容器的nginx代理那么首先需要在创建docker容器的时候把目录映射好,否则docker是不会代理到的。如下创建docker nginx代理容器:($PWD代表当前操作的宿主机目录) docker run -id --name=c_nginx \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx 比如我说我们当前在/opt/data/nginx目录下创建的docker,那么这个目录下要有 conf、logs、html三个子文件夹。这个条命令执行完成之后,docker容器的目录下面的几个目录会跟我们的宿主机的这几个目录相对应起来。 这时候比如说我们想把某一个域名 abc.com代理到 /opt/data/nginx/html/abc 目录下面,那么我们应该进行如下配置: server { listen 80; server_name abc.com; # 注意这里配置的是docker容器的绝对目录,而不是我们宿主机的目录 # 因为docker并不能直接访问宿主机的目录,它只能访问自己的目录 # 而这些目录应为在创建docker容器的时候被映射好了,所以 # 访问docker 的/usr/share/nginx/html目录就相当于是访问 # 宿主机 /opt/data/nginx/html目录,如果访问 # docker 的 /usr/share/nginx/html/abc目录 # 就相当于是访问宿主机的 # /opt/data/nginx/html/abc 目录 # 如果直接配置 /opt/data/nginx/html/abc,就会报404,因为动车可下面没有这个目录 root /usr/share/nginx/html/abc; }
相关 Docker容器内连接宿主机的其他服务,比如Mysql 通过上一篇文章,我们可以解决同一个容器内的通讯问题,大家使用同一个桥接网络的方案是最简便的,但是我们的容器需要访问宿主机怎么办 ? 现实的场景,我们一般都是微服务全部部署到了 浅浅的花香味﹌/ 2024年04月03日 10:48/ 0 赞/ 88 阅读
相关 【Docker】docker容器内获取宿主机的信息和执行宿主机的脚本 思路 我们可以通过在容器内远程连接宿主机,然后对宿主机进行操作。 使用 sshpass (我的是CentOS 7.9环境) 1.安装sshpass 今天药忘吃喽~/ 2023年09月24日 17:24/ 0 赞/ 31 阅读
相关 宿主主机如何访问虚拟机中的docker服务 宿主主机如何访问虚拟机中的docker服务 > 网上的回答不一而足,然而都没有解决,最后上了Stack Overflow,找到了答案,国内的小伙伴还得加油呀. 环境 旧城等待,/ 2023年07月13日 08:26/ 0 赞/ 36 阅读
相关 docker 安装redis 挂载到宿主机 1.首先去redis获取对应版本的配置文件redis.conf: http://download.redis.io/releases/ 我选择的是 6.0 叁歲伎倆/ 2023年01月06日 01:16/ 0 赞/ 249 阅读
相关 Docker+Nginx搭建正向代理服务 > nginx在企业级来说应用较为广泛的作为反向代理服务器,配合后端集群服务做负载均衡等一些列措施。 > 本文主要是以正向代理为例,应用场景如:多台服务器处于同一 悠悠/ 2022年10月29日 12:22/ 0 赞/ 684 阅读
相关 docker nginx 代理宿主机服务 docker 的出现解决了我们很多问题,让我们避免陷入各种依赖安装的痛苦中,但是docker本身自己也有一些自己的规则,如果不知道也会让我们走很多弯路。 最近在阿里云服务启动 雨点打透心脏的1/2处/ 2022年10月24日 13:29/ 0 赞/ 707 阅读
相关 docker容器内访问宿主机部署的mysql等服务 1、应用程序使用docker部署,mysql和redis使用常规的linux部署,并且安全考虑没有开放3306和6379端口 docker容器内怎么访问宿主机的mysql和r 古城微笑少年丶/ 2022年10月14日 05:29/ 0 赞/ 262 阅读
相关 Docker 配置 Nginx 访问宿主机目录下的应用 > 使用 Nginx 将请求转发到宿主机的 Tomcat 应用 配置并启动 Tomcat 安装 Docker 配置 Nginx 创建配置和日志文件夹 左手的ㄟ右手/ 2022年05月27日 02:45/ 0 赞/ 329 阅读
相关 Docker内如何访问本机(宿主机) Question Docker内需要访问本机的数据库,如何访问。使用`127.0.0.1`肯定是不行的,因为这个在Docker容器里面指的是容器本身。所以,需要走别动渠道 红太狼/ 2022年05月23日 03:38/ 0 赞/ 437 阅读
相关 docker容器文件拷贝到宿主机 docker容器文件拷贝到宿主机 干货 将容器内文件拷贝到宿主机 docker cp <containerId>:/导出文件的位置/xxx.sql /宿主机 逃离我推掉我的手/ 2022年05月14日 11:28/ 0 赞/ 1427 阅读