【问题标题】:host not found in upstream in /etc/nginx/conf.d/nginx.conf when running standalone docker containers运行独立 docker 容器时,在 /etc/nginx/conf.d/nginx.conf 的上游找不到主机
【发布时间】:2021-10-01 16:35:47
【问题描述】:

我有 2 个容器,分别命名为 flask_server 和 nginx,当我使用 docker-compose 运行这些容器时,一切都按预期工作,问题是当我分别运行每个容器时,我得到了这个错误消息:

"host not found in upstream "flask_server:3000" in /etc/nginx/conf.d/nginx.conf".

我已经搜索了一个解决方案,我得出的结论是这是容器之间的网络问题。

所以当我像这样运行带有 --network 标志的容器时:

**flask_server**
docker run -p 3000:3000 --network custom-network flask_server
**nginx**
docker run -p 80:80 --network custom-network nginx   

还是不行。

我让它工作的唯一方法是运行带有 --network-alias 标志的 flask_server 容器,如下所示:

**flask_server**
docker run -p 3000:3000 --network custom-network --network-alias flask_server flask_server
**nginx**
docker run -p 80:80 --network custom-network nginx

所以现在我遇到了另一个问题,即我想将这些容器上传到亚马逊 ecs,但我在任务定义中没有看到任何别名选项,所以我可能需要考虑另一种创造性的方式在我将这些容器上传到 ecs 之前解决这个问题。

nginx.conf

upstream flask_server {
server flask_server:3000;
}

server {

listen 80;
server_name default_server;

location /api {
    proxy_pass http://flask_server;

    
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }

}

nginx Dockerfile

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

烧瓶 Dockerfile

FROM python

WORKDIR /app

COPY ./requirements.txt /app

RUN pip install -r requirements.txt

COPY . .

RUN apt-get update

RUN apt-get install python3-dev  -y

WORKDIR /app/code

EXPOSE 3000

CMD ["gunicorn", "wsgi:app", "-k gevent" ,"-w 3", "-b 0.0.0.0:3000", "-t 30"]

希望这里的任何人有另一种解决方法来解决容器之间的网络问题,或者在 Amazon ECS 上使用 --network-alias 标志的方法。

任何帮助都会很棒。谢谢!

============ 编辑 ==============

所以我找到了解决这个问题的方法,我没有使用 flask_server 作为我的内部 ip 和代理传递给容器本身,而是使用主机 ip 并将请求直接传递给主机 ip。

请注意,这仅在 flask_server 容器在 nginx 之前运行时才有效,以便将请求转发到 nginx。

新建 nginx.conf 文件

server {

    listen 80;
    server_name default_server;

    location /api {
        # the host variable indicates the current host ip address
        proxy_pass http://$host:3000;

        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

【问题讨论】:

    标签: amazon-web-services docker nginx amazon-ecs


    【解决方案1】:

    我要连接本地网络中的 docker 实例,需要传递--network="host"

    对于 ECS,您不能使用命名别名连接。您需要通过公共 IP 连接或设置 VPC 并通过内部 IP 连接。

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 1970-01-01
      • 2020-11-08
      • 2020-11-09
      • 2021-11-22
      • 1970-01-01
      • 2020-07-08
      • 2018-03-03
      • 2020-06-15
      相关资源
      最近更新 更多