【问题标题】:Using Docker : How to warp a web application to communicate with a nginx web server使用 Docker:如何扭曲 Web 应用程序以与 nginx Web 服务器通信
【发布时间】:2017-09-04 18:09:00
【问题描述】:

我是使用 Docker 的新手。我想使用微服务架构方法重建我的单体应用程序。

我有一个需要与 nginx 服务器交互的 Flask 应用服务器。传统上我们使用 Gunicorn 作为 uWSGI,但是我们如何使用 Docker 来做同样的事情呢?

下面是我的代码,

我有一个 Flask 应用程序,它要求用户上传一个 excel 文件

from flask import Flask, request, render_template
import os
app = Flask(__name__)
default_key = '1'
app.config["UPLOAD_FOLDER"] = "/app"

@app.route('/', methods=['GET', 'POST'])
def mainpage():
    if request.method == 'POST':
        print request.form
    if request.method == 'POST' and request.form['submit'] == 'Check Results' :
     #TODO: copy the file into named volume
        f = request.files['file']
        filename = f.filename
        print os.getcwd()
        print os.listdir(os.getcwd())
        file1 = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        f.save(file1)
        #TODO: ping the Classifier container
    return render_template('index.html')

#def receive_classifier_info():
    #TODO: the file has been received so succesfully display the message.
#pass

if __name__ == '__main__':
    app.run(host='0.0.0.0')

这是我的模板/index.html

<html>
  <head>
    <title>key value lookup service</title>
  </head>
  <body>
    <form method="POST" enctype = "multipart/form-data">
      <br>
      <h3>Select an input file</h3>
      <input type="file" name="file" value="Browse">
      <br>
      <h3>Insert a pic of the sample format</h3>
      <br>
      <input type="submit" name="submit" value="Check Results">
     </form>
  </body>
</html>

接下来,这是我构建这个容器的 Dockerfile。

FROM python:2.7
RUN pip install Flask==0.11.1 
RUN useradd -ms /bin/bash admin
COPY app /app
WORKDIR /app
RUN chown -R admin:admin /app
RUN chmod 755 /app
USER admin
CMD ["python", "app.py"] 

接下来,我的 nginx 服务器充当反向代理。

我不知道如何从这里开始。 :(

我的问题是:

1) 我应该如何包装我的应用程序服务器以确保它与 nginx 容器通信。 -> 每当用户单击提交按钮通知它开始处理时,我都需要通知我的应用程序容器。 -> 接下来,一旦处理完成,它应该通知 nginx 服务器 ok 处理完成。

2) 我应该将 index.html 复制到 /var/www/nginx/html 吗??

谢谢

【问题讨论】:

  • 谁能推荐一本能详细描述整个过程的书。谢谢

标签: docker nginx flask dockerfile


【解决方案1】:
  1. 您应该在应用程序容器中启动 Gunicorn 进程。然后,这将在localhost:8000(或您选择的端口)上运行该过程。
  2. 然后您将创建一个将代理传递给您的应用程序的 nginx 容器。在您的服务器块中,您将拥有如下内容:

    proxy_pass http://web:8000;

运行docker-compose 进程可能更容易。

这是我的web 服务的 Dockerfile 的 sn-p:

FROM ubuntu:16.04

# Update OS
RUN sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y upgrade

# Install Python
RUN apt-get install -y python3 python3-pip python3-dev

COPY . /

# Install app requirements
RUN pip3 install -r requirements.txt
# Set the default directory for our environment
ENV HOME /
ENV PYTHONPATH=`$PWD`/..
WORKDIR /

ENTRYPOINT ["/usr/local/bin/gunicorn"]

这是我的烧瓶应用程序的 docker-compose 文件中的一个 sn-p:

version: '2.2'

services:
  web:
    restart: always
    build: .
    ports:
      - "8000:8000"
    command: ["app:app", "-w 4", "-t 90", "--log-level=debug", "-b 0.0.0.0:8000",  "--reload"]
  nginx:
    restart: always
    image: nginx:1.13.1
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
    links:
      - web:web

我真的很喜欢 this docker 入门教程。尽管它是 Django,但它很容易类似于 Flask。

【讨论】:

  • 可能这两年我错过了一些重要的消息,但我认为你仍然需要一个用于烧瓶应用程序的应用程序服务器。除非您正在谈论拥有一个 unix 套接字。那就是一种不同的做事方式。
  • 能否请您推荐一本详细解释这些概念的书,主要是在Docker中构建应用程序,涵盖应用服务器Web服务器
  • 另一个问题是如何手动从应用程序服务器 ping nginx 服务器以通知文件处理已完成,或者如何从 nginx 服务器 ping 应用程序服务器以告知 OK 用户已上传文件,请开始处理
  • 我不能推荐一本特定的书,但你可以在这里找到一些相关的资料github.com/veggiemonk/awesome-docker
  • @ShivanandT 你知道nginx是否支持这样的功能吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2012-03-19
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多