Docker構(gòu)建python Flask+ nginx+uwsgi容器
安裝Nginx
首先拉下centos鏡像docker pull centos
我們安裝最新的nginx1.19版本:下載地址
將centos鏡像運(yùn)行起來并進(jìn)入:
docker run --name ver -d -p 8051:80 -it nginx_start
將nginx-1.19.0.tar.gz這個(gè)包放入容器里面:
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
#進(jìn)入到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協(xié)議了 #http_stub_status_module 狀態(tài)監(jiān)控 #http_ssl_module 配置https #stream 配置tcp得轉(zhuǎn)發(fā) #http_gzip_static_module 壓縮 #http_sub_module 替換請求 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
注:
在這里我出現(xiàn)了pcre和zlib缺失的錯(cuò),可以使用yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
命令,安裝所有依賴。
再 make & make install
進(jìn)行編譯安裝
安裝成功后,在./configure --prefix=/usr/local/nginx
指定目錄會(huì)生成四個(gè)文件,我們也只需要輸入/usr/local/nginx/sbin/nginx
來啟動(dòng)nginx服務(wù)即可。
要驗(yàn)證是否成功,可以輸入curl localhost
來查看是否啟動(dòng)成功。
生成鏡像
10. 將裝有nginx的centos容器打包為鏡像docker commit ba5ba0d81912 nginx_centos
(ba5ba0d81912 為容器ID,重命名為nginx_centos)
11. 重新運(yùn)行新的鏡像:docker run --name ver -d -p 8051:80 -it nginx_centos
12. 而此時(shí)的鏡像,則是有我們安裝好的nginx,我們就可以拿他開始為所欲為,做一些其他的騷操作了。
安裝python2.7環(huán)境
yum install gcc openssl-devel bzip2-devel
用 wget 下載 python 2.7 并解壓
yum -y install wget
進(jìn)入目錄 /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
進(jìn)入上面解壓的 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
因?yàn)榘姹緸?.7,且requirements.txt里面有一個(gè) MYSQL-python
的庫,會(huì)報(bào)一個(gè)找不到libmysqlclient-dev
的錯(cuò),執(zhí)行yum install mysql-devel
即可解決。
安裝UWSGI
pip install uwsgi
的時(shí)候會(huì)報(bào)一個(gè)錯(cuò):
plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
#include <Python.h>
運(yùn)行yum install python-devel.x86_64
即可解決,并重新pip install即可下載。
配置uWSGI服務(wù)器
相關(guān)uwsgi.ini
文件內(nèi)容如下:
[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
在項(xiàng)目目錄下/app/創(chuàng)建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
其中每個(gè)參數(shù)的意思:
uwsgi-socket:將uwsgi-socket這個(gè)配置項(xiàng)指定了一個(gè)文件,這個(gè)文件是Unix套接字,即通過文件系統(tǒng)
(而非網(wǎng)絡(luò)地址)進(jìn)行尋址和訪問的套接字。配置uwsgi-socket之后,還需要配置chmod-socket,
Unix socket是個(gè)文件,所以會(huì)受到Unix系統(tǒng)的權(quán)限限制,可以配置成660或者777,
使得uwsgi客戶端能夠訪問這個(gè)Unix socket文件,這里配置為777。
callable:設(shè)置在收到請求時(shí),uwsgi加載的模塊中哪個(gè)變量將被調(diào)用,默認(rèn)是名字為“application”的變量。
wsgi-file:加載指定的wsgi文件。
buffer-size:設(shè)置用于uwsgi包解析的內(nèi)部緩存區(qū)大小。默認(rèn)是4k。
processes和threads,分別是開啟的進(jìn)程數(shù)和線程數(shù),而%k是魔數(shù)變量,代表CPU核數(shù),如果我們是雙核CPU,
那這里的processes和threads分別為4和40,即有4個(gè)進(jìn)程,每個(gè)進(jìn)程有40個(gè)線程。
安裝Supervisor(可選)
直接yum安裝會(huì)報(bào)一個(gè)No package supervisor available.
的錯(cuò)誤,那是因?yàn)镃entOS是RedHat企業(yè)版編譯過來的,去掉了所有關(guān)于版權(quán)問題的東西。只需要執(zhí)行yum install epel-release
即可解決。安裝好后會(huì)生成如下目錄:
現(xiàn)在我們將配置supervisor,使得supervisor監(jiān)聽nginx和uwsgi服務(wù)。
首先在/etc
目錄下創(chuàng)建supervisor
文件,然后創(chuàng)建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目錄下創(chuàng)建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
以上路徑均為實(shí)際目錄配置,如果有不一樣則需要更改。
然后將supervisor啟動(dòng):
以上配置弄好后,我們將容器重新打包生成一個(gè)新的鏡像,記為base_v3
,我們寫一個(gè)打包docker應(yīng)用的Dockerfile:
FROM base_v3 # 創(chuàng)建工作路徑 RUN mkdir /app # 指定容器啟動(dòng)時(shí)執(zhí)行的命令都在app目錄下執(zhí)行 WORKDIR /app # 替換nginx的配置 COPY nginx.conf /etc/nginx/nginx.conf # 將本地app目錄下的內(nèi)容拷貝到容器的app目錄下 COPY ./app/ /app/
這里,在Dockerfile和app同級目錄下,再建立一個(gè)nginx.conf文件,并將nginx.conf內(nèi)容修改如下:
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"'; #請求量級大建議關(guān)閉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
即可。
當(dāng)然,這個(gè)時(shí)候進(jìn)去nginx和uwsgi沒有自動(dòng)啟動(dòng),需要手動(dòng)拉起來,如想自動(dòng)拉起服務(wù),可選用supervisor或者在dockerfile里面加一個(gè)ENTRYPOINT nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.ini
然后隨便跑一個(gè)接口測試:
到此這篇關(guān)于Docker構(gòu)建python Flask+ nginx+uwsgi容器的文章就介紹到這了,更多相關(guān)Docker構(gòu)建Flask+ nginx+uwsgi內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?Web開發(fā)通信協(xié)議WSGI?uWSGI?uwsgi使用對比全面介紹
- Python安裝和配置uWSGI的詳細(xì)過程
- 通過Python中的CGI接口講解什么是WSGI
- django生產(chǎn)環(huán)境搭建(uWSGI+django+nginx+python+MySQL)
- Python WSGI 規(guī)范簡介
- 淺析Python 中的 WSGI 接口和 WSGI 服務(wù)的運(yùn)行
- python web框架 django wsgi原理解析
- Python開發(fā)之Nginx+uWSGI+virtualenv多項(xiàng)目部署教程
- Python從wsgi導(dǎo)入失敗的問題解決方法
相關(guān)文章
docker安裝RocketMQ的實(shí)現(xiàn)步驟
本文主要介紹了docker安裝RocketMQ的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Docker實(shí)踐之python應(yīng)用容器化
這篇文章主要介紹了Docker實(shí)踐之python應(yīng)用容器化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06詳解Dockerfile創(chuàng)建自定義Docker鏡像以及CMD與ENTRYPOINT指令的比較
這篇文章主要介紹了詳解Dockerfile創(chuàng)建自定義Docker鏡像以及CMD與ENTRYPOINT指令的比較,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11docker部署redis報(bào)錯(cuò)內(nèi)存分配過度解決辦法
Docker很適合用于測試發(fā)布,將Docker封裝后可以直接提供給測試人員進(jìn)行運(yùn)行,不再需要測試人員與運(yùn)維、開發(fā)進(jìn)行配合,進(jìn)行環(huán)境搭建與部署,這篇文章主要給大家介紹了關(guān)于docker部署redis報(bào)錯(cuò)內(nèi)存分配過度的解決辦法,需要的朋友可以參考下2023-11-11docker compose 服務(wù)啟動(dòng)順序控制的方法
這篇文章主要介紹了docker compose 服務(wù)啟動(dòng)順序控制的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09docker對網(wǎng)絡(luò)和程序速度的影響解讀
本文通過對比分析,測試了在宿主機(jī)和Docker容器中部署Spring Boot程序的性能差異,在網(wǎng)絡(luò)延遲方面,Docker容器比宿主機(jī)慢0.1~0.2毫秒,在程序運(yùn)行速度方面,宿主機(jī)和Docker容器的平均運(yùn)行時(shí)間相近,單次運(yùn)行時(shí)間存在較大差異,無法確定Docker容器在速度上優(yōu)于宿主機(jī)2025-01-01