使用 dockerized nginx 进行反向代理

Reverse proxying with dockerized nginx

我正在使用 Docker 构建一个多容器应用程序。 full environment is on github 如果您希望重新创建它,但为了方便起见,我将我认为是相关部分的内容包含在下面。我的 nginx Docker 文件是这样的:

FROM ubuntu:14.04
MAINTAINER Garry Cairns
ENV REFRESHED_AT 2015-02-11

# get the nginx package and set it up
RUN ["apt-get", "update"]
RUN ["apt-get", "-y", "install", "nginx"]

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
VOLUME ["/var/cache/nginx"]
EXPOSE 80 443

# load nginx conf
ADD ./site.conf /etc/nginx/sites-available/correspondence
RUN ["ln", "-s", "/etc/nginx/sites-available/correspondence", "/etc/nginx/sites-enabled/correspondence"]

CMD ["nginx", "-g", "daemon off;"]

添加到启用站点的 site.conf 文件如下所示:

# see http://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf#comment730384_577370
upstream api {
    server api_1:8000;
}

server {
    location / {
        proxy_pass       http://api;
    }
}

那里的 nginx 配置似乎与 this answer 中的配置非常相似,我觉得这种方法应该没问题。但是当我访问我的机器上的本地主机(无端口)或我的生产域时,我只看到 nginx 欢迎页面,没有转发。

我可以连接到 运行 nginx 容器并使用 http://api_1:8000 从应用程序容器中获得正确的结果所以我很确定问题出在我的 nginx 设置中而不是我的 Docker 一个,但我无法弄清楚这个。过去有其他人解决过这个问题吗?

终于明白了。我需要删除使用 nginx 安装的默认启用站点。我的 Dockerfile 现在显示为:

FROM ubuntu:14.04
MAINTAINER Garry Cairns
ENV REFRESHED_AT 2015-02-11

# get the nginx package and set it up
RUN ["apt-get", "update"]
RUN ["apt-get", "-y", "install", "nginx"]

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
VOLUME ["/var/cache/nginx"]
EXPOSE 80 443

# load nginx conf
ADD ./site.conf /etc/nginx/sites-available/correspondence
RUN ["ln", "-s", "/etc/nginx/sites-available/correspondence", "/etc/nginx/sites-enabled/correspondence"]
RUN ["rm", "-rf", "/etc/nginx/sites-available/default"]
CMD ["nginx", "-g", "daemon off;"]

世界上一切都很好。