如何从nginx docker容器访问我的localhost?

bmp9r5qi  于 2023-05-16  发布在  Nginx
关注(0)|答案(1)|浏览(200)

我想用nginx做一个简单的反向代理。目标是有一个请求路由API(nginx),可以从我的主机调用,然后访问和调用一些窗口服务中的一些http侦听器。
我的docker-compose.yml:

version: "3"
services:
  nginx:
    image: nginx
    ports:
      - 5003:5003
    volumes:
      - ./nginx-proxy.conf:/etc/nginx/nginx-proxy.conf
nginx-proxy.conf:

server {
    listen 5003;

    location / {
        proxy_pass http://localhost:5004/foo/;
    }
}

1.通过在我的docker compose文件中设置network_mode: "host",在我的主机网络中运行docker compose:
通过调用http://localhost:5003我得到
错误:连接ECONREFUSED 127.0.0.1:5003
1.添加一个额外的主机到docker compose并在我的nginx配置文件中使用它
我的docker compose:

version: "3"
services:
  nginx:
    image: nginx
    ports:
      - 5003:5003
    volumes:
      - ./nginx-proxy.conf:/etc/nginx/nginx-proxy.conf
    extra_hosts:
      - "host.docker.internal:host-gateway"

我的nginx配置文件:

server {
    listen 5003;

    location / {
        proxy_pass http://host-gateway:5004/foo/;
    }
}

通过调用http://localhost:5003我得到
错误:套接字挂起
1.我还在nginx配置中尝试了docker.for.win.localhost或host.docker.internal(没有在docker compose中添加额外的主机),我得到了
错误:套接字挂起

编辑:

Docker编写:

version: "3"
services:
  nginx:
    image: nginx
    ports:
      - 5003:5003
    volumes:
      - ./nginx-proxy.conf:/etc/nginx/nginx-proxy.conf
    extra_hosts:
      - "host.docker.internal:host-gateway"

我的nginx配置:

server {
    listen 5003;

    location / {
        proxy_pass http://host.docker.internal:5004/foo/;
    }
}

通过调用http://localhost:5003,我得到
错误:套接字挂起

编辑二:

这是我的服务器中的HTTP侦听器:

_httpListener = new HttpListener();
_httpListener.Prefixes.Add("http://+:5004/foo/");
_httpListener.Start();

        
        while (!stoppingToken.IsCancellationRequested)
        {
            HttpListenerContext ctx = null;
            try
            {
                ctx = await _httpListener.GetContextAsync();
            }
            catch (HttpListenerException ex)
            {
                if (ex.ErrorCode == 995) return;
            }

            if (ctx == null) continue;

            var response = ctx.Response;
            response.ContentType = "text/plain";
            response.Headers.Add(HttpResponseHeader.CacheControl, "no-store, no-cache");
            response.StatusCode = (int)HttpStatusCode.OK;

            string message = "FooBar";

            var messageBytes = Encoding.UTF8.GetBytes(message);

            response.ContentLength64 = messageBytes.Length;
            await response.OutputStream.WriteAsync(messageBytes, stoppingToken);
            response.OutputStream.Close();
            response.Close();

可以通过调用http://localhost:5004/foo/

编辑3:

通过运行下面的答案,我在浏览器中得到了这个:
这个页面不存在!localhost没有发送任何数据。错误_空_响应

rwqw0loc

rwqw0loc1#

你就快成功了您需要在docker-compose文件中添加extra_host,如下所示

version: "3"
services:
  nginx:
    image: nginx
    ports:
      - 5003:5003
    volumes:
      - ./nginx-proxy.conf:/etc/nginx/nginx-proxy.conf
    extra_hosts:
      - "host.docker.internal:host-gateway"

这将为您提供地址host.docker.internal,您可以使用该地址从容器内部访问主机。
然后将请求转发到host.docker.internal:5004,如下所示

server {
    listen 5003;

    location / {
        proxy_pass http://host.docker.internal:5004/foo/;
    }
}

在主机上运行的服务需要以一种接受来自机器外部的连接的方式进行编码。来自容器的流量看起来像是来自不同的机器。
要让它做到这一点,您需要将侦听器从

_httpListener.Prefixes.Add("http://localhost:5004/foo/");

_httpListener.Prefixes.Add("http://+:5004/foo/");

相关问题