相关文章推荐
高大的毛衣  ·  SecurityContextImpl ...·  12 月前    · 
踢足球的芒果  ·  WPF 窗口居中 & ...·  12 月前    · 

使用nginx的docker-compose无法连接到localhost应用程序

0 人关注

我在localhost上运行nodejs,而nginx作为docker容器使用docker-compose运行。

我无法与node js应用程序建立任何连接。

nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
http {
    server {
        listen 80;
        server_name licensing.cluster-ops.co;
        location / {
                proxy_pass http://md_license_server:3005;
                proxy_set_header Host $host;

docker-compose.yml

version: "3.3"
services:
  md_license_server:
   image: root/md-license-server
   expose:
    - 3005
   ports:
    - 3005:3005
  nginx:
   image: nginx:latest
   container_name: nginx
   ports:
    - 80:80
    - 443:443
   volumes:
    - /etc/ssl/certs:/etc/ssl/certs
    - /etc/ssl/private:/etc/ssl/private
    - /root/docker/nginx.conf:/etc/nginx/nginx.conf

我尝试了外面的一切。

extra_hosts: - "host.docker.internal:127.0.0.1"

这是不可能的。

node应用在localhost上工作得非常好。我试着做了一些curl的调用,响应很好。

这是我从docker得到的错误信息。

2021/12/06 14:29:06 [error] 24#24: *3 connect() failed (111: Connection refused) 
while connecting to upstream, client: 139.59.147.204, server: 
localhost, request: "GET /ping HTTP/1.1", upstream: "http://172.19.0.2:3005
/ping", host:...

看起来,"172.19.0.2:3005 "是md_license服务的IP。

docker-compose exec md_license_server curl http://localhost:3005/pingreturns true

这意味着节点服务器在容器内工作。

我觉得这是关于nginx的问题。

nginx
docker-compose
TMvytKA9LgSVZ8Z7
TMvytKA9LgSVZ8Z7
发布于 2021-12-06
2 个回答
Abdennour TOUMI
Abdennour TOUMI
发布于 2021-12-07
已采纳
0 人赞同

很可能你的IP范围在docker网络和主机网络之间有重叠。但我们现在不要假设。

  • 如果你使用的是桌面版的Docker(Windows,Mac) ,不需要添加额外的主机。直接使用。

    upstream backend {
      server host.docker.internal:3005;
    
  • 如果你没有使用Docker for Desktop (Linux),你需要检查你的主机hostname -i的私有IP,然后把这个私有IP放到nginx配置中。

    # assuming that `hostname -i` prints 192.168.x.y
    upstream backend {
      server 192.168.x.y:3005;
    

    现在,如果你想把它动态化,这是另一个话题,但你可以查看nginx模板。

    回到第一个假设。 不管是什么情况,如果Docker网络和你的主机网络之间有重叠,路由器就不会把数据包转发到主机上,而会一直在Docker网络内。所以我们来检查一下。

  • 检查你的主机IP:hostname -i
  • 检查你的Docker容器IP:docker-compose exec nginx hostname -i
  • 如果有重叠,你将需要提供自定义的docker网络。

    services:
    nginx:
    image: ....
    networks:
    custom-net: # attach nginx container to that network
    ipv4_address: 172.24.0.22 # assign static IP for your container from the network defined below.
    networks:
    custom-net: # create new docker network
    ipam:
    config:
    
  •