Docker构建python Flask+ nginx+uwsgi容器

安装Nginx

首先拉下centos镜像docker pull centos

我们安装最新的nginx1.19版本:下载地址

将centos镜像运行起来并进入:

docker run --name ver -d -p 8051:80 -it nginx_start

将nginx-1.19.0.tar.gz这个包放入容器里面:

docker cp nginx-1.19.0.tar.gz 10e87af84c05:/root(10e87af84c05为centos容器id)

安装nginx前先装一些依赖:

yum -y install gcc gcc-c++ autoconf automake make
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

解压:

tar -zxvf nginx-1.19.0.tar.gz
#进入到nginx-1.10.1 ,并配置nginx
 cd nginx-1.19.0
 #配置nginx
 #--prefix 指定安装的目录
 #/usr/local/nginx 是安装目录,不能和自己下载的文件目录重了
 #./configure --prefix=/usr/local/nginx

 #带ssl stub_status模块 添加strem模块 –with-stream,这样就能传输tcp协议了
 #http_stub_status_module 状态监控
 #http_ssl_module  配置https
 #stream 配置tcp得转发
 #http_gzip_static_module 压缩
 #http_sub_module 替换请求
 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream

注:

在这里我出现了pcre和zlib缺失的错,可以使用yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel命令,安装所有依赖。

make & make install进行编译安装

安装成功后,在./configure --prefix=/usr/local/nginx指定目录会生成四个文件,我们也只需要输入/usr/local/nginx/sbin/nginx来启动nginx服务即可。

要验证是否成功,可以输入curl localhost来查看是否启动成功。

生成镜像

10. 将装有nginx的centos容器打包为镜像docker commit ba5ba0d81912 nginx_centos(ba5ba0d81912 为容器ID,重命名为nginx_centos)
11. 重新运行新的镜像:docker run --name ver -d -p 8051:80 -it nginx_centos
12. 而此时的镜像,则是有我们安装好的nginx,我们就可以拿他开始为所欲为,做一些其他的骚操作了。

安装python2.7环境

yum install gcc openssl-devel bzip2-devel

用 wget 下载 python 2.7 并解压

yum -y install wget 

进入目录 /usr/src 再用 wget 下载 python 2.7

cd /usr/src
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz

再解压 python2.7

tar -zxvf Python-2.7.15.tgz

安装 python 2.7

进入上面解压的 Python-2.7.15 解压文件中使用下面命令行安装

cd Python-2.7.15
./configure --enable-optimizations
make altinstall

安装 PIP

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python2.7 get-pip.py

因为版本为2.7,且requirements.txt里面有一个 MYSQL-python的库,会报一个找不到libmysqlclient-dev的错,执行yum install mysql-devel即可解决。

安装UWSGI

pip install uwsgi的时候会报一个错:

plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
#include <Python.h>

运行yum install python-devel.x86_64即可解决,并重新pip install即可下载。

配置uWSGI服务器

相关uwsgi.ini文件内容如下:

[uwsgi]
socket = /tmp/uwsgi.sock
chown-socket = nginx:nginx
chmod-socket = 664
# Graceful shutdown on SIGTERM, see https://github.com/unbit/uwsgi/issues/849#issuecomment-118869386
hook-master-start = unix_signal:15 gracefully_kill_them_all

在项目目录下/app/创建uwsgi.ini文件:

[uwsgi]

