【问题标题】:Docker-compose/Nginx/Gunicorn - Nginx not workingDocker-compose/Nginx/Gunicorn - Nginx 不工作
【发布时间】:2019-07-19 17:58:40
【问题描述】:

我对 Docker 还很陌生,我正在尝试将我的 Flask-App 容器化。应用程序 + gunicorn 的容器工作正常,我可以访问该站点。但是当我使用 docker-compose 包含一个 Nginx 容器时,我无法再连接到该站点了。

我的文件:

Dockerfile(Flask):

FROM python:3.7-stretch
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["gunicorn", "-b", "127.0.0.1:8080", "app:app"]

Dockerfile (Nginx)

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

nginx.conf

server {
    listen  8080;
    server_name localhost;

    location / {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /static {
        alias /var/www-data;
    }
}

还有 docker-compose.yml

version: "3.7"

services:

  flask:
    build: ./flask
    container_name: flask_cookbook
    restart: always
    environment:
      - APP_NAME=Cookbook
    expose:
      - 8080

  nginx:
    build: ./nginx
    container_name: nginx_cookbook
    restart: always
    ports:
      - "80:8080"

当我使用 docker-compose up --build 运行容器时,一切似乎都运行良好:

Starting nginx_cookbook ... done
Starting flask_cookbook ... done
Attaching to nginx_cookbook, flask_cookbook
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Starting gunicorn 19.9.0
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Listening at: http://127.0.0.1:8080 (1)
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Using worker: sync
flask_cookbook | [2019-07-18 15:19:37 +0000] [8] [INFO] Booting worker with pid: 8

但是当我去 127.0.0.1:8080 时,没有任何东西可以连接。

我真的找不到错误,我可能在某个地方犯了...


附加信息: 我在 Windows 10 上

我的目录是这样的

Main Dir
├── docker-compose.yml
├── flask
│   ├── templates
│   ├── static
│   ├── app.py
│   ├── requirements.txt
│   └── Dockerfile
└── nginx
    ├── nginx.conf
    └── Dockerfile

【问题讨论】:

  • 您遇到了一些问题。 A)您是代理将nginx 传递到与nginx 相同的端口上的localhost 正在监听这不起作用。您需要向烧瓶容器发出请求。 B) 从您的机器向127.0.0.1:8080 发出请求将不起作用,因为没有 docker 容器正在侦听。您的配置说 nginx 应该使用端口 80,该端口将映射到容器中的 8080。所以你应该只是向127.0.0.1:80提出请求
  • @ShawnC。太棒了,它现在可以工作了。非常感谢!我仍然需要摆弄一点,但我现在明白了,为什么它不起作用,现在一切都说得通了 :)

标签: python docker nginx flask gunicorn


【解决方案1】:

感谢@ShawnC。 ,我解决了这个问题。引用他的话:

你有几个问题。 A)您是代理将 nginx 传递到 localhost 上的同一端口,因为 nginx 正在侦听这将不起作用。您需要向烧瓶容器发出请求。

所以我将 nginx.conf 文件中的监听端口更改为 80(从 8080),并将 docker-compose.yml 的 nginx 部分中的端口更改为 80:80(从 80:8080)

B) 从您的机器向 127.0.0.1:8080 发出请求将不起作用,因为没有 docker 容器正在侦听。您的配置说 nginx 应该使用端口 80,该端口将映射到容器中的 8080。所以你应该只是向 127.0.0.1:80 发出请求

因此,我将 nginx.conf 中的代理通行证更改为 flask_cookbook:8080。所以容器名称,以及flask_app的暴露端口。这样,nginx容器就可以向flask容器发出请求了。

我还必须将 flask-Dockerfile 中的 gunicorn 绑定更改为 0.0.0.0:8080,这样我就可以使用 Localhost/127.0.0.1 连接到 nginx 容器。

现在它可以工作了,我可以在 localhost:80 上连接到我的网站。

【讨论】:

  • "所以容器名称,以及 flask_app 的暴露端口。"嗯?