Docker容器化部署Python应用
2019-06-30 16:28
目录
如果我们在容器运行的时候,修改应用程序代码,Flask会检测到更改并重新启动应用程序。
要停止容器的话,可以使用
Ctrl
+C
, 并运行docker rm flask_app
移除容器。生产模式运行
虽然直接使用Flask裸跑运行应用程序对于开发来说已经足够好了,但是我们需要在生产中使用更健壮的部署方法。
目前主流的部署方案是
nginx
+uwsgi
,下面我们将介绍如何为生产环境部署web应用程序。Nginx是一个开源web服务器,uWSGI是一个快速、自我修复、开发人员和系统管理员友好的服务器。首先,我们创建一个入口脚本,用来控制以开发模式还是生产模式启动我们的应用程序,这两者区别是选择直接运行python还是nginx模式。
然后再写一个简单shell启动脚本
entry-point.sh
:#!/bin/bash if [ ! -f /debug0 ]; then touch /debug0 while getopts 'hd:' flag; do case "${flag}" in h) echo "options:" echo "-h show brief help" echo "-d debug mode, no nginx or uwsgi, direct start with 'python3 app/app.py'" exit 0 ;; d) touch /debug1 ;; *) break ;; esac done fi if [ -e /debug1 ]; then echo "Running app in debug mode!" python3 app/app.py else echo "Running app in production mode!" nginx && uwsgi --ini /app.ini fi
然后创建uWSGI配置文件
app.ini
:[uwsgi] plugins = /usr/lib/uwsgi/plugins/python3 chdir = /app module = app:app uid = nginx gid = nginx socket = /run/uwsgiApp.sock pidfile = /run/.pid processes = 4 threads = 2
和nginx配置文件 nginx.conf:
user nginx; worker_processes 4; pid /run/nginx.pid; events { worker_connections 20000; } http { include mime.types; sendfile on; keepalive_timeout 65; gzip off; server { listen 80; access_log off; error_log off; location / { try_files $uri @flaskApp; } location @flaskApp { include uwsgi_params; uwsgi_pass unix:/run/uwsgiApp.sock; } } }
最后,修改
Dockerfile
将nginx
和uWSGI
安装到镜像,将配置文件复制到镜像中,并设置运行nginx所需的用户权限: