#網(wǎng)絡(luò)后臺(tái)開發(fā)#Docker
-Start:關(guān)注本公眾號(hào)后,可直接聯(lián)系后臺(tái)獲取排版美化的詳細(xì)文檔!
-Hints:本篇文章所編纂的資料均來自網(wǎng)絡(luò),特此感謝參與奉獻(xiàn)的有關(guān)人員。
項(xiàng)目移植
-代碼移植的問題
運(yùn)行平臺(tái)的特異性,操作系統(tǒng)的設(shè)置,各種庫和組件的安裝會(huì)影響軟件的運(yùn)行。
?-代碼移植的方法
1 虛擬機(jī):可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng)
缺陷:
1 資源占用多
2 冗余步驟多
3 啟動(dòng)慢
2 Linux容器:Linux 容器不是模擬一個(gè)完整的操作系統(tǒng),而是對(duì)進(jìn)程進(jìn)行隔離。對(duì)于容器里面的進(jìn)程來說,它接觸到的各種資源都是虛擬的,從而實(shí)現(xiàn)與底層系統(tǒng)的隔離。
優(yōu)勢(shì):
1 啟動(dòng)快
2 資源占用少
3 體積小
?
Docker
Docker 將應(yīng)用程序與該程序的依賴,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件,就會(huì)生成一個(gè)虛擬容器。程序在這個(gè)虛擬容器里運(yùn)行,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣。
-用途:
(1)提供一次性的環(huán)境。比如,本地測(cè)試他人的軟件、持續(xù)集成的時(shí)候提供單元測(cè)試和構(gòu)建的環(huán)境。
(2)提供彈性的云服務(wù)。因?yàn)镈ocker 容器可以隨開隨關(guān),很適合動(dòng)態(tài)擴(kuò)容和縮容。
(3)組建微服務(wù)架構(gòu)。通過多個(gè)容器,一臺(tái)機(jī)器可以跑多個(gè)服務(wù),因此在本機(jī)就可以模擬出微服務(wù)架構(gòu)。
-類型:
鏡像是容器啟動(dòng)的基礎(chǔ),它包含了容器運(yùn)行所需的所有基本文件和配置信息,通俗地說,就是只讀文件和文件夾的組合。 在docker里,一切都是以鏡像為基礎(chǔ)的,鏡像是Docker容器啟動(dòng)的先決條件。
在 Docker 運(yùn)行容器之前,本地需要存在對(duì)應(yīng)的鏡像。 如果本地沒有對(duì)應(yīng)的鏡像,Docker會(huì)嘗試從默認(rèn)鏡像倉(cāng)庫下載。
?-指令
#查看拉取的鏡像
docker images
#查看docker正在運(yùn)行的實(shí)例
docker ps
#查看docker所有的實(shí)例
docker ps -a
#關(guān)閉docker容器
docker stop DockerName
#刪除docker容器
docker rm DockerName
#刪除docker鏡像
Docker rmi DockerName:Version
-資料
https://blog.csdn.net/qq_44045338/article/details/115243567
https://www.imooc.com/article/317550
Docker部署過程

-資料
https://www.jb51.net/article/182504.htm
Dockerfile
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用基于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。
1、對(duì)于開發(fā)人員,可以為開發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開發(fā)環(huán)境。
2、對(duì)于測(cè)試人員,可以直接拿開發(fā)時(shí)所構(gòu)建的鏡像或者通過Dockerfile文件構(gòu)建一個(gè)新的鏡像開始工作
3、對(duì)于運(yùn)維人員,在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無縫移植。
-示例
在項(xiàng)目根目錄創(chuàng)建Dockerfile文件
FROM python:3.4
WORKDIR /code
COPY requirements.txt ./
RUN pip install -r requirements.txt
#由于我們需要運(yùn)行容器的時(shí)候,直接映射目錄,所以不需要把a(bǔ)pp代碼復(fù)制到容器中
#COPY . .
CMD ["gunicorn", "myapp:app","-c", "./gunicorn.conf"]
-說明
FROM 基礎(chǔ)包
WORKDIR工作目錄
COPY復(fù)制文件
RUN 創(chuàng)建鏡像時(shí)(docker build)執(zhí)行的命令,把一些依賴打包到鏡像中,多個(gè)命令可以&&連接
CMD 啟動(dòng)容器時(shí)(docker run)執(zhí)行的命令ps:由于我們需要運(yùn)行容器的時(shí)候,直接映射目錄,所以不需要把a(bǔ)pp代碼復(fù)制到容器中,注釋掉COPY. .
-資料
https://www.jianshu.com/p/c82c0f3681c4
https://cloud.tencent.com/developer/article/1595634
https://www.jianshu.com/p/eb4064392b3e
參考范例
-參考范例-基于鏡像python:3.7
###宿主:關(guān)閉防火墻
#開機(jī)不啟動(dòng)防火墻
systemctl disable firewalld
#關(guān)閉防火墻???
systemctl stop firewalld?
?
###宿主:安裝docker
yum install -y yum-utilsdevice-mapper-persistent-data lvm2
yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce-19.03.9docker-compose
?
### docker配置啟動(dòng)
#啟動(dòng)docker服務(wù)
systemctl start docker
#設(shè)置docker開機(jī)啟動(dòng)
systemctl enable docker
#查看docker服務(wù)狀態(tài)
systemctl status docker.service
#啟動(dòng)docker服務(wù)
service docker start
?
###宿主:創(chuàng)建Flask項(xiàng)目
#創(chuàng)建項(xiàng)目路徑
mkdir flasktest
#進(jìn)入項(xiàng)目路徑
cd flasktest
#創(chuàng)建Flask項(xiàng)目
vi app.py
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
???return 'Hello, World!'
if __name__ == "__main__":
???app.run()
?
###創(chuàng)建gunicorn配置文件
vi gun.conf
bind = '0.0.0.0:8001'
backlog = 512
timeout = 30
worker_class = 'gevent'
workers = 4
threads = 8
loglevel = 'info'
accesslog = "gunicorn_access.log"
errorlog = "gunicorn_error.log"
reload=True
?
###創(chuàng)建Dockerfile
vi Dockerfile
FROM python:3.7
MAINTAINER "xx
ENV PIPURL"https://repo.huaweicloud.com/repository/pypi/simple"
WORKDIR /flasktest
COPY . .
RUN pip --no-cache-dir install? -i ${PIPURL} --upgrade pip
RUN pip --no-cache-dir install? -i ${PIPURL} gunicorn flask gevent
CMD gunicorn? -c gun.conf app:app
?
###創(chuàng)建Docker鏡像
#構(gòu)建docker鏡像
docker build . -t=flask-test:latest
#查看docker鏡像
docker images
#運(yùn)行docker鏡像
docker run -it -p 80:8001--name="flask-test" -d flask-test
?
###打包和遷移Docker鏡像
#將docker鏡像導(dǎo)出為靜態(tài)文件
docker save flask-test:latest >flask-test.tar
#其他目標(biāo)服務(wù)器:將靜態(tài)文件還原為鏡像,并導(dǎo)入docker
docker load < flask-test.tar
#其他目標(biāo)服務(wù)器:運(yùn)行docker鏡像
docker run -it -p 80:8001--name="flask-test" -d flask-test
?
詳細(xì)資料:
https://blog.csdn.net/mighty13/article/details/121586507
https://blog.csdn.net/EndTheme_Xin/article/details/90519975
https://blog.csdn.net/a1017938493/article/details/116211930
?
-參考范例-基于鏡像centos:7
###宿主主機(jī):關(guān)閉防火墻
# 開機(jī)不啟動(dòng)防火墻
systemctl disable firewalld
# 關(guān)閉防火墻???
systemctl stop firewalld???
?
###宿主主機(jī):安裝docker
yum install -y docker
#啟動(dòng)docker服務(wù)
systemctl start docker
#設(shè)置docker開機(jī)啟動(dòng)
systemctl enable docker
#查看docker服務(wù)狀態(tài)
systemctl status docker.service
?
###宿主主機(jī):拉取docker鏡像
#拉去最新版本的centos鏡像:docker里的centos是精簡(jiǎn)版的,docker里的系統(tǒng)鏡像還有編程語言鏡像是打包鏡像的時(shí)候用的基礎(chǔ)鏡像,不自己打包鏡像用不到,單獨(dú)啟動(dòng)這類鏡像會(huì)直接結(jié)束。
docker pull centos:7
#查看本地docker鏡像
docker images
?
###docker容器:配置環(huán)境
#運(yùn)行docker centos鏡像
#-d:讓容器在后臺(tái)運(yùn)行。
#--name:對(duì)容器的命名
#-P:將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上。
#-t:在新容器內(nèi)指定一個(gè)偽終端或終端。
#-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入(STDIN) 進(jìn)行交互。
#-p:綁定指定端口,-p指定要映射的端口,一個(gè)指定端口上只可以綁定一個(gè)容器,一個(gè)容器可以有多個(gè)指定端口;支持的格式如下:IP:HOSTPORT:CONTAINERPORT:指定ip、指定宿主機(jī)port、指定容器port
docker run -itd -p 8000:8000 --name centoscentos:7
###進(jìn)入docker容器
docker attach centos
#安裝 python依賴包
yum -y group install "Developmenttools"
yum -y install zlib-devel bzip2-developenssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-develdb4-devel libpcap-devel xz-devel libffi-devel
#下載安裝wget
yum -y install wget
yum -y install setup
yum -y install perl
#下載python安裝包
wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
#解壓縮
tar -xvJf Python-3.7.6.tar.xz
#安裝
#第一個(gè)指定安裝的路徑,不指定的話,安裝過程中可能軟件所需要的文件復(fù)制到其他不同目錄,刪除軟件很不方便,復(fù)制軟件也不方便. #第二個(gè)可以提高python10%-20%代碼運(yùn)行速度. #第三個(gè)是為了安裝pip需要用到ssl,后面報(bào)錯(cuò)會(huì)有提到.
cd Python-3.7.6
./configure --prefix=/usr/local/python3--enable-optimizations --with-ssl
make && make install
#安裝which
yum install which
#查看python 可執(zhí)行文件的位置: /usr/bin/python
which python
#進(jìn)行python版本備份
mv /usr/bin/python /usr/bin/python.bak
#確認(rèn)目錄下/usr/local/目錄下就會(huì)有python3了。
ls /usr/local/python3/bin/
#創(chuàng)建軟鏈接
ln -s /usr/local/python3/bin/python3/usr/bin/python
ln -s /usr/local/python3/bin/pip3/usr/bin/pip
ln -s /usr/local/python3/bin/gunicorn/usr/bin/gunicorn
#查看版本
python -V
python2 -V
#查看pip 版本
pip -V
#安裝flask模塊
pip install flask
#安裝gunicorn +gevent
pip install gunicorn gevent
#編輯gunicorn配置文件
vi /gunicorn.conf
workers = 5??? # 定義同時(shí)開啟的處理請(qǐng)求的進(jìn)程數(shù)量,根據(jù)網(wǎng)站流量適當(dāng)調(diào)整
worker_class = "gevent"?? # 采用gevent庫,支持異步處理請(qǐng)求,提高吞吐量
bind = "0.0.0.0:8000"
###退出docker
exit
?
###創(chuàng)建Flask項(xiàng)目
#將宿主文件拷貝到容器文件
docker cp /home/app.py? centos:/
#重啟docker容器
docker restart centos
#獲取docker容器信息
docker ps -a
#進(jìn)入容器-方式1
docker attach ContainerId
#進(jìn)入容器-方式2
docker exec -it centos bash
#測(cè)試gunicorn geventflask
gunicorn app:app -c gunicorn.conf
#退出docker
exit
#重啟docker
docker restart centos
?
###創(chuàng)建項(xiàng)目鏡像
#基于容器的鏡像保存
docker commit DockerName NewDockerName
#鏡像備份
docker save -o NewDockerName.tarNewDockerName
#其他目標(biāo)服務(wù)器:鏡像恢復(fù)與遷移
docker load -i NewDockerName.tar
?
#關(guān)閉容器
docker stop DockerName
#刪除容器
docker rm DockerName
#刪除鏡像
docker rmi DockerName:Version
?
詳細(xì)資料:
https://blog.csdn.net/u011089760/article/details/90681807
https://cloud.tencent.com/developer/article/1595634
?
關(guān)鍵組件
-WSGI服務(wù)器
Web Server Gateway Interface 的縮寫,即 Web 服務(wù)器網(wǎng)關(guān)接口。Python web開發(fā)中,服務(wù)端程序分為兩個(gè)部分
服務(wù)器程序:用來接收、整理客戶端發(fā)送的請(qǐng)求,比如Nginx
應(yīng)用程序:處理服務(wù)器程序傳遞過來的請(qǐng)求,比如Flask,Django,Tornado
-Gunicorn
在開發(fā)時(shí)flask的run命令可以直接啟動(dòng)提供web服務(wù),實(shí)際上是由Werkzeug提供的WSGI服務(wù)器,相當(dāng)于Flask內(nèi)置了一個(gè)WSGI服務(wù)器,只適合在開發(fā)調(diào)試的時(shí)候使用;在生產(chǎn)環(huán)境中需要一個(gè)更強(qiáng)健,性能更高的WSGI服務(wù)器,WSGI服務(wù)器也被稱為獨(dú)立的WSGI容器,主流的WSGI容器有Gunicorn和uWSGI
-Nginx
Nginx是Web服務(wù)器,流行的Web服務(wù)器還有Apache,Tengine等,Web服務(wù)器主要負(fù)責(zé)和客戶端交換數(shù)據(jù),處理請(qǐng)求和響應(yīng),像Gunicorn這類WSGI服務(wù)器內(nèi)置了Web服務(wù)器,但是內(nèi)置的Web服務(wù)器不夠強(qiáng)健,更流行的部署方式是采用一個(gè)常規(guī)的Web服務(wù)器運(yùn)行在前端,為WSGI服務(wù)器提供反向代理。在Gunicorn之后再加一層Nginx有以下好處:
負(fù)載均衡: 當(dāng)有多個(gè)應(yīng)用多臺(tái)機(jī)器時(shí)需要做負(fù)載均衡
靜態(tài)文件處理:經(jīng)過配置之后,Nginx可以直接處理靜態(tài)文件請(qǐng)求而不用經(jīng)過Python服務(wù)器,Gunicorn或者Flask等對(duì)靜態(tài)資源的處理效率不如Nginx,并且Nginx可以對(duì)靜態(tài)文件設(shè)置緩存
安全問題:Gunicorn暴露在公網(wǎng)公網(wǎng)十分危險(xiǎn),在Nginx擋在前面會(huì)安全不少
抗并發(fā)壓力:前端多一層Nginx,可以吸收一些瞬時(shí)的并發(fā)請(qǐng)求作為請(qǐng)求緩沖,讓Nginx先保持住連接,然后后端慢慢消化
支持的http協(xié)議更廣:gunicorn的http解析可能有bug,Nginx處理更好
提供其他額外功能:比如IP過濾等
-gevent
gevent:是一個(gè)基于協(xié)程的python網(wǎng)絡(luò)庫,在遇到IO阻塞時(shí),程序會(huì)自動(dòng)進(jìn)行切換,可以讓開發(fā)者用同步的方式寫異步IO代碼。
協(xié)程:是單線程下的并發(fā),又稱微線程,是一種并發(fā)編程模式,協(xié)程并發(fā)的本質(zhì)是切換+保存狀態(tài)。
?
參考資料
https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://www.cnblogs.com/wholj/p/10551999.html
https://www.zhihu.com/question/402716284
https://blog.csdn.net/u011089760/article/details/90681807
https://www.csdn.net/tags/NtzaMgysODc3MC1ibG9n.html
https://www.imooc.com/article/317550
https://blog.csdn.net/qq_39146974/article/details/107715964
Centos7 安裝Python3.6+Nginx+Gunicorn+Flask
https://www.58jb.com/html/175.html
https://blog.csdn.net/make_progress/article/details/107210315
Flask服務(wù)器部署:使用Docker+Gunicorn+gevent+Nginx部署Flask應(yīng)用
https://www.jianshu.com/p/df77fe3bea24
Centos 7 Docker容器運(yùn)行RabbitMQ出現(xiàn)WARNING: IPv4 forwarding is disabled. Networking will not work.
https://blog.csdn.net/qq_44241551/article/details/104574538
公眾號(hào)二維碼
End:如果有興趣了解量化交易、數(shù)據(jù)分析和互聯(lián)網(wǎng)+的實(shí)用技術(shù),歡迎關(guān)注本公眾號(hào)
