失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 使用docker部署flask项目

使用docker部署flask项目

时间:2021-08-21 10:50:40

相关推荐

使用docker部署flask项目

前言

本次部署是把2个项目、mysql、redis、uwsgi封装在一个容器中,ngnix封装在一个容器中

实际应用中最好是:

项目和uwsgi封装在一个容器中mysql单独封装,可能还要读写分离,主从同步等redis单独封装,可能还要读写分离,主从同步等ngnix单独封装

这样才能方便以后增加服务器以提升性能

部署流程主要如下:

1、安装docker,自己找度娘要教程

2、拉取centos7的镜像到本地

3、启动容器,并进入容器

4、拷贝项目代码、数据库备份文件、环境包requirements.txt到容器中

5、在容器中安装mysql,并且创建数据库,恢复备份文件

6、安装redis

7、搭建项目需要运行的环境

8、修改程序的相关配置

9、安装uwsgi并启动

10、新启动一个centos7容器安装ngnix,并配置好

11、提交保存镜像

一、拉取centos镜像到本地

docker pull centos1

注:镜像直接到/搜索

二、启动容器

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/init1

说明:

–privileged /usr/sbin/init 这两行主要解决容器中使用systemctl去启动服务时出现D_Bus错误的问题

-d: 后台运行

-it: 组合使用,创建一个伪终端

-p: 端口映射,本机端口:容器端口

–name: 容器名,(需要注意命名规范,可自己定义 ,only [a-zA-Z0-9][a-zA-Z0-9_.-])

-e:防止乱码,编码格式

-p 20002:3306 是给mysql数据库的,如果需要外界访问mysql数据库,就映射端口,否则不需要,这里就没有映射redis数据库的端口,因为外界不需要访问

最后跟上下载下来的镜像名

docker常用命令:

# 查看当前docker 中哪些容器正在运行docker ps# 查看当前docker 中哪些容器正在运行 包括已经终止的docker ps -a# 第一次初始化启动的时候,使用run,后来都是用startdocker start id# 启动后,再次进入:docker exec -it id /bin/bash# 重启docker restart id# 停止docker stop id# 删除 注意:删除前需要停止镜像docker rm id1234567891011121314

进入容器

docker exec -it 7ed9c6fbf986 /bin/bash1

三、拷贝项目压缩包到容器中

sudo docker cp /Users/liheng/Desktop/iqiyi.zip 7ed9c6fbf986:/ # /Users/liheng/Desktop/iqiyi.zip:本地文件目录 # 7ed9c6fbf986:容器id# /:拷贝到根目录1234

从主机复制到容器sudo docker cp host_path containerID:container_path

从容器复制到主机sudo docker cp containerID:container_path host_path

四、解压缩项目压缩包

1、安装支持ZIP的工具

yum install -y unzip zip1

2、解压iqiyi.zip

unzip iqiyi.zip1

注:压缩一个zip文件的方法:zip 文件名.zip 文件夹名称或文件名称

3、解压缩后发现中文乱码,分别执行以下三个命令

yum -y install kde-l10n-Chinese && yum -y reinstall glibc-commonlocaledef -c -f UTF-8 -i zh_CN zh_CN.utf8export LC_ALL=zh_CN.utf8123

2个项目解压缩后的路径如下 /iqiyi/爱奇艺电影/爱奇艺电影.py/iqiyi/iqiyi_backstage/iqiyi_backstage.py

五、安装mysql

依次执行以下语句:

yum install -y wgetwget -i -c /get/mysql57-community-release-el7-10.noarch.rpmyum -y install mysql57-community-release-el7-10.noarch.rpmyum install -y mysql-serversystemctl start mysqld.servicesystemctl status mysqld.service123456

查看root原始密码:

grep "password" /var/log/mysqld.log# 如果以上语句无法查看,则打开mysqld.log,直接搜索password查看密码12

红色框部分即为原始密码

修改root密码

获得初始密码后,第一件事就是要重新设置root密码,否则什么事情也做不了,因为MySQL强制要求必须重新设置root密码。

mysql -uroot -p# 输入原始密码12

# 修改密码mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; # 把MyNewPass4!修改为你要设置的新密码

修改外部访问权限

mysql>use mysql;

mysql>update user set host = ‘%’ where user = ‘root’;

mysql>select host, user from user;

mysql>exit

12345678 修改sql_mode模式

vi /etc/f

# 在[mysqld]下面添加:

sql_mode=""

# 重启

systemctl restart mysqld.service

1234567

六、导入数据库

上传moviespider.sql_.zip到/iqiyi/ 目录下

sudo docker cp /Users/liheng/Downloads/moviespider.sql_.zip 7ed9c6fbf986:/iqiyi1

解压

unzip moviespider.sql_.zip1

# 进入mysql,创建数据库:mysql> create database iqiyi charset=utf8;

use iqiyi

# 导入数据

source /iqiyi/moviespider.sql

123456

七、安装redis

参考链接:/zuidongfeng/p/8032505.html

注:下载redis时,下载在/usr/local目录下,然后解压安装

八、环境搭建

1、安装python3

安装方法参考:/JahanGu/p/7452527.html

2、安装pip3

安装相关依赖

yum install openssl-devel -y yum install zlib-devel -y12

安装setuptools

wget --no-check-certificate /packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26

tar -zxvf setuptools-19.6.tar.gz

cd setuptools-19.6

sudo python setup.py build

sudo python setup.py install

123456 安装pip

wget --no-check-certificate /packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb

tar -zxvf pip-8.0.2.tar.gz

cd pip-8.0.2

python setup.py build

sudo python setup.py install

123456 建立软连接

ln -s /usr/local/python3/bin/pip3 /usr/bin/pip31

3、导入环境包requirements.txt

先拷贝requirements.txt到容器内的iqiyi文件夹,方法同上面拷贝文件的方法

cd /iqiyipip3 install -r requirements.txt12

发现报错:

Flask-MySQLdb0.2.0 mysqlclient1.3.14 删除掉以上这2个,才能正确导入

九、修改程序配置

在2个程序中,分别修改config.py中的数据库用户名密码,因为你在你电脑上安装的和在服务器上面的密码是不一致的

然后在程序入口修改app.run(),需要添加host和prot这2个内容,才能指定启动和外网访问

app.run(host=‘0.0.0.0’,prot=8000)

至于设置哪个端口,要看当前这个docker开放了什么映射端口,并且无占用才可以

十、安装uwsgi并进行配置

安装

pip3 install uwsgi

# 注意!安装后使用uwsgi命令会显示无此命令,此时需要建立软连接

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

1234

在iqiyi文件夹创建一个flaskconfig文件夹,所有项目的配置文件全在这里面

创建iqiyi.ini的配置文件

[uwsgi]#uwisi启动程序所使用的地址和端口http=0.0.0.0:5000#记录pid,方便停止和重启服务pidfile=/tmp/uwsgi.pid#项目所在路径chdir=/iqiyi/爱奇艺电影/#flask程序启动文件wsgi-file=爱奇艺电影.py#使用主进程master=true#多站点vhost=true#flask里面启动Application变量名callable=app#进程数processes=4#线程数threads=2manage-script-name = truetouch-reload = /iqiyi/爱奇艺电影/12345678910111213141516171819

​ 创建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#进程数processes=4#线程数threads=2manage-script-name = truetouch-reload = /iqiyi/iqiyi_backstage/12345678910111213141516171819

​ 编写一下停止uwsgi的脚本stop.sh,如果不用停止脚本,就要一个个的查杀进程,很麻烦

#!/bin/shNAME="uwsgi"if [ ! -n "$NAME" ];thenecho "no arguments"exit;fi

echo 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 “#############################################”

1234567891011121314151617

对stop.sh进行赋值权限

chmod 777 stop.sh1

十一、启动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

123456

十二、配置ngnix

启动容器

docker run -d -it --privileged -p 806:806 -p 808:808 --name centos-iqiyi-ngnix -e LANG=zh_CN.utf8 centos /usr/sbin/init1

进入容器

docker exec -it fcd4c8ad55dc /bin/bash1

安装ngnix,参考:/kaid/p/7640723.html

注:

# 在/usr/local目录下执行下载,否则可能无法编译# 使用wget命令下载前要先安装wgetyum install -y wget123

打开ngnix的配置文件

vi /usr/local/nginx/conf/nginx.conf1

修改配置文件:

······此处省略······

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"># 请求转发到多个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"># 请求转发到多个uwsgi服务器</span>proxy_pass http://iqiyi_backstage<span class="token punctuation">;</span><span class="token punctuation">}</span>······此处省略······

12345678910111213141516171819222324252627282930313233343536373839404142434445

启动ngnix

cd /usr/local/nginx/sbin./nginx12

修改配置文件后重新启动ngnix

./nginx -s reload1

Upstream 主要用来做负载均衡

负载均衡其实就是在upstream 当中加入多一条server信息,nginx会自动进行选择转发,上面只加一条。

其中 location 是定义路由,如果使用location = / 是属于精准匹配,不加 = 就相当于正则匹配 proxy_pass 转发服务到哪里, 后面拼接一定要加上http:// 否则也是不成功的,这里要注意,缩进无所谓,能看明白就行,但语法千万不能错,一个单词错就没法启动了。

十三、docker提交保存镜像

1、保存:docker commit 容器id 自定命名,保存自定义名时最好保存格式为:账户名/镜像名 ,方便上传时不需要再更改

docker commit 7ed9c6fbf986 nengliudian/centos-iqiyi-uwsgidocker commit fcd4c8ad55dc nengliudian/centos-iqiyi-ngnix12

2、登录docker login

一般如果在软件中已经登录,这里可以不用登录了,可以当成验证是否成功登录check一下

3、如果是第一次准备上传镜像需要先到 中登录创建一个镜像仓库

4、上传自定镜像

首先查看一下本地的镜像有哪些

docker images1

5、上传镜像

# docker push 镜像名:tagsdocker push nengliudian/centos-iqiyi-ngnix:latestdocker push nengliudian/centos-iqiyi-uwsgi:latest123

出现进度条,就成功了,等待就可以

十四、镜像备份与迁移

我们可以通过save命令将镜像打包成文件,拷贝给别人使用

docker save -o 保存的文件名 镜像名

docker save -o ./centos-iqiyi-uwsgi.tar nengliudian/centos-iqiyi-uwsgi1

在拿到镜像文件后,可以通过load方法,将镜像加载到本地

docker load -i ./centos-iqiyi-uwsgi.tar1

以后项目迁移到任何操作系统下通吃

原文链接:[/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](/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项目》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。