首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Docker端口映射配置为使用Nginx作为上游代理?

如何将Docker端口映射配置为使用Nginx作为上游代理?
EN

Stack Overflow用户
提问于 2015-01-13 00:03:58
回答 5查看 127.9K关注 0票数 92

更新II

现在是2015年7月16日,情况又发生了变化。我从Jason:https://github.com/jwilder/nginx-proxy中发现了这个自动容器,只要码头人员运行容器,它就能解决这个问题。这是我现在用来解决这个问题的解决方案。

更新

现在是2015年7月,与网络码头集装箱有关的事情发生了巨大的变化。现在有许多不同的产品来解决这个问题(以各种方式)。

您应该使用这篇文章来获得对服务发现的对接链接方法的基本理解,这是一种基本的服务发现,它的工作效果非常好,而且与大多数其他解决方案相比,实际上需要更少的花哨舞蹈。它的局限性在于,在任何给定的集群中,在单独的主机上进行网络容器是相当困难的,并且容器不能在联网后重新启动,但是确实提供了一种在同一台主机上使用网络容器的快速和相对容易的方法。这是一个很好的方法来了解你可能用来解决这个问题的软件实际上是在做什么。

此外,您可能还需要查看Docker的新兴网络、Hashicorp的领事、Weaveworks weave、Jeff Lindsay的progrium/consul /registrator和Google的Kubernetes。

还有利用etcd、机队和法兰绒的CoreOS产品。

如果你真的想要一个聚会,你可以把一个集群划分成一个中间层,或者Deis,或者Flynn。

如果你刚接触过社交网络(就像我一样),你应该拿出你的眼镜,在Wi上放上“用星星画天空--最好的恩雅”,然后喝一杯啤酒--你还需要一段时间才能真正明白你想要做的是什么。提示:您正在尝试在群集控制平面中实现服务发现层。这是一个很好的方式度过一个星期六晚上。

这是很有趣的,但我希望我花时间更好地教育自己,在一般的人际关系之前,直接潜入。我最终发现了仁爱的数字海洋教程“众神:网络术语和理解入门”中的几篇文章.建立关系网。我建议在潜水前先读几遍。

玩得开心!

原始邮政

我似乎无法掌握Docker容器的端口映射。具体而言,如何将请求从Nginx传递到另一个容器,侦听同一服务器上的另一个端口。

我有一个用于Nginx容器的Dockerfile,如下所示:

代码语言:javascript
运行
复制
FROM ubuntu:14.04
MAINTAINER Me <me@myapp.com>

RUN apt-get update && apt-get install -y htop git nginx

ADD sites-enabled/api.myapp.com /etc/nginx/sites-enabled/api.myapp.com
ADD sites-enabled/app.myapp.com /etc/nginx/sites-enabled/app.myapp.com
ADD nginx.conf /etc/nginx/nginx.conf

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80 443

CMD ["service", "nginx", "start"]

然后,api.myapp.com配置文件如下所示:

代码语言:javascript
运行
复制
upstream api_upstream{

    server 0.0.0.0:3333;

}


server {

    listen 80;
    server_name api.myapp.com;
    return 301 https://api.myapp.com/$request_uri;

}


server {

    listen 443;
    server_name api.mypp.com;
    
    location / {

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_pass http://api_upstream;
    
    }

}

app.myapp.com也是如此。

然后我跑了:

代码语言:javascript
运行
复制
sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx

而且一切都很好,但是请求并没有被传递到其他的容器/端口。当我将ssh放入Nginx容器并检查日志时,我没有发现任何错误。

有什么帮助吗?

EN

回答 5

Stack Overflow用户

发布于 2017-05-06 00:48:29

我尝试使用流行的Jason反向代理,代码神奇地适用于每个人,并了解到它并不适用于每个人(即:我)。我是NGINX的新手,我不喜欢这样,我不了解我试图使用的技术。

想要添加我的2美分,因为上面围绕linking容器的讨论已经过时了,因为它是一个不受欢迎的特性。这里有一个关于如何使用networks来做这件事的解释。这个答案是使用Docker Compose和nginx配置将nginx设置为静态分页网站的反向代理的完整示例。

TL;DR;

将需要相互通信的服务添加到预定义的网络中。关于Docker网络的一步一步的讨论,我在这里学到了一些东西:https://technologyconversations.com/2016/04/25/docker-networking-and-dns-the-good-the-bad-and-the-ugly/

定义网络

