初学者可以在Windows上完美地使用Docker Compose来运行Flask+uWSGI+Nginx

首先

有许多其他解读相同内容的文章和网站,但在我的环境中始终没有一个可以一直运行的选项,所以我为了自己整理了一份。我在Windows上使用Docker Desktop来运行。

本文的脉络 de

    1. 安装Docker和Docker Compose,创建并附加到容器中(简单)

 

    1. 在容器中安装Nginx

 

    1. 安装uWSGI

 

    1. 安装Flask

 

    进行各种设置,确保Nginx和uWSGI正常运行

这就是现在的趋势。

最后的命令是以下指令最后一行

docker-compose up -d

我們將使環境可以通過點擊一個選項來創建。

使用Docker制作容器

我推荐阅读樱花知识上对Docker的解释,非常易懂。

现在,首先我们来创建如下的目录结构。

qiita/
  ├ docker-compose.yml
  ├ Dockerfile
  └ requirements.txt

这三个文件分别如下所示。

version: '3'
services:
  main:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: my_flask_Nginx_uWSGI
    volumes:
      - ./:/workspace
    stdin_open: true
    tty: true
    ports:
    - "80:80"
FROM python:3.8

RUN apt update
COPY ./requirements.txt ./config/requirements.txt
RUN pip install --upgrade pip
RUN pip install -r config/requirements.txt
pandas

请输入以下命令:pandas ‘をインストールして下さい。

docker-compose up -d

我们开始打吧。

容器制作成功了吗?

请先进入容器。
使用VSCode的人,请使用”Attach Shell”进入。
其他人请在控制台中进入。

docker-compose exec main bash

让我们输入“を打って入りましょう”。在新创建的容器中有一个名为“workspace”的原始自定义目录,最初准备的文件们被存储在其中。

将Nginx放入容器中。

在集装箱内部。

apt-get install -y nginx

我们来执行它吧。噢,只需这样一步,就成功安装了Nginx。

安装uWSGI

在集装箱里面,

pip install uwsgi

让我们来安装吧。
哇,只需这一步就成功安装了uWSGI。

安装Flask。

在集装箱里,

pip install flask

我们来安装它吧。
哇,只要这样一点就能装上Flask呢。

为了确保Nginx和uWSGI能够正常运行,需要进行各种设置。

好的,我稍微增加一下目录结构。

qiita/
  ├ myapp/
  │   └ app.py
  ├ docker-compose.yml
  ├ Dockerfile
  └ requirements.txt

我创建了一个名为「myapp」的文件夹,并把一个名为「app.py」的文件放在里面。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello world Flask"
    
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

是的,这是Flask框架的语法呢。
那么现在来试试看。

cd /workspace/myapp
python app.py

让我们试着输入一下。
我觉得会出现一些杂乱的东西。

然后在合适的浏览器中打开。

http://127.0.0.1:80

让我们试着访问一下。
如果显示如下内容,那就表示Flask和Docker已经在运行了,暂时算是完成了一大步成功。

80.png

当确认完毕后,请使用Ctrl+C关闭Flask。

现在我们来确认一下Nginx是否正常运行。

service nginx start
image.png

如果成功,

service nginx stop
image.png

你成功停下来了。

现在,我将进行一些麻烦的工作。
※我之后会自动化所有这些。现在只是为了学习而手动完成,请谅解…

我认为在容器目录的”/etc/nginx/”位置上有一个名为”nginx.conf”的文件,即”/etc/nginx/nginx.conf”。

当您打开这个,里面有一段有点长的文字

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

我认为有一个这方面的部分。

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;

我会将其改写成中文。

我理解不太清楚,但是大概是写着”请包含/etc/nginx/sites-enabled/*.conf”这样的事情吧?

接下来,在“/etc/nginx/sites-available”目录中创建一个名为“app_nginx.conf”的文件。
这是要加载的文件。

# Virtual Host configuration for example.com
server {
        listen 80;
        server_name example.com;        
        location / {
          include uwsgi_params;
          uwsgi_pass unix:/tmp/uwsgi.sock;
        }
}

暫時使用端口號80進行監聽似乎有這樣的描述。
接下來,我們要進行符號連結的設定。
不用深思熟慮,只需輸入以下指令。

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/app_nginx.conf app_nginx.conf

好的好的,接下来是uWSGI的配置。
请在初始目录下创建一个名为”uwsgi.ini”的文件。

qiita/
  ├ myapp/
  │   └ app.py
  ├ docker-compose.yml
  ├ Dockerfile
  ├ requirements.txt
  └ uwsgi.ini
[uwsgi]
base = /workspace/myapp
module = app
pythonpath = %(base)
callable = app
socket = /tmp/uwsgi.sock
chmod-socket = 666
master = true
threads = 1
processes = 1
vacuum = true
die-on-term = true
wsgi-file = /workspace/myapp/app.py
daemonize = /var/log/uwsgi/%n.log
pidfile = /tmp/flask_app.pid

下方第二行有关日志文件的描述,看起来有点问题。
目前该目录不存在,所以接下来我们要创建一个名为”/var/log/uwsgi”的目录。

mkdir /var/log/uwsgi

现在进入了最关键的时刻。
试着键入以下命令来将uWSGI作为守护进程启动。

cd /workspace
uwsgi --ini uwsgi.ini

最后,让我们再次启动Nginx!

service nginx start
80.png

你觉得怎么样?
你成功地实现了Hello World,对吗?

如果能做到这一步,之后我们就可以使用Flask来做很多事情了!

用一条`docker-compose`命令即可准备就绪开始运行。

好的,以下命令

docker-compose up -d

通过这个方式,我们将使得过去需要手动构建的环境可以一次完成。

最终的目录结构是,

qiita/
  ├ myapp/
  │   └ app.py
  ├ app_nginx.conf
  ├ docker-compose.yml
  ├ Dockerfile
  ├ nginx.conf
  ├ requirements.txt
  └ uwsgi.ini

请将文件放置在适当的位置。

首先,让我们将迄今为止输入的命令添加到Dockerfile和requirements.txt文件中。 Dockerfile如下。

FROM python:3.8

RUN apt update
COPY ./requirements.txt ./config/requirements.txt
RUN pip install --upgrade pip
RUN pip install -r config/requirements.txt

### ここから下が新たに追加した部分
RUN apt-get install -y nginx 
RUN mkdir /var/log/uwsgi
COPY ./app_nginx.conf /etc/nginx/sites-enabled/app_nginx.conf
COPY ./nginx.conf /etc/nginx/nginx.conf

只是在以Dockerfile格式书写命令而已。
(对不起,我没有用效率较高的方式进行书写)
COPY命令相当于手动修改Nginx配置文件。
为了避免繁琐的修改过程,可以使用预先准备好的文件进行复制来处理。

这些文件跟之前看过的文件完全一样。

server {
        listen 80;
        server_name example.com;        
        location / {
          include uwsgi_params;
          uwsgi_pass unix:/tmp/uwsgi.sock;
        }
}

然后

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*.conf;
}

好的,请将以下内容复制粘贴。

需求文件.txt是一个用于记录项目所需软件包的文件。

flask
uwsgi

没问题。
其他文件都可以照之前写的一样没问题。

现在,一旦配置完成,

docker-compose up -d

那么,让我们来制作一个容器吧!如果成功制作完成的话,

docker-compose exec main bash

进入集装箱中

cd /workspace
uwsgi --ini uwsgi.ini
service nginx start

您可以同时启动 uWSGI 和 Nginx!

辛苦了!!

如果您方便的话,我把这次的源代码放在了GitHub上。欢迎您参考。

启动、停止等命令

uwsgi --ini uwsgi.ini
uwsgi --stop /tmp/flask_app.pid 
uwsgi --reload /tmp/flask_app.pid 
service nginx start
service nginx stop
service nginx restart

可以改写的部分(附加)

目前最上層的目錄名稱是「qiita」,當然可以設定為任何喜歡的名字。

qiita/
  ├ myapp/
  │   └ app.py
  ├ app_nginx.conf
  ├ docker-compose.yml
  ├ Dockerfile
  ├ nginx.conf
  ├ requirements.txt
  └ uwsgi.ini

如果把「uwsgi.ini」改成「hogehoge.ini」也没有问题。
如果想要更改「myapp」文件夹名称或者「app.py」的名称,需要相应地修改「uwsgi.ini」文件中的描述。

举例来说,如果将「myapp」文件夹改名为「ourapp」,并将「app.py」重命名为「hogehoge.py」,那么…

[uwsgi]
base = /workspace/ourapp
module = hogehoge
pythonpath = %(base)
callable = app
socket = /tmp/uwsgi.sock
chmod-socket = 666
master = true
threads = 1
processes = 1
vacuum = true
die-on-term = true
wsgi-file = /workspace/ourapp/hogehoge.py
daemonize = /var/log/uwsgi/%n.log
pidfile = /tmp/flask_app.pid

请按如下方式重述:
“callable = app” 这一行代码中的 app 指的是什么?

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello world Flask"
    
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

這是在程式中的一個叫做app的Flask物件。

以下のように書き換えることができます。

此外,我们将等待客户端的端口设置为8888,但是这个端口也可以进行修改。
例如,如果想要将端口设置为50000,可以通过修改docker-compose.yml来实现。

version: '3'
services:
  main:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask_Nginx_uWSGI_sample
    volumes:
      - ./:/workspace
    stdin_open: true
    tty: true
    ports:
    - "127.0.0.1:50000:80"

让我们用汉语进行改写。 .)

image.png

以下为参考网站。

https://serip39.hatenablog.com/entry/2020/07/06/070000的内容是…
https://www.ravness.com/posts/flasknginx所述的内容是…

广告
将在 10 秒后关闭
bannerAds