初学者可以在Windows上完美地使用Docker Compose来运行Flask+uWSGI+Nginx
首先
有许多其他解读相同内容的文章和网站,但在我的环境中始终没有一个可以一直运行的选项,所以我为了自己整理了一份。我在Windows上使用Docker Desktop来运行。
本文的脉络 de
-
- 安装Docker和Docker Compose,创建并附加到容器中(简单)
-
- 在容器中安装Nginx
-
- 安装uWSGI
-
- 安装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已经在运行了,暂时算是完成了一大步成功。

当确认完毕后,请使用Ctrl+C关闭Flask。
现在我们来确认一下Nginx是否正常运行。
service nginx start

如果成功,
service nginx stop

你成功停下来了。
现在,我将进行一些麻烦的工作。
※我之后会自动化所有这些。现在只是为了学习而手动完成,请谅解…
我认为在容器目录的”/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

你觉得怎么样?
你成功地实现了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"
让我们用汉语进行改写。 .)

以下为参考网站。
https://serip39.hatenablog.com/entry/2020/07/06/070000的内容是…
https://www.ravness.com/posts/flasknginx所述的内容是…