首先,我们需要一个网络,你所有的后端服务都可以在这个网络上进行交流。我打电话给我的web,但它可以是你想要的任何东西。

代码语言:javascript
运行
复制
docker network create web

构建应用程序

我们只需做一个简单的网站应用程序。该网站是一个由nginx容器提供的简单index.html页面。内容是在文件夹content下挂载到主机的卷。

DockerFile:

代码语言:javascript
运行
复制
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf

default.conf

代码语言:javascript
运行
复制
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

docker-compose.yml

代码语言:javascript
运行
复制
version: "2"

networks:
  mynetwork:
    external:
      name: web

services:
  nginx:
    container_name: sample-site
    build: .
    expose:
      - "80"
    volumes:
      - "./content/:/var/www/html/"
    networks:
      default: {}
      mynetwork:
        aliases:
          - sample-site

请注意,这里不再需要端口映射。我们简单地公开端口80。这对于避免端口冲突非常方便。

运行应用程序

启动这个网站

代码语言:javascript
运行
复制
docker-compose up -d

对容器的dns映射进行一些有趣的检查:

代码语言:javascript
运行
复制
docker exec -it sample-site bash
ping sample-site

这个ping应该能工作,在你的容器里。

构建代理

Nginx反向代理:

Dockerfile

代码语言:javascript
运行
复制
FROM nginx

RUN rm /etc/nginx/conf.d/*

我们重置所有虚拟主机配置,因为我们将对其进行自定义。

docker-compose.yml

代码语言:javascript
运行
复制
version: "2"

networks:
  mynetwork:
    external:
      name: web


services:
  nginx:
    container_name: nginx-proxy
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./conf.d/:/etc/nginx/conf.d/:ro
      - ./sites/:/var/www/
    networks:
      default: {}
      mynetwork:
        aliases:
          - nginx-proxy

运行代理程序

使用我们信任的代理启动代理

代码语言:javascript
运行
复制
docker-compose up -d

假设没有问题,那么您将有两个容器运行,可以使用它们的名称相互通信。我们来测试一下。

代码语言:javascript
运行
复制
docker exec -it nginx-proxy bash
ping sample-site
ping nginx-proxy

建立虚拟主机

最后一个细节是设置虚拟主机文件,这样代理就可以根据您想要设置的匹配来引导流量:

用于虚拟主机配置的示例-site.conf:

代码语言:javascript
运行
复制
  server {
    listen 80;
    listen [::]:80;

    server_name my.domain.com;

    location / {
      proxy_pass http://sample-site;
    }

  }

根据代理的设置方式,您将需要将该文件存储在本地conf.d文件夹下,我们通过volumes声明在docker-compose文件中挂载该文件夹。

最后但同样重要的是,告诉nginx重新加载它的配置。

代码语言:javascript
运行
复制
docker exec nginx-proxy service nginx reload

这些步骤的顺序是几个小时剧烈的头部疼痛的顶峰,因为我一直在与502坏网关错误作斗争,并且第一次学习了nginx,因为我大部分的经验都是在Apache。

这个答案是为了演示如何消除502坏网关错误,该错误是由于容器无法相互交谈而导致的。

我希望这个答案能让人省去几个小时的痛苦,因为让容器互相交谈是出于某种原因,尽管我认为这是一个显而易见的用例。但话又说回来我傻了。请告诉我如何改进这一方法。

票数 15
EN

Stack Overflow用户

发布于 2015-01-13 00:10:38

使用码头链接,您可以将上游容器链接到nginx容器。另外一个特性是,docker管理主机文件,这意味着您可以使用名称而不是潜在的随机ip引用链接的容器。

票数 10
EN

Stack Overflow用户

发布于 2018-04-08 16:12:56

@gdbj的回答是一个很好的解释,也是最新的答案。然而,这里有一个更简单的方法。

因此,如果您想将所有流量从nginx重定向到侦听80 的其他容器,则公开 8080**,最小配置的最小配置可能只有:**。

nginx.conf:

代码语言:javascript
运行
复制
server {
    listen 80;

    location / {
        proxy_pass http://client:8080; # this one here
        proxy_redirect off;
    }

}

docker-compose.yml

代码语言:javascript
运行
复制
version: "2"
services:
  entrypoint:
    image: some-image-with-nginx
    ports:
      - "80:80"
    links:
      - client  # will use this one here

  client:
    image: some-image-with-api
    ports:
      - "8080:8080"

码头医生

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27912917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档