uwsgi-socket = /tmp/uwsgi.sock
chmod-socket = 777
callable = app
wsgi-file = main.py
buffer-size = 65535
processes = %(%k * 2)
threads = %(%k * 20

其中每个参数的意思:

uwsgi-socket:将uwsgi-socket这个配置项指定了一个文件,这个文件是Unix套接字,即通过文件系统
(而非网络地址)进行寻址和访问的套接字。配置uwsgi-socket之后,还需要配置chmod-socket,
Unix socket是个文件,所以会受到Unix系统的权限限制,可以配置成660或者777,
使得uwsgi客户端能够访问这个Unix socket文件,这里配置为777。

callable:设置在收到请求时,uwsgi加载的模块中哪个变量将被调用,默认是名字为“application”的变量。

wsgi-file:加载指定的wsgi文件。

buffer-size:设置用于uwsgi包解析的内部缓存区大小。默认是4k。

processes和threads,分别是开启的进程数和线程数,而%k是魔数变量,代表CPU核数,如果我们是双核CPU,
那这里的processes和threads分别为4和40,即有4个进程,每个进程有40个线程。

安装Supervisor(可选)

直接yum安装会报一个No package supervisor available.的错误,那是因为CentOS是RedHat企业版编译过来的,去掉了所有关于版权问题的东西。只需要执行yum install epel-release即可解决。安装好后会生成如下目录:

现在我们将配置supervisor,使得supervisor监听nginx和uwsgi服务。

首先在/etc目录下创建supervisor文件,然后创建supervisord.conf文件和conf.d目录:

supervisord.conf目录配置如下:

; supervisor config file

[unix_http_server]
file=/var/run/supervisor/supervisor.sock  ; (the path to the socket file)
chmod=0700            ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor      ; ('AUTO' child log dir, default $TEMP)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket

; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf

再在conf.d目录下创建supervisord.conf文件并编辑:

[supervisord]
nodaemon=true

[program:uwsgi]
command=/usr/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term --need-app
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=/usr/local/nginx/sbin/nginx
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
# Graceful stop, see http://nginx.org/en/docs/control.html
stopsignal=QUIT

以上路径均为实际目录配置,如果有不一样则需要更改。

然后将supervisor启动:

以上配置弄好后,我们将容器重新打包生成一个新的镜像,记为base_v3,我们写一个打包docker应用的Dockerfile:

FROM base_v3

# 创建工作路径
RUN mkdir /app

# 指定容器启动时执行的命令都在app目录下执行
WORKDIR /app

# 替换nginx的配置
COPY nginx.conf /etc/nginx/nginx.conf

# 将本地app目录下的内容拷贝到容器的app目录下
COPY ./app/ /app/

这里,在Dockerfile和app同级目录下,再建立一个nginx.conf文件,并将nginx.conf内容修改如下:

user nginx;
worker_processes 1;
error_log /usr/local/nginx/logs/error.log warn;
pid    /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 20480;

events {
 use epoll;
 worker_connections 20480;
 multi_accept on;
}

http {
  include    /usr/local/nginx/conf/mime.types;
  default_type application/octet-stream;

  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"';
  #请求量级大建议关闭acccess_log
  #access_log /var/log/nginx/access.log main;

  sendfile    on;
  #tcp_nopush   on;

  keepalive_timeout 300s;
  client_header_timeout 300s;
  client_body_timeout 300s;

  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_types text/html application/javascript application/json;

  include /usr/local/nginx/conf.d/*.conf;

  server {
   listen 6666;
   charset utf-8;
   client_max_body_size 75M;
   location / {
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;
    uwsgi_send_timeout 300;
    uwsgi_connect_timeout 300;
    uwsgi_read_timeout 300;
   }
  }
}

接下来只需要docker build -t new_project .docker run --name test -d -p 8055:6666 -v /root/web/mim_backend/data:/app/static -v /root/logs/mim_backend:/app/log -it new_project即可。
当然,这个时候进去nginx和uwsgi没有自动启动,需要手动拉起来,如想自动拉起服务,可选用supervisor或者在dockerfile里面加一个ENTRYPOINT nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.ini

然后随便跑一个接口测试:

到此这篇关于Docker构建python Flask+ nginx+uwsgi容器的文章就介绍到这了,更多相关Docker构建Flask+ nginx+uwsgi内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • win7环境下Docker快速构建及阿里云容器加速配置详解

    上篇Docker中提到的是MAC系统中的构建,本篇会简单介绍win7中Docker的构建和加速. 下载之前的步骤本文中不再重提,直接去Docker官网中下载win7版本进行安装,安装完成之后系统会多了三个启动包, 1."Kitematic (Alpha)" Docker服务管理器及更新检查器 Kitematic (Alpha)启动后就是上图的界面,用于管理Docker服务和版本更新等工作.纯视图工作端,可以进行对Docker进行服务重启等. 2."Docker Quickst

  • Docker构建python Flask+ nginx+uwsgi容器

    安装Nginx 首先拉下centos镜像docker pull centos 我们安装最新的nginx1.19版本:下载地址 将centos镜像运行起来并进入: docker run --name ver -d -p 8051:80 -it nginx_start 将nginx-1.19.0.tar.gz这个包放入容器里面: docker cp nginx-1.19.0.tar.gz 10e87af84c05:/root(10e87af84c05为centos容器id) 安装nginx前先装一些

  • VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解

    本文实例讲述了VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法.分享给大家供大家参考,具体如下: 昨天试用了VPS,花了一天部署了一个简单应用.在下面的过程中省去了用django 创建project的一步,忘记了你自己一用startporject 创建. 下面是原来边操作,边记录的东西,我习惯文本编辑.可能格式不好看.现在搬到博客中来. 首先安装GCC. yum -y install gcc automake autoconf libtool ma

  • 在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程

    最近尝试把项目迁移到Python环境下,特别新装了一台干净的Debian系统,准备重新配置环境,上网找了一些运行Python Web的环境方案,最后敲定Nginx+uWSGI组合,Nginx用得比较多,熟练些:uWSGI据说性能不错,想尝试一下. 网上大部分教程都是要求到uWSGI官方网站下载源码包,然后通过编译的方式安装,比如对于一台新Debian系统,可以通过下面的命令安装: apt-get update apt-get upgrade apt-get install build-essen

  • 详解python使用Nginx和uWSGI来运行Python应用

    uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能.它支持WSGI协议,同时它也支持自有的uWSGI协议,该协议据说性能非常高,而且内存占用率低,为mod_wsgi的一半左右,我没有实测过.它还支持多应用的管理及应用的性能监控.虽然uWSGI本身就可以直接用来当Web服务器,但一般建议将其作为应用服务器配合Nginx一起使用,这样可以更好的发挥Nginx在Web端的强大功能.本文我们就来介绍如何搭建uWSGI+Ngnix环境来运行Python应用. 安装uWSGI

  • 关于nginx+uWsgi配置遇到的问题的解决

    uWSGI 是在像 nginx . lighttpd 以及 cherokee 服务器上的一个部署的选择.更多选择见 FastCGI 和 独立 WSGI 容器 . 你会首先需要一个 uWSGI 服务器来用 uWSGI 协议来使用你的 WSGI 应用. uWSGI 是一个协议,同样也是一个应用服务器,可以提供 uWSGI .FastCGI 和 HTTP 协议. 1.使uwsgi服务器响应代码大于或等于300的响应重定向到nginx以使用error_page指令进行处理 uwsgi_intercept

  • 使用Docker搭建Django,Nginx,R,Python部署环境的方法

    本文介绍了使用Docker搭建Django,Nginx,R,Python部署环境的方法,分享给大家,具体如下: 基本环境: Ubuntu 16.10 docker 17.06.0-ce 压缩自己的项目文件 1.这里需要注意的是,在压缩的时候,也需要把自己的需要的Python包写在requirement.txt,这样搭建环境的时候才会知道你需要什么包,才能一起安装,我的项目的requirement.txt 内容如下. Django==1.10.5 rpy2==2.8.5 PyMySQL==0.7.

  • Dockerfile构建一个Python Flask 镜像

    目录 1.Python 程序 2.Dockerfile 3.开始构建一个小的demo 1.Python 程序 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world():     return 'Hello, World!'   2.Dockerfile FROM python:3.9.5-slim COPY app.py /src/app.py RUN pip install flask WOR

  • Python开发之Nginx+uWSGI+virtualenv多项目部署教程

    1.新建独立运行环境,命名为env [root@vultr ~]# mkdir projects # 测试的项目总目录 [root@vultr ~]# pip3 install virtualenv [root@vultr ~]# cd projects [root@vultr projects]# virtualenv env --python=python3 --no-site-packages --python:指定Python版本 --no-site-packages:不复制系统已安装P

  • 在Docker构建的容器中实现安装ping工具

    因为用Docker拉取的Base镜像如Centos和Ubuntu的话都是最简版本,不包含Ping工具,而对Docker进行Docker network和Docker链接操作时往往要用到Ping工具测试两个容器间的网络,此时就要用到Ping工具了, 下面是Ubuntu下安装Ping工具的命令: sudo apt-get update && apt-get install iputils-ping 补充知识:standard_init_linux.go:211: exec user proce

  • 使用Docker开发python Web 应用

    本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法.虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序).Docker通过封装依赖项,大大减少了开发环境和正式产品的差距. 大多数Python开发人员在开发中使用virtualenv.它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同

随机推荐