使用docker部署flask项目
前言
本次部署是把2個項目、mysql、redis、uwsgi封裝在一個容器中,ngnix封裝在一個容器中
實際應用中最好是:
- 項目和uwsgi封裝在一個容器中
- mysql單獨封裝,可能還要讀寫分離,主從同步等
- redis單獨封裝,可能還要讀寫分離,主從同步等
- ngnix單獨封裝
這樣才能方便以后增加服務器以提升性能
部署流程主要如下:
1、安裝docker,自己找度娘要教程
2、拉取centos7的鏡像到本地
3、啟動容器,并進入容器
4、拷貝項目代碼、數(shù)據(jù)庫備份文件、環(huán)境包requirements.txt到容器中
5、在容器中安裝mysql,并且創(chuàng)建數(shù)據(jù)庫,恢復備份文件
6、安裝redis
7、搭建項目需要運行的環(huán)境
8、修改程序的相關配置
9、安裝uwsgi并啟動
10、新啟動一個centos7容器安裝ngnix,并配置好
11、提交保存鏡像
一、拉取centos鏡像到本地
docker pull centos- 1
注:鏡像直接到https://hub.docker.com/搜索
二、啟動容器
docker run -d -it --privileged -p 805:80 -p 5002:5000 -p 8001:8000 -p 10027:22 -p 20002:3306 --name centos-iqiyi -e LANG=zh_CN.utf8 centos /usr/sbin/init- 1
說明:
-
–privileged /usr/sbin/init 這兩行主要解決容器中使用systemctl去啟動服務時出現(xiàn)D_Bus錯誤的問題
-
-d: 后臺運行
-
-it: 組合使用,創(chuàng)建一個偽終端
-
-p: 端口映射,本機端口:容器端口
-
–name: 容器名,(需要注意命名規(guī)范,可自己定義 ,only [a-zA-Z0-9][a-zA-Z0-9_.-])
-
-e:防止亂碼,編碼格式
-
-p 20002:3306 是給mysql數(shù)據(jù)庫的,如果需要外界訪問mysql數(shù)據(jù)庫,就映射端口,否則不需要,這里就沒有映射redis數(shù)據(jù)庫的端口,因為外界不需要訪問
-
最后跟上下載下來的鏡像名
docker常用命令:
# 查看當前docker 中哪些容器正在運行 docker ps # 查看當前docker 中哪些容器正在運行 包括已經(jīng)終止的 docker ps -a # 第一次初始化啟動的時候,使用run,后來都是用start docker start id # 啟動后,再次進入: docker exec -it id /bin/bash # 重啟 docker restart id # 停止 docker stop id # 刪除 注意:刪除前需要停止鏡像 docker rm id- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
進入容器
docker exec -it 7ed9c6fbf986 /bin/bash- 1
三、拷貝項目壓縮包到容器中
sudo docker cp /Users/liheng/Desktop/iqiyi.zip 7ed9c6fbf986:/ # /Users/liheng/Desktop/iqiyi.zip:本地文件目錄 # 7ed9c6fbf986:容器id # /:拷貝到根目錄- 1
- 2
- 3
- 4
-
從主機復制到容器sudo docker cp host_path containerID:container_path
-
從容器復制到主機sudo docker cp containerID:container_path host_path
四、解壓縮項目壓縮包
1、安裝支持ZIP的工具
yum install -y unzip zip- 1
2、解壓iqiyi.zip
unzip iqiyi.zip- 1
注:壓縮一個zip文件的方法:zip 文件名.zip 文件夾名稱或文件名稱
3、解壓縮后發(fā)現(xiàn)中文亂碼,分別執(zhí)行以下三個命令
yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 export LC_ALL=zh_CN.utf8- 1
- 2
- 3
- 2個項目解壓縮后的路徑如下
- /iqiyi/愛奇藝電影/愛奇藝電影.py
- /iqiyi/iqiyi_backstage/iqiyi_backstage.py
五、安裝mysql
依次執(zhí)行以下語句:
yum install -y wget wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum install -y mysql-server systemctl start mysqld.service systemctl status mysqld.service- 1
- 2
- 3
- 4
- 5
- 6
查看root原始密碼:
grep "password" /var/log/mysqld.log # 如果以上語句無法查看,則打開mysqld.log,直接搜索password查看密碼- 1
- 2
- 紅色框部分即為原始密碼
修改root密碼
獲得初始密碼后,第一件事就是要重新設置root密碼,否則什么事情也做不了,因為MySQL強制要求必須重新設置root密碼。
mysql -uroot -p # 輸入原始密碼- 1
- 2
修改外部訪問權限
mysql>use mysql;
mysql>update user set host = ‘%’ where user = ‘root’;
mysql>select host, user from user;
mysql>exit
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 修改sql_mode模式
# 在[mysqld]下面添加:
sql_mode=""
# 重啟
systemctl restart mysqld.service
- 1
- 2
- 3
- 4
- 5
- 6
- 7
六、導入數(shù)據(jù)庫
上傳moviespider.sql_.zip到/iqiyi/ 目錄下
sudo docker cp /Users/liheng/Downloads/moviespider.sql_.zip 7ed9c6fbf986:/iqiyi- 1
解壓
unzip moviespider.sql_.zip- 1
use iqiyi
# 導入數(shù)據(jù)
source /iqiyi/moviespider.sql
- 1
- 2
- 3
- 4
- 5
- 6
七、安裝redis
參考鏈接:https://www.cnblogs.com/zuidongfeng/p/8032505.html
注:下載redis時,下載在/usr/local目錄下,然后解壓安裝
八、環(huán)境搭建
1、安裝python3
- 安裝方法參考:https://www.cnblogs.com/JahanGu/p/7452527.html
2、安裝pip3
- 安裝相關依賴
- 1
- 2
- 安裝setuptools
tar -zxvf setuptools-19.6.tar.gz
cd setuptools-19.6
sudo python setup.py build
sudo python setup.py install
- 1
- 2
- 3
- 4
- 5
- 6
- 安裝pip
tar -zxvf pip-8.0.2.tar.gz
cd pip-8.0.2
python setup.py build
sudo python setup.py install
- 1
- 2
- 3
- 4
- 5
- 6
- 建立軟連接
- 1
3、導入環(huán)境包requirements.txt
先拷貝requirements.txt到容器內的iqiyi文件夾,方法同上面拷貝文件的方法
cd /iqiyi pip3 install -r requirements.txt- 1
- 2
發(fā)現(xiàn)報錯:
Flask-MySQLdb0.2.0 mysqlclient1.3.14 刪除掉以上這2個,才能正確導入
九、修改程序配置
在2個程序中,分別修改config.py中的數(shù)據(jù)庫用戶名密碼,因為你在你電腦上安裝的和在服務器上面的密碼是不一致的
然后在程序入口修改app.run(),需要添加host和prot這2個內容,才能指定啟動和外網(wǎng)訪問
app.run(host=‘0.0.0.0’,prot=8000)
至于設置哪個端口,要看當前這個docker開放了什么映射端口,并且無占用才可以
十、安裝uwsgi并進行配置
- 安裝
# 注意!安裝后使用uwsgi命令會顯示無此命令,此時需要建立軟連接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
- 1
- 2
- 3
- 4
-
在iqiyi文件夾創(chuàng)建一個flaskconfig文件夾,所有項目的配置文件全在這里面
創(chuàng)建iqiyi.ini的配置文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
? 創(chuàng)建iqiyi_backstage.ini的配置文件
[uwsgi] #uwisi啟動程序所使用的地址和端口 http=0.0.0.0:8000 #記錄pid,方便停止和重啟服務 pidfile=/tmp/uwsgi.pid #項目所在路徑 chdir=/iqiyi/iqiyi_backstage/ #flask程序啟動文件 wsgi-file=iqiyi_backstage.py #使用主進程 master=true #多站點 vhost=true #flask里面啟動Application變量名 callable=app #進程數(shù) processes=4 #線程數(shù) threads=2 manage-script-name = true touch-reload = /iqiyi/iqiyi_backstage/- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
? 編寫一下停止uwsgi的腳本stop.sh,如果不用停止腳本,就要一個個的查殺進程,很麻煩
#!/bin/sh NAME="uwsgi" if [ ! -n "$NAME" ];thenecho "no arguments"exit; fiecho NAME</span>ID<spanclass="tokenoperator">=</span><spanclass="tokenvariable"><spanclass="tokenvariable">‘</span><spanclass="tokenfunction">ps</span>?ef<spanclass="tokenoperator">∣</span><spanclass="tokenfunction">grep</span><spanclass="tokenstring">"<spanclass="tokenvariable">NAME</span> ID<span class="token operator">=</span><span class="token variable"><span class="token variable">`</span><span class="token function">ps</span> -ef <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"<span class="token variable">NAME</span>ID<spanclass="tokenoperator">=</span><spanclass="tokenvariable"><spanclass="tokenvariable">‘</span><spanclass="tokenfunction">ps</span>?ef<spanclass="tokenoperator">∣</span><spanclass="tokenfunction">grep</span><spanclass="tokenstring">"<spanclass="tokenvariable">NAME" | grep -v “$0” | grep -v “grep” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 9: 2</span>}?'</span><span c…ID
echo “#############殺死已存在進程#####################”
for id in ID</span><spanclass="tokenkeyword">do</span><spanclass="tokenfunction">kill</span>?9<spanclass="tokenvariable">ID</span> <span class="token keyword">do</span> <span class="token function">kill</span> -9 <span class="token variable">ID</span><spanclass="tokenkeyword">do</span><spanclass="tokenfunction">kill</span>?9<spanclass="tokenvariable">id
echo “kill $id”
done
echo “#############################################”
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
對stop.sh進行賦值權限
chmod 777 stop.sh- 1
十一、啟動uwsgi
# 使用uwsgi的Emperor —— 多應用部署 uwsgi --emperor /iqiyi/flaskconfig/ -d my.log# 也可以每個應用依次啟動,依次啟動時可以再ini配置文件中配置log文件,參考美多商城部署
uwsgi --ini /iqiyi/flaskconfig/iqiyi_backstage.ini
uwsgi --ini /iqiyi/flaskconfig/iqiyi.ini
- 1
- 2
- 3
- 4
- 5
- 6
十二、配置ngnix
啟動容器
docker run -d -it --privileged -p 806:806 -p 808:808 --name centos-iqiyi-ngnix -e LANG=zh_CN.utf8 centos /usr/sbin/init- 1
進入容器
docker exec -it fcd4c8ad55dc /bin/bash- 1
安裝ngnix,參考:https://www.cnblogs.com/kaid/p/7640723.html
注:
# 在/usr/local目錄下執(zhí)行下載,否則可能無法編譯 # 使用wget命令下載前要先安裝wget yum install -y wget- 1
- 2
- 3
打開ngnix的配置文件
vi /usr/local/nginx/conf/nginx.conf- 1
修改配置文件:
······此處省略······http {
······此處省略······upstream iqiyi_backstage <span class="token punctuation">{<!-- --></span><span class="token comment"># 此處需為uwsgi服務器所在ip地址</span>server 192.168.0.107:8001<span class="token punctuation">;</span><span class="token punctuation">}</span>upstream iqiyi <span class="token punctuation">{<!-- --></span><span class="token comment"># 此處需為uwsgi服務器所在ip地址</span>server 192.168.0.107:5002<span class="token punctuation">;</span><span class="token punctuation">}</span>······此處省略······server <span class="token punctuation">{<!-- --></span>listen 808<span class="token punctuation">;</span>server_name localhost<span class="token punctuation">;</span>location / <span class="token punctuation">{<!-- --></span><span class="token comment"># 請求轉發(fā)到多個uwsgi服務器</span>proxy_pass http://iqiyi<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>server <span class="token punctuation">{<!-- --></span>listen 806<span class="token punctuation">;</span>server_name localhost<span class="token punctuation">;</span><span class="token comment">#charset koi8-r;</span><span class="token comment">#access_log logs/host.access.log main;</span>location / <span class="token punctuation">{<!-- --></span><span class="token comment">#root html;</span><span class="token comment">#index index.html index.htm;</span><span class="token comment"># 請求轉發(fā)到多個uwsgi服務器</span>proxy_pass http://iqiyi_backstage<span class="token punctuation">;</span><span class="token punctuation">}</span>······此處省略······- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
啟動ngnix
cd /usr/local/nginx/sbin ./nginx- 1
- 2
修改配置文件后重新啟動ngnix
./nginx -s reload- 1
Upstream 主要用來做負載均衡
負載均衡其實就是在upstream 當中加入多一條server信息,nginx會自動進行選擇轉發(fā),上面只加一條。
其中 location 是定義路由,如果使用location = / 是屬于精準匹配,不加 = 就相當于正則匹配 proxy_pass 轉發(fā)服務到哪里, 后面拼接一定要加上http:// 否則也是不成功的,這里要注意,縮進無所謂,能看明白就行,但語法千萬不能錯,一個單詞錯就沒法啟動了。
十三、docker提交保存鏡像
1、保存:docker commit 容器id 自定命名,保存自定義名時最好保存格式為:賬戶名/鏡像名 ,方便上傳時不需要再更改
docker commit 7ed9c6fbf986 nengliudian/centos-iqiyi-uwsgi docker commit fcd4c8ad55dc nengliudian/centos-iqiyi-ngnix- 1
- 2
2、登錄docker login
一般如果在軟件中已經(jīng)登錄,這里可以不用登錄了,可以當成驗證是否成功登錄check一下
3、如果是第一次準備上傳鏡像需要先到 hub.docker.com中登錄創(chuàng)建一個鏡像倉庫
4、上傳自定鏡像
首先查看一下本地的鏡像有哪些
docker images- 1
5、上傳鏡像
# docker push 鏡像名:tags docker push nengliudian/centos-iqiyi-ngnix:latest docker push nengliudian/centos-iqiyi-uwsgi:latest- 1
- 2
- 3
出現(xiàn)進度條,就成功了,等待就可以
十四、鏡像備份與遷移
我們可以通過save命令將鏡像打包成文件,拷貝給別人使用
- docker save -o 保存的文件名 鏡像名
- 1
在拿到鏡像文件后,可以通過load方法,將鏡像加載到本地
docker load -i ./centos-iqiyi-uwsgi.tar- 1
以后項目遷移到任何操作系統(tǒng)下通吃
原文鏈接:[https://blog.csdn.net/liudian_cz/article/details/88850773?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.channel_param](https://blog.csdn.net/liudian_cz/article/details/88850773?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.channel_param)總結
以上是生活随笔為你收集整理的使用docker部署flask项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 何使用BERT模型实现中文的文本分类
- 下一篇: 中文纠错(Chinese Spellin