Skip to main content
 首页 » 编程设计

nginx之如何配置 Docker 端口映射以使用 Nginx 作为上游代理

2024年02月25日34lonelyxmas

更新二
现在是 2015 年 7 月 16 日,情况又发生了变化。我从 Jason Wilder 那里发现了这个自动容器:https://github.com/jwilder/nginx-proxy它解决了这个问题,只要它需要 docker run 容器。这是我现在用来解决这个问题的解决方案。
更新
现在是 2015 年 7 月,Docker 容器联网方面发生了翻天覆地的变化。现在有许多不同的产品可以解决这个问题(以各种方式)。
您应该使用这篇文章对 docker --link 服务发现方法有一个基本的了解,它几乎是最基本的,工作得很好,并且实际上比大多数其他解决方案需要更少的花式舞蹈。其局限性在于,在任何给定集群中的不同主机上联网容器非常困难,并且一旦联网,容器就无法重新启动,但确实提供了一种快速且相对简单的方式来将同一主机上的容器联网。这是了解您可能用来解决此问题的软件实际上在幕后工作的好方法。
此外,您可能还想查看 Docker 的新生网络、Hashicorp 的 consul、Weaveworks weave、Jeff Lindsay 的 progrium/consul & gliderlabs/registrator,以及 Google 的 Kubernetes。
还有使用 etcd、fleet 和 flannel 的 CoreOS 产品。
如果你真的想开派对,你可以启动一个集群来运行 Mesosphere、Deis 或 Flynn。
如果您是网络新手(像我一样),那么您应该摘下老花镜,在 Wi-Hi-Fi 上播放“用星星描绘天空 — 恩雅之最”,然后喝杯啤酒 — 这将是在你真正理解你想要做什么之前的一段时间。提示:您正在尝试在集群控制平面中实现服务发现层。这是度过星期六晚上的好方法。
这很有趣,但我希望我能在开始之前花时间更好地教育自己一般的网络知识。我最终找到了仁慈的 digital ocean 教程之神的几篇文章:网络术语和理解简介.. 。 联网。我建议在潜入之前先阅读几次。
玩得开心!
原帖
我似乎无法掌握 Docker 的端口映射容器。具体如何将请求从 Nginx 传递到另一个容器,在同一服务器上监听另一个端口。
我有一个用于 Nginx 容器的 Dockerfile,如下所示:

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配置文件如下所示:
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 的另一个也是。
然后我运行:
sudo docker run -p 80:80 -p 443:443 -d --name Nginx myusername/nginx 

这一切都很好,但请求没有传递到其他容器/端口。当我 ssh 进入 Nginx 容器并检查日志时,我没有看到任何错误。
有什么帮助吗?

请您参考如下方法:

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

所以如果你想重定向所有来自 nginx 的流量监听 80到另一个暴露 8080 的容器,最低配置可以低至:

nginx.conf:

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

docker -compose.yml
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" 

Docker